什么是AES
AES(Advanced Encryption Standard)的中文名叫高级加密标准,又称 Rijndael 加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于 2001 年 11 月 26 日发布于 FIPS PUB 197,并在 2002 年 5 月 26 日成为有效的标准。现在,高级加密标准已然成为对称密钥加密中最流行的算法之一。
该算法为比利时密码学家 Joan Daemen 和 Vincent Rijmen 所设计,结合两位作者的名字,以 Rijndael 为名投稿高级加密标准的甄选流程。
以上说明来自维基百科。
AES 特性
在 AES 标准规范中,分组长度只能是 128 位,也就是说,每个分组为 16 个字节(每个字节 8 位)
秘钥长度
- 128 位:一般记为
AES-128
,一字节8 比特位
,就是秘钥长度为16 字节
,分组长度为16 字节
,加密10 轮
- 192 位:一般记为
AES-192
,一字节8 比特位
,就是秘钥长度为24 字节
,分组长度为16 字节
,加密12 轮
- 256 位:一般记为
AES-128
,一字节8 比特位
,就是秘钥长度为32 字节
,分组长度为16 字节
,加密14 轮
工作模式
- 电码本模式 ECB(Electronic Codebook Book):这种模式是将整个明文分成若干段相同的小段,然后对每一小段进行加密,最后进行拼接。
- 密码分组链接模式 CBC (Cipher Block Chaining):这种模式是先将明文切分成若干小段,然后每一小段与初始块或者上一段的密文段进行异或运算后,再与密钥进行加密。
- 计算器模式 CTR (Counter):**计算器模式不常见,在 CTR 模式中, 有一个自增的算子,这个算子用密钥加密之后的输出和明文异或的结果得到密文,相当于一次一密。这种加密方式简单快速,安全可靠,而且可以并行加密,但是在计算器不能维持很长的情况下,密钥只能使用一次。
- ...
填充模式
- NoPadding:数据长度不对齐时使用 0 填充,否则不填充
- PKCS7Padding:假设数据长度需要填充 n(n>0) 个字节才对齐,那么填充 n 个字节,每个字节都是 n ;如果数据本身就已经对齐了,则填充一块长度为块大小的数据,每个字节都是块大小
- PKCS5Padding:PKCS7Padding 的子集,块大小固定为 8 字节。
- ...
AES 加密大致流程
首先会将明文以16字节
一组,然后分成诺干租。但是有时明文长度不是 16 的倍数时怎么办呢?
这时候就可以用填充模式来把明文填充到 16 的倍数
然后按所选择的工作模式进行加密
按秘钥长度来决定进行几轮加密
Go 标准库
在 Go 中,官方提供了 crypto/aes 标准库来给我们进行加密,官方说明是这样的:
The AES operations in this package are not implemented using constant-time algorithms. An exception is when running on systems with enabled hardware support for AES that makes these operations constant-time. Examples include amd64 systems using AES-NI extensions and s390x systems using Message-Security-Assist extensions. On such systems, when the result of NewCipher is passed to cipher.NewGCM, the GHASH operation used by GCM is also constant-time.
大致意思就是说这个库并没有指定模式,我们用的时候可以用 cipher
来选择加密模式