AES 算法

https://blog.csdn.net/qq_38289815/article/details/80900813

AES算法流程:
AES加密过程涉及到4种操作,分别是字节替代、行移位、列混淆和轮密钥加。解密过程分别为对应的逆操作。由于每一步操作都是可逆的,按照相反的顺序进行解密即可恢复明文。加解密中每轮的密钥分别由初始密钥扩展得到。算法中16个字节的明文、密文和轮密钥都以一个4x4的矩阵表示。

注意:前9次的加密过程是一样的,而最后一次的加密过程是没有列混淆的。

1.字节替换:字节代替的主要功能是通过S盒完成一个字节到另外一个字节的映射。

例如:字节66替换后的值为S[6][6]=33,再通过S-1即可得到替换前的值,S-1[3][3]=66。

2.行移位:行移位的功能是实现一个4x4矩阵内部字节之间的置换。

移位的操作是:第一行保存不变,第二行循环左移1个字节,第三行循环左移2个字节,第四行循环左移3个字节。

3.列混淆:

根据矩阵的乘法可知,在列混淆(利用域GF(28)上的算术特性的一个代替)的过程中,每个字节对应的值只与该列的4个值有关系。此处的乘法和加法需要注意如下几点:

(1)将某个字节所对应的值乘以2,其结果就是将该值的二进制位左移一位,如果该值的最高位为1(表示该数值不小于128),则还需要将移位后的结果异或00011011

(2)乘法对加法满足分配率,例如:07·S0,0=(01⊕02⊕04)·S0,0= S0,0⊕(02·S0,0)(04·S0,0)

(3)此处的矩阵乘法与一般意义上矩阵的乘法有所不同,各个值在相加时使用的是模2加法(异或运算)。

因为:说明两个矩阵互逆,经过一次逆向列混淆后即可恢复原文。

4.轮密钥加:加密过程中,每轮的输入与轮密钥异或一次(当前分组和扩展密钥的一部分进行按位异或);因为二进制数连续异或一个数结果是不变的,所以在解密时再异或上该轮的密钥即可恢复输入。首尾使用轮密钥加的理由:若将其他不需要密钥的阶段放在首尾,在不用密钥的情况下就能完成逆过程,这就降低了算法的安全性。

加密原理:轮密钥加本身不难被破解,另外三个阶段分别提供了混淆和非线性功能。可是字节替换、行移位、列混淆阶段没有涉及密钥,就它们自身而言,并没有提供算法的安全性。但该算法经历一个分组的异或加密(轮密钥加),再对该分组混淆扩散(其他三个阶段),再接着又是异或加密,如此交替进行,这种方式非常有效非常安全。

5.密钥扩展:其复杂性是确保算法安全性的重要部分。当分组长度和密钥长度都是128位时,AES的加密算法共迭代10轮,需要10个子密钥。AES的密钥扩展的目的是将输入的128位密钥扩展成11个128位的子密钥。AES的密钥扩展算法是以字为一个基本单位(一个字为4个字节),刚好是密钥矩阵的一列。因此4个字(128位)密钥需要扩展成11个子密钥,共44个字。

密钥扩展过程说明:将初始密钥以列为主,转化为4个32 bits的字,分别记为w[0…3];按照如下方式,依次求解w[i],其中i是整数并且属于[4,43]。

1)将w[i]循环左移一个字节。

2)分别对每个字节按S盒进行映射。

3)32 bits的常量(RC[i/4],0,0,0)进行异或,RC是一个一维数组,其中RC = {01, 02, 04, 08, 10, 20, 40, 80, 1B, 36}。

4)除了轮密钥的第一列使用上述方法,之后的二到四列都是w[i]=w[i-4]⊕w[i-1]

5)最终得到的第一个扩展密钥为(之后的每一轮密钥都是在前一轮的基础上按照上述方法得到的):

————————————————
版权声明:本文为CSDN博主「Tyler_Z」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_38289815/article/details/80900813

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/a893574301/article/details/82860146

AES加密过程:

一、key可以是三种大小字节,分别对应着后面不同的加密轮数:

128(0x10字节)---> 10轮

196(0x18字节)---> 12轮

256(0x20字节)---> 14轮

二、密钥扩展--->10轮加密扩展到(1+10)44 bytes,其他轮数同理

1、扩展密钥的第一项是密钥原文本。

2、密钥的每一行是4个DWORD,再针对每一个DWORD进行for循环,如果index%4 == 0,则特殊处理,否则只用Sbox替换;

三、加密过程:

1    2    3    4                1    5    9    13
5    6    7    8        --->    2    6    10   14    明文转置为状态矩阵
9    10   11   12               3    7    11   15
13   14   15   16               4    8    12   16
1、128bit明文进行转换为状态矩阵,进行轮密钥加操作

2、进行x-1轮的加密操作,加密操作一共四步骤:

s_box的字节替换
行左移位
正向列混淆(关键数据2,1,1,3)
轮密钥加
3、最后一轮时候不用列混淆,其他三步一样。

4、状态矩阵变为数组,就为加密结果。

四、解密过程:

1、密文转为状态矩阵,并用最后一轮的密钥进行轮加密操作

2、倒着到1轮进行解密操作,解密操作也是四个步骤:

行右移位
inv_s_box的字节替换
轮密钥加
逆向列混淆(关键数据14,9,13,11)
3、最后一轮不用列混淆,其他一样

4、状态矩阵变为数组,就为加密结果。

详细步骤(https://blog.csdn.net/qq_28205153/article/details/55798628):

密钥扩展:

这个4*4矩阵的每一列的4个字节组成一个字,矩阵4列的4个字依次命名为W[0]、W[1]、W[2]和W[3],它们构成一个以字为单位的数组W。例如,设密钥K为”abcdefghijklmnop”,则K0 = ‘a’,K1 = ‘b’, K2 = ‘c’,K3 = ‘d’,W[0] = “abcd”。
接着,对W数组扩充40个新列,构成总共44列的扩展密钥数组。新列以如下的递归方式产生:
1.如果i不是4的倍数,那么第i列由如下等式确定:
W[i]=W[i-4]⨁W[i-1]
2.如果i是4的倍数,那么第i列由如下等式确定:
W[i]=W[i-4]⨁T(W[i-1])
其中,T是一个有点复杂的函数。
函数T由3部分组成:字循环、字节代换和轮常量异或,这3部分的作用分别如下。
a.字循环:将1个字中的4个字节循环左移1个字节。即将输入字[b0, b1, b2, b3]变换成[b1,b2,b3,b0]。
b.字节代换:对字循环的结果使用S盒进行字节代换。
c.轮常量异或:将前两步的结果同轮常量Rcon[j]进行异或,其中j表示轮数。
轮常量Rcon[j]是一个字,其值见下表。 --------------------- 本文来自 TimeShatter 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/qq_28205153/article/details/55798628?utm_source=copy

行移位(左右):

第0行左(右)移0字节

第1行左(右)移1字节

第2行左(右)移2字节

第3行左(右)移3字节

S盒字节替换:

s_box是一个16*16二维数组,传入的数据比如0x13表示置换为1行3列的数据

轮密钥加:

每一轮的密钥16bytes和每一轮的加密数据进行xor

列混淆:

移位后的状态矩阵与固定的矩阵相乘,固定的矩阵在加密和解密的时候不同,分别是:

加密: 关键数据 :2,3,1,1

解密: 关键数据 :E,B,D,9(14,11,13,9)
————————————————
版权声明:本文为CSDN博主「coNgY1」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/a893574301/article/details/82860146