一、前言
AES 的全称是 Advanced Encryption Standard,意思是高级加密标准。
它的出现主要是为了取代 DES 加密算法的,因为我们都知道 DES 算法的密钥长度是 56Bit,因此算法的理论安全强度是 2 的 56 次方。
但二十世纪中后期正是计算机飞速发展的阶段,元器件制造工艺的进步使得计算机的处理能力越来越强,虽然出现了 3DES 的加密方法,但由于它的加密时间是 DES 算法的 3 倍多,64Bit 的分组大小相对较小,所以还是不能满足人们对安全性的要求。于是 1997 年 1 月 2 号,美国国家标准技术研究所宣布希望征集高级加密标准,用以取代 DES。
AES 也得到了全世界很多密码工作者的响应,先后有很多人提交了自己设计的算法。最终有 5 个候选算法进入最后一轮:Rijndael,Serpent,Twofish,RC6 和 MARS。最终经过安全性分析、软硬件性能评估等严格的步骤,Rijndael 算法获胜。
二、密钥
密钥是 AES 算法实现加密和解密的根本。
对称加密算法之所以对称,是因为这类算法对明文的加密和解密需要使用同一个密钥。
AES 支持三种长度的密钥: 128位,192位,256位
平时大家所说的 AES128,AES192,AES256,实际上就是指 AES 算法对不同长度密钥的使用。
三种密钥的区别: 从安全性来看,AES256 安全性最高。
从性能看,AES128 性能最高。
本质原因是它们的加密处理轮数不同。
三、填充
要想了解填充的概念,我们先要了解 AES 的分组加密特性。
AES 算法在对明文加密的时候,并不是把整个明文一股脑的加密成一整段密文,而是把明文拆分成一个个独立的明文块,每一个明文块长度 128 bit。
这些明文块经过 AES 加密器复杂处理,生成一个个独立的密文块,这些密文块拼接在一起,就是最终的AES 加密的结果。
但这里涉及到一个问题,假如一段明文长度是 196bit,如果按每 128bit 一个明文块来拆分的话,第二个明文块只有 64bit,不足 128bit。这时候怎么办呢?就需要对明文块进行填充(Padding) 。
几种典型的填充方式:
NoPadding: 不做任何填充,但是要求明文必须是 16 字节的整数倍。
PKCS5Padding(默认): 如果明文块少于 16 个字节(128bit),在明文块末尾补足相应数量的字符,且每个字节的值等于缺少的字符数。 比如明文:{1,2,3,4,5,a,b,c,d,e} 缺少 6 个字节,则补全为 {1,2,3,4,5,a,b,c,d,e,6,6,6,6,6,6 }
PKCS7Padding 原理与 PKCS5Padding 相似,区别是 PKCS5Padding 的 blocksize 为 8 字节,而 PKCS7Padding 的 blocksize 可以为 1 到 255 字节
ISO10126Padding:如果明文块少于 16 个字节(128bit),在明文块末尾补足相应数量的字节,最后一个字符值等于缺少的字符数,其他字符填充随机数。比如明文:{1,2,3,4,5,a,b,c,d,e} 缺少 6个字节,则可能补全为 {1,2,3,4,5,a,b,c,d,e,5,c,3,G,$,6}
需要注意的是,如果在 AES 加密的时候使用了某一种填充方式,解密的时候也必须采用同样的填充方式。
四、模式
AES 的工作模式,体现在把明文块加密成密文块的处理过程中。
AES 加密算法提供了五种不同的工作模式:CBC,ECB,CTR,CFB,OFB
模式之间的主题思想是近似的,在处理细节上有一些差别
电码本模式(Electronic Codebook Book (ECB))
密码分组链接模式(Cipher Block Chaining (CBC))
计算器模式(Counter (CTR))
密码反馈模式(Cipher FeedBack (CFB))
输出反馈模式(Output FeedBack (OFB))
4.1、ECB
电码本模式(Electronic Codebook Book (ECB),这种模式是将整个明文分成若干段相同的小段,然后对每一小段进行加密。
优点
简单
有利于并行计算
误差不会被传送
缺点
不能隐藏明文的模式
可能对明文进行主动攻击
4.2、CBC
密码分组链接模式(Cipher Block Chaining (CBC)) 这种模式是先将明文切分成若干小段,然后每一小段与初始块或者上一段的密文段进行异或运算后,再与密钥进行加密。
优点
不容易主动攻击,安全性好于 ECB,适合传输长度长的报文,是 SSL、IPSec 的标准
缺点
不利于并行计算
误差传递
需要初始化向量 IV
4.3、CTR
计算器模式(Counter (CTR)) 计算器模式不常见,在CTR模式中, 有一个自增的算子,这个算子用密钥加密之后的输出和明文异或的结果得到密文,相当于一次一密。这种加密方式简单快速,安全可靠,而且可以并行加密,但是在计算器不能维持很长的情况下,密钥只能使用一次。
4.4、CFB
密码反馈模式(Cipher FeedBack (CFB)) 这种模式较复杂。
优点
隐藏了明文模式
分组密码转化为流模式
可以及时加密传送小于分组的数据
缺点
不利于并行计算
误差传送:一个明文单元损坏影响多个单元
唯一的IV
4.5、OFB
输出反馈模式(Output FeedBack (OFB)) 这种模式较复杂。
优点
隐藏了明文模式
分组密码转化为流模式
可以及时加密传送小于分组的数据
缺点
不利于并行计算
对明文的主动攻击是可能的
误差传送:一个明文单元损坏影响多个单元