c语言编程笔录

首页 >   > 笔记大全

笔记大全

Golang如何实现AES对称加密算法

更新时间:2023-11-07

第一段:概述AES对称加密算法

AES是一种可靠的对称加密算法,它被广泛用于数据加密。它的全称是高级加密标准(Advanced Encryption Standard),它已被国际标准化组织(ISO/IEC)认可为国际加密标准。

AES的工作模式分类如下:

  • 电码本模式(ECB):加密时将明文分割为大小相同的区块,每个区块之间相互独立,加密解密速度快,但是存在明文结构不变的情况下,密文相同的问题。
  • 密码分组链接模式(CBC):每个区块加密时,使用上一个区块的密文进行异或,增加了密文的随机性,解决了ECB模式的问题。
  • 密文反馈模式(CFB):将前一个加密块的密文作为输入,在加密后与明文异或,每个密文块之间都相互依赖。
  • 输出反馈模式(OFB):OFB模式将前一段密文块作为输入。对第一个IV(初始向量)做加密运算,得到第一个密文块,然后调用前一段密文块来做解密运算,得到IV,再把IV再去做加密运算,得到第二个密文块。
import (
    "crypto/aes"
    "crypto/cipher"
)

第二段:ECB加密示例

以下是ECB加密模式的示例:

package main

import (
    "crypto/aes"
    "crypto/cipher"
    "encoding/base64"
    "fmt"
)

func main() {
    // 待加密的字符串
    plantText := []byte("我是一个全栈程序员")

    // 加密密钥,长度为16 24 32(即AES-128 AES-192 AES-256)
    key := []byte("1234567890123456")

    // 创建加密算法aes(密钥长度为16,24,32)
    block, err := aes.NewCipher(key)
    if err != nil {
        panic(err)
    }

    // 加密明文,使用ECB模式
    cipherText := make([]byte, len(plantText))
    ecb := cipher.NewECBEncrypter(block)
    ecb.CryptBlocks(cipherText, plantText)

    // 用Base64编码加密数据
    fmt.Printf("加密结果:%v", base64.StdEncoding.EncodeToString(cipherText))
}

第三段:CBC加密示例

以下是CBC加密模式的示例:

package main

import (
	"crypto/aes"
	"crypto/cipher"
	"encoding/base64"
	"fmt"
)

func main() {
	// 待加密的字符串
	plantText := []byte("我是一个全栈程序员")

	// 加密密钥,长度为16 24 32(即AES-128 AES-192 AES-256)
	key := []byte("1234567890123456")

	// 加密前需要填充的数据
	paddingText := addPadding(plantText, block.BlockSize())

	// 创建加密算法aes(密钥长度为16,24,32)
	block, err := aes.NewCipher(key)
	if err != nil {
		panic(err)
	}

	// 创建加密CBC分组模式
	cipherText := make([]byte, len(paddingText))
	iv := []byte("1234567890123456")
	mode := cipher.NewCBCEncrypter(block, iv)
	mode.CryptBlocks(cipherText, paddingText)

	// 用Base64编码加密数据
	fmt.Printf("加密结果:%v", base64.StdEncoding.EncodeToString(cipherText))
}

// 补充函数 addPadding
func addPadding(plantText []byte, blockSize int) []byte {
	// 计算需要填充的块大小
	padding := blockSize - len(plantText)%blockSize
	// 对每个需要填充的字节赋值为padding
	padText := bytes.Repeat([]byte{byte(padding)}, padding)
	// 添加到要加密的原始数据末尾
	return append(plantText, padText...)
}

第四段:OFB加密示例

以下是OFB加密模式的示例:

package main

import (
	"crypto/aes"
	"crypto/cipher"
	"encoding/base64"
	"fmt"
)

func main() {
	// 待加密的字符串
	plantText := []byte("我是一个全栈程序员")

	// 加密密钥,长度为16 24 32(即AES-128 AES-192 AES-256)
	key := []byte("1234567890123456")

	// 创建加密算法aes(密钥长度为16,24,32)
	block, err := aes.NewCipher(key)
	if err != nil {
		panic(err)
	}

	// 创建加密OFB分组模式
	cipherText := make([]byte, len(plantText))
	iv := []byte("1234567890123456")
	stream := cipher.NewOFB(block, iv)
	stream.XORKeyStream(cipherText, plantText)

	// 用Base64编码加密数据
	fmt.Printf("加密结果:%v", base64.StdEncoding.EncodeToString(cipherText))
}

总结

本文主要简述了AES对称加密算法的主要工作模式(ECB、CBC、CFB、OFB),并分别以Golang代码的形式展示了如何实现这四种加密模式。其中,ECB模式简单明了,但安全性略低,其他模式为了提高安全性,在加密前需要进行补padding位和设置IV初始向量等操作,但对于日常加密,非常可靠有效。

总的来说,AES加密算法的优点在于可以使用硬件进行加速,而且对安全性要求比较高的场合使用,比如支付信息传输等,是广泛使用的加密算法之一。