一.概览
AES(Advanced Encryption Standard)是常用的对称分组密码算法之一,是美国NIST在2001年发布的,旨在代替DES称为广泛使用的标准。使用AES算法有很多种模式及填充方式。尽管不同模式的AES的核心加密算法是一致的,但不同模式下,加密的安全性和加解密速度等是有区别的,加密时使用的参数也会不同。另外AES是分组加密算法,会涉及到加密内容的分组,在最后一个组数据中,如果数据长度达不到加密的要求,就需要对最后一组进行填充,这时就涉及填充模式。
二.AES算法的参数
1.AES加密涉及到的参数类型
AES加密涉及到的参数如下:
- key length(密钥位数,密码长度)
- key (密钥,密码)
- IV (向量)
- mode (加密模式)
- padding (填充方式)
解密的参数必须和加密的参数一样,才能解密成功。
2.参数类型说明
(1)key length(密钥位数,密码长度)
不论密钥长度为多少,AES的明文分组始终为16字节(4字,128位),密钥长度可以为128位(16字节)、192位(24字节)、256位(32字节),根据密钥长度的不同,AES分为AES-128、AES-192、AES-256三种。
(2)key (密钥,密码)
key指的就是密码了,AES-128就是128位的,如果位数不够,某些库可能会自动填充到128。AES-192、AES-256的类似。
(3)IV (向量)
IV称为初始向量,不同的IV加密后的字符串是不同的,加密和解密需要相同的IV。AES加密算法的各种模式中,只有ECB模式不需要IV,同时其安全性也是最低的。在使用同一种加密同一个密钥时不应该使用相同的IV,否则会失去一定甚至全部的安全性。
- 针对不同的模式,IV代表的意义也不一样:
ECB模式没有IV;
CBC模式中IV是用于与第一个明文分组抑或,然后对抑或结果加密,相当于第一个预设的密文块,长度同分组块长度;
CFB模式中IV是第一个用于加密的内容,然后与明文块抑或,相当于第一个预设的密文块,长度同分组块长度;
OFB模式中IV是第一个用于加密的内容,长度同分组块长度;
CTR模式中IV可以理解为计数器的初始值。
(4)mode (加密模式)
AES的模式包含ECB, CBC, CFB, OFB, CTR。AES常用的GCM模式,其实是带GMAC(伽罗瓦消息验证码)的CTR模式。
1)ECB(Electronic Codebook,电码本)
ECB(Electronic Codebook,电码本)模式是分组密码的一种最基本的最早采用和最简单的工作模式。在该模式下,待处理信息被分为大小合适的分组,然后分别对每一分组用相同的密钥独立进行加密或解密处理。
优点:
1.简单; 2.有利于并行计算; 3.误差不会被传送;
缺点:
1.不能隐藏明文的模式; 2.可能对明文进行主动攻击; 因此,此模式适于加密小消息。
2)CBC(Cipher Block Chaining,加密块链)模式
前一个分组的密文和当前分组的明文异或操作后再加密。
优点:
1.不容易主动攻击,安全性好于ECB,适合传输长度长的报文,是SSL、IPSec的标准。
缺点:
1.不利于并行计算; 2.误差传递; 3.需要初始化向量IV
3)CFB(Cipher FeedBack,密文反馈模式)
在CFB模式中,前一个密文分组会被送回到密码算法的输入端。在CFB模式中,明文分组并没有通过密码算法来直接进行加密。明文分组和密文分组之间并没有经过“加密”这一步骤。在CFB模式中,明文分组和密文分组之间只有一个XOR。
在生成第一个密文分组时,由于不存在前一个输出的数据,因此需要使用初始化向量(IV)来代替。一般来说,我们需要在每次加密时生成一个不同的随机比特序列用作初始化向量。
注: CFB模式解密时,需要注意的是分组密码算法依然执行加密操作,密钥流是通过加密操作来生成的。
优点:
1.隐藏了明文模式; 2.分组密码转化为流模式; 3.可以及时加密传送小于分组的数据; 4.不需要填充。
缺点:
1.不利于并行计算; 2.误差传送:一个明文单元损坏影响多个单元; 3.唯一的IV;
4)OFB(Output FeedBack,输出反馈模式)
OFB模式的全称是output-Feedback模式(输出反馈模式)。在OFB模式中,密码算法的输出会反馈到密码算法的输入中。
OFB模式不是通过密码算法对明文直接加密的,而是通过将“明文分组”和“密码算法的输出”进行XOR来产生“密文分组”的。
与CFB模式类似,OFB模式也需要使用初始化向量(IV)。一般来讲,我们需要在每次加密时生成一个不同的随机比特序列用作初始化向量。
OFB模式中,XOR所需要的比特序列(密钥流)可以事先通过密码算法生成,和明文分组无关。只要提前准备好所需的密钥流,则在实际从明文生成密文的过程中,就完全不需要动用密码算法了,只要将明文与密钥流进行XOR就可以了。和AES等密码算法相比,XOR运算是非常快的。这就意味着只要提前准备好密钥流就可以快速完成加密。换个角度来看,生成密钥流的操作和进行XOR运算的操作是可以并行的。
5)CTR(Counter,计算器模式)
计数模式(CTR模式)加密是对一系列输入数据块(称为计数)进行加密,产生一系列的输出块,输出块与明文异或得到密文。对于最后的数据块,可能是长u位的局部数据块,这u位就将用于异或操作,而剩下的b-u位将被丢弃(b表示块的长度),因此不用填充。CTR解密类似。这一系列的计数必须互不相同的。
CTR 模式被广泛用于 ATM 网络安全和 IPSec应用中,相对于其它模式而言,CTR模式具有如下特点:
CTR模式与OFB模式一样,无需填充,可抵御重放攻击,CTR模式的单一密文损坏并不会影响到其他块的解密,且支持并行运算(加解密),不会有密钥流重复循环出现的情况,由于加密和解密过程均可以进行并行处理,CTR适合运用于多处理器的硬件上,解密过程使用的是加密器。
优点
CTR模式可并行、效率高、Oi的计算可预处理、适合任意长度的数据、加解密速度快,而且在加解密处理方式上适合随机存取数据的加解密。因此,特别适合计算机随机文件的加密,因为随机文件要求能随机地访问。这对数据库加密是有重要意义的。
缺点
需要提供初始计数器值
没有错误传播,因此不适合用于数据完整性认证,往往使用的带消息验证码的GCM模式。
6)GCM(Galois/Counter Mode)
AES 的GCM模式本质上是该对称加密采用Counter模式,并带有GMAC消息认证码。GMAC(Galois message authentication code mode, 伽罗瓦消息验证码)是MAC的一种,实现逻辑如下:
其中Mh表示密文分组内容和密钥h在GF(Galois) 域的乘法运算。以下为GCM模式。其中Ek为加密算法,AES-GCM中即为AES加密算法:
上图中的上半部分和 5)中CTR模式介绍的解密部分是吻和的,5)中和明文分组求抑或是从计数器1开始的,而这里介绍了计数器0的用途,计数器0在Ek(AES加密)加密后的密文被用作GMAC的密钥,然后计算GMAC值时,以附加消息IV为起始,然后按照上图中流程计算出GMAC值。
GCM即可以并行地进行加密过程,又可以对信息的完整性进行校验,是AES模式中经常使用的模式之一。
(5)padding (填充方式)
CFB,OFB和CTR模式不需要任何特殊措施来处理长度不是块大小倍数的消息,因为这些模式通过将明文与块密码的输出进行异或工作。ECB和CBC要求在加密之前填补最终的块。常用的PADDING模式为PKCS5, PKCS7, NOPADDING,ZerosPadding,ISO 10126,ANSI X9.23,ISO / IEC 7816-4。
-
PKCS5
PKCS5是8字节填充的,即填充一定数量的内容,使得成为8的整数倍,而填充的内容取决于需要填充的数目,填充内容为0x01-0x08。例如,串0x56在经过PKCS5填充之后会成为0x56 0x07 0x07 0x07 0x07 0x07 0x07 0x07因为需要填充7字节,因此填充的内容就是7。当然特殊情况下,如果已经满足了8的整倍数,按照PKCS5的规则,仍然需要在尾部填充8个字节,并且内容是0x08,目的是为了加解密时统一处理填充。
为啥当为整数倍时,还是要多增加8个0x08?因为解密的需要。假设当x是8的整数倍时,不多填充8个0x08,当解密后时,我看到了解密后的数据的末尾的最后一个字节,这个字节恰好是0x01,那你说,这个字节是填充上去的呢?还是实际的数据呢? -
PKCS7
PKCS#7的填充方式和PKCS5类似,但不仅仅是对8字节填充,其BlockSize范围是1-255字节。PKCS#5在填充方面,是PKCS#7的一个子集,所以,PKCS#5可以向上转换为PKCS#7,但是PKCS#7不一定可以转换到PKCS#5(用PKCS#7填充加密的密文,用PKCS#5解出来是错误的) -
NOPADDING
不填充,但加密信息字节长度需是为128bits倍数。一般不会使用。 -
ZerosPadding
全部填充0x00,无论缺多少全部填充0x00,已经是128bits倍数仍要填充 -
ISO 10126
最后一个字节是填充的字节数(包括最后一字节),其他全部填随机数,例如:
… | DD DD DD DD DD DD DD DD | DD DD DD DD 81 A6 23 04 | -
ANSI X9.23
跟ISO 10126很像,只不过ANSI X9.23其他字节填的都是0而不是随机数。 -
ISO / IEC 7816-4
与位填充方案相同,适用于N字节的纯文本。 这意味着在实践中,第一个字节是值为“80”(十六进制)的必填字节,如果需要,则0到N-1个字节设置为’00’,直到达到块的结尾。 ISO / IEC 7816-4本身是包含文件系统的智能卡的通信标准,本身不包含任何加密规范。
示例:在以下示例中,块大小为8字节,4字节需要填充
… | DD DD DD DD DD DD DD DD | DD DD DD DD 80 00 00 00 |
参考文档:
如果有写的不对的地方,请多指正,谢谢!
文章评论