概要
AES全称Advanced Encryption Standard,即高级加密标准,用于取代DES和3DES。该算法是由Rijndael算法在15个算法中选出来称为AES算法的,因此AES算法也称Rijndael算法。当然AES算法并不等于AES算法。Rijndael算法的分组长度和密钥长度为32位的任意倍,最小128,最大256。而AES算法分组长度只能为128,密钥只能为128、192和256,分别称为AES-128、AES-192、AES-256。
步骤
该算法步骤为:字节替换(SubBytes)、行移位(Shiftrows)、列混合(Mixcolumns)、轮密钥加(AddRoundKey)、输出。
1、字节替换:AES和DES不一样,替换位置不是按位(bit)置换,而是按字节(8bit)置换,它会将128bit的原文分成16个组(字节),再用4*4的二维数组(从上往下,从左往右排列)存储这些字节,为比如原文F61446C1A68CEA53824826A7A47F1914分组之后变成如下二维数组:
![](https://img-blog.csdnimg.cn/img_convert/7d127cf34a0e517024faa4dd4ff28d2a.png)
变成二维数组后,还需要根据一个字节替换表(S-Box)将二维数组里的字节替换成别的字节。例如第二个值14,会用S-Box表里横标(x)为1,列标(y)为4的元素FA替换掉F6。部分S-Box表如下:
![](https://img-blog.csdnimg.cn/img_convert/2c15bcac31b997c6304a2072ea7d9720.png)
2、行位移:4*4的数组第1行不变,第2行左移1个字节,第3行左移2个字节,第4行左移3个字节。具体示例如下:
![](https://img-blog.csdnimg.cn/img_convert/481ee5f084603ae683f946dc6805e4d9.png)
以最后一个元素为例查看,具体移动位置如下:
![](https://img-blog.csdnimg.cn/img_convert/35c0007e32ee83adfd5f0a0ec43f8925.png)
列混合:以列为单位,把每列看成一个四项多项式,乘以一个固定多项式({03}
+{01}
+{01}X+{02}),再模(
+1)。具体公式运算如下:
![](https://img-blog.csdnimg.cn/img_convert/3b7d16cd2b7fc9ff72a9131e57c6f63d.png)
4、轮密钥加:二维数组中的元素与轮密钥通过异或运算相加。其中轮密钥由用户输入的密钥通过密钥扩展生成的,密钥拓展就是对用户输入的128/192/256bit密钥进行处理生成(Nb(Nr+1))双字(32bit)即44/52/60双字的扩展密钥。
5、输出:以上是循环一轮的步骤,AES128/192/256算法分别要循环10/12/14轮, 最后的原文变化后的数组就是密文,即密文与原文等长。当然,若原文是填充而来的,则密文与初始原文的长度是不一样的。
优缺点
优点:速度快,比DES还快,安全性高,目前基本没漏洞,密钥128位到256位,穷举法几乎也不可能。
缺点:加密解密的密钥相同,一旦一方密钥泄漏,安全性将不存在
使用场景
适合较大数据,需要密文恢复的场景,当然,现在的实际场景一般都是AES算法配合其他加密算法一起使用。