AES加密解密原理

AESFPGA

AES加密

AES是一个对称密码,它的存在是为了取代被证明不安全的DES算法。

一、AES加密过程

aes解密python aes解密过程_分块


上图为128位的加密过程,如果长度为192位,则要经过12轮加密运算,同理,256位的需要经过14轮加密。

aes解密python aes解密过程_分块_02

以128位为例,其中9轮为循环运算,最后一轮只有步骤1,2,4,没有列混合。

明文长度固定为128位(16字节)
密钥长度可以是128、192、256位

二、初始变换

AES和DES一样是分组加密的

所以,把明文划分成若干个等长的明文块,分块进行加密、

将数据按照下图的方式进行排列,得到一个4 * 4的矩阵

aes解密python aes解密过程_加密解密_03


将明文的4 * 4矩阵以及密钥的4 * 4矩阵进行异或操作。(按字节异或)

aes解密python aes解密过程_加密解密_04

具体例子如下:

aes解密python aes解密过程_密钥长度_05

三、循环运算

3.1字节代换

将输入的矩阵通过这个S表,完成从一个字节到另一个字节的映射。

aes解密python aes解密过程_分块_06


代换完成后如下:

aes解密python aes解密过程_aes解密python_07

3.2行移位

这个矩阵的第一行保持不变,第二行向左移动一个字节,第三行向左移动两个字节。第四行向左移动三个字节。

aes解密python aes解密过程_密钥长度_08

3.3列混合

列混合就是将输入的一个4x4的矩阵左乘一个给定的4x4矩阵。

aes解密python aes解密过程_加密解密_09

aes解密python aes解密过程_加密解密_10

enter description here


aes解密python aes解密过程_加密解密_11


注意,这里的举证点乘与数学中的点成有些不同,这里的加法变成了异或运算

aes解密python aes解密过程_加密解密_12

普通的乘法变成了X乘,也就是 x-time算法

具体细节如下,

01

01与一个数相乘还是那个数本身。

02

将两个数都转为2进制,a7如果等于1,则去掉a7,左移一位,在右侧补0,然后异或00011011;a7如果等于0,则直接去掉a7,左移一位,在右侧补0。

aes解密python aes解密过程_分块_13


03

对于03来说,要拆成02与01的异或,然后分别相乘,如上,最后在异或。

aes解密python aes解密过程_密钥长度_14

3.4轮密钥加

将矩阵与一个子密钥的没一列进行逐个异或,得到一个新的矩阵。

aes解密python aes解密过程_分块_15

3.5子密钥扩展

一开始只有一个子密钥,需要经过循环扩展生成10轮的轮密钥。

aes解密python aes解密过程_分块_16

1.如果i不是4的倍数,那么第i列由如下等式确定:

aes解密python aes解密过程_aes解密python_17


W5 = W1aes解密python aes解密过程_密钥长度_18 W4

W6 = W2aes解密python aes解密过程_加密解密_19 W5

aes解密python aes解密过程_分块_20

2.如果i是4的倍数,那么第i列由如下等式确定︰

aes解密python aes解密过程_加密解密_21

这个T函数由3部分组成:字循环、字节代换和轮常量异或。

a.字循环:将1个字中的4个字节循环左移1个字节。即将输⼊字[b0, b1, b2, b3]变换成
[b1,b2,b3,b0]。

aes解密python aes解密过程_aes解密python_22

b.字节代换:对字循环的结果使⽤S盒进⾏字节代换。

aes解密python aes解密过程_aes解密python_23

c.轮常量异或:将前两步的结果同轮常量Rcon[j]进⾏异或,其中j表示轮数。

aes解密python aes解密过程_分块_24

aes解密python aes解密过程_密钥长度_25


蓝色代表W(i-4),橙色代表字节变换后的,黄色代表轮常量里的数R(J)。

aes解密python aes解密过程_aes解密python_26

以此类推,得到10轮变换所需要的轮密钥。

aes解密python aes解密过程_aes解密python_27