AES是一种对称加密算法,即用同一把密钥进行加密与解密。AES加密有以下几个参数需要注意:
1.key
AES要求密钥具有16byte、24byte或者32byte,位数越高,加密强度越大,加密轮数依次为10、12、14轮。以128位密钥为例,密钥首先扩展为44个字(32位),前4个字与明文进行一次异或操作。后面40个字分成10组,分别在10轮加密中进行数据异或操作。
2.IV
初始向量,其作用是对输入明文进行,加密解密需要同样的IV。IV也需要通过随机函数产生以保证安全。
3.padding,填充模式。
AES对明文进行分组加密,每个分组为16字节,因此输入明文数据要进行字节填充,以符合整数倍16字节大小。常见的填充模式有:
4.加密模式
有ECB、CBC、CFB等,其中ECB安全性较差。
下面以Go为例,展示AES256-CBC-PKCS7模式下的加密与解密:
package main
import (
"bytes"
"crypto/aes"
"crypto/cipher"
"fmt"
)
// 输入明文和密钥,输出AES密文
func AESEncrypt(plainText, key, iv []byte) ([]byte, error) {
block, err := aes.NewCipher(key)
if err != nil {
return nil, err
}
mode :=