AES加密算法详解(图文解释)

时间:2024-03-27 18:53:16

由于DES加密算法被**了,3DES加密算法虽然没有被**,但是3DES算法的加解密效率低,所有现在都使用AES算法。
AES加密算法是密码学中的高级加密标准,AES为分组加密法,把明文分成一组一组的,每组长度相等,每次加密一组数据,直到加密完整个明文,在AES标准规范中,分组长度只能是128位,AES是按照字节进行加密的,也就是说每个分组为16个字节(每个字节8位)。**的长度可以使用128位、192位或256位。这导致**长度不同,推荐加密的轮数也不同。

AES算法思想:
1)设计简单;
2)在多个平台上速度快,编码紧凑;
3)抵抗所有已知攻击;
4)没有采用Feistel结构,轮函数由3个不同的可逆均匀变换构成:非线性层、线性混合层和**加层。

明文P需要分组,称为状态,状态用以字节为元素的矩阵阵列表示,如图所示:
AES加密算法详解(图文解释)
16字节明文按照此顺序放入矩阵,规则为:从上到下,从左到右,依次进行。

同样的,**K也需要分组,原理与明文P相同,下图为128位**矩阵:
AES加密算法详解(图文解释)

下图为AES加密流程:
AES加密算法详解(图文解释)
加密过程:C=E(K,P),其中C为加密后的密文,K为**,P为明文,E为加密函数。
解密过程:P=D(K,P),其中D为解密函数,解密过程为加密过程的逆运算。
AES的具体加密流程如下图所示:
AES加密算法详解(图文解释)AES加密过程通过四个步骤实现:字节替换、行移位、列混淆和轮**加。
注意: 根据**长度不同,加密的轮数也不同,在第一轮之前要进行轮**加,最后一轮没有进行列混淆操作。

我们来解释一下这四个步骤的具体含义:
字节替换: 属于非线性替换,具体原理就是通过一个替换表(S盒)对每个字节进行替换,实际上就是一个查表操作,并且此过程可逆,将每一个字节的前4位作为行值,后4位作为列值,去S盒查找,进行输出。
下图为S盒(x表示行,y表示列),例如字节为0x14,那么前四位的16进制为1,后四位的16进制为4,去查找s盒中的第1行第4列的值,可以看出为0xfa,就把原先的字节0x14替换为0xfa。
AES加密算法详解(图文解释)
解密过程与此相同,唯一就是采用的是逆S盒。

接下来是行位移操作
对于4*4的矩阵,操作为:
第0行:保持不动;
第1行:循环左移1个字节;
第2行:循环左移2个字节;
第3行:循环左移3个字节。
解密过程变为循环右移,每行移动字节数与加密过程相同,下图为列位移示意图。

AES加密算法详解(图文解释)接下来是列混淆操作
实际上为44的矩阵与另一个44矩阵异或相乘(注意为右乘操作),重新得到一个4*4的矩阵,如下图所示。
解密过程为重新与此矩阵异或,因为两次异或得到的值为原数据本身。
AES加密算法详解(图文解释)
最后为轮**加操作
轮**与状态矩阵进行逐比特异或操作。
这个轮**是由种子**通过**编排算法得到的,并且轮**长度与分组长度相同。
解密过程与之相同,两次异或得到原始数据。

**编排算法基本原则
1)轮**的比特数等于分组长度乘以轮数加1;
例如:将128位比特明文进行加密,总共需要(10+1)*128=1408比特**。
2)种子**扩展为扩展**;
3)轮**从扩展**中取,第一轮取扩展**的第0~3列,依次类推。
过程为:
定义:w[0]~w[3]为初始**

如果i=4的倍数,即i为每组的第一列,则执行以下3个步骤
1)将w[i-1]循环左移一个字节:

w[0] w[1] w[2] w[3] w[4]
2b 28 ab 09 cf
7e ae f7 4f 4f
15 d2 15 4f 3c
16 a6 88 3c 09

w’[i]=w[i-1]左移一个字节得到。
w’[4]=w[3]左移一个字节得到={09,cf,4f,3c}左移一个字节={cf,4f,3c,09}
2)分别对w’[i]的每个字节进行S盒替换,本质上就是查表,再替换为另一个字节。
即查表后为w’’[i]。
例如,w’[4]查表后的w’’[4]={8a,84,eb,01},需s盒的自行查看。
3)将前两步的结果同轮常量Rcon[j]进行异或,j表示轮数,Rcon[j]如下图所示

j 1 2 3 4 5
Rcon[j] 01 00 00 00 02 00 00 00 04 00 00 00 08 00 00 00 10 00 00 00
j 6 7 8 9 10
Rcon[j] 20 00 00 00 40 00 00 00 80 00 00 00 1B 00 00 00 36 00 00 00

那么w[i]=w[i-4]⊕w’[i]⊕Rcon[j],此时j=1,因为为第一轮。
即w[4]=w[0]⊕w’’[4]⊕Rcon[1],
那么w[8]=w[4]⊕w’’[8]⊕Rcon[2],……

如果i≠4的倍数,即i为每组的第二、三、四列,则执行以下一个步骤
即w[i]=w[i-4]⊕w[i-1]
例如w[5]=w[1]⊕w[4],w[6]=w[2]⊕[5],……

最终的到一个扩展**:{w[4],w[5],w[6],w[7]},之后的每一轮**都是在前一轮基础上形成的。

可能说的不是很明白,后续将会补充。