AES算法流程简述

AES加密过程:

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

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

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

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

二、密钥扩展--->10轮加密扩展到(1+10)*4*4 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轮的加密操作,加密操作一共四步骤:

  1. s_box的字节替换
  2. 行左移位
  3. 正向列混淆(关键数据2,1,1,3)
  4. 轮密钥加

3、最后一轮时候不用列混淆,其他三步一样。

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

四、解密过程:

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

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

  1. 行右移位
  2. inv_s_box的字节替换
  3. 轮密钥加
  4. 逆向列混淆(关键数据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)

猜你喜欢

转载自blog.csdn.net/a893574301/article/details/82860146