AES算法流程以及4种工作模式流程图教学文案

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1、AES加密算法基本流程

AES算法的数据分组长度为128比特、密钥长度为128/192/256比特。

AES加解密包括Nr轮,前面Nr-1轮包含S盒变换、行移位、列混淆、轮密钥加4个阶段,最后一轮则少了列混淆这个阶段。

Rijnadel(State,CipherKey)

{

//初始化

KeyExpansion(CipherKey,ExpandedKey);//生成子密钥

AddRoundKey(State,ExpandedKey);//与子密钥位与

//前Nr-1轮

for(i=1;i

{

ByteSub(State);//S-盒

ShiftRow(State);//行被移位

MixColumn(State);//列被混叠

AddRoundKey(State,ExpandedKey);//与子密钥位与

}

//最后一轮

ByteSub(State);

ShiftRow(State);

AddRoundKey(State,ExpandedKey);

}

2、AES加密算法

2.1、状态、密钥、轮数

状态:

○1解密过程中的中间数据。

○2以字节为元素的矩阵,或二维数组。

所有的操作都在状态上进行。

状态可以用以字节为元素的矩阵阵列表示,如上图所示该阵列有4行,列数记为Nb,Nb等于分组长度除以4。

符号说明:

Nb-明密文所含的数据字数。

Nk-密钥所含的数据字数。

Nr-迭代轮数。

⎡y⎤⎡1

⎢y⎥⎢1

y⎥

⎢3=⎢1

⎢y⎥⎢0

⎢y⎥⎢0

0001111⎤⎡x⎤⎡1⎤

⎥⎢x⎥⎢1⎥

1110001⎥⎢x⎥⎢0⎥

+

1111100⎥⎢x⎥⎢1⎥

0111110⎥⎢x⎥⎢1⎥

⎣⎣⎦⎣⎣⎥

2.1、S盒变换

S盒变换其实是一个查表的过程,分别取一个字节的高4位和低4位作为行值和列值(因此是),然后在S盒中找到对应的字节替换之。该变换是一个非线性变换。这个非线性就体现在S盒的构造上。S盒变换是AES的唯一非线性变换,是AES安全的关键。

关于S盒是按如下方式构造:

1)初始化S盒,按行升序排列的字节初始化。行x列y的字节是xy,行号和列号从0开始计数。

2)求出每一个元素在GF(2^8)中的逆。00被映射为它自身。

3)仿射变换。对上一步中的每一个字节的每一位作如下变换

yi=xi+x(i+4)mod8+x(i+5)mod8+x(i+6)mod8+x(i+7)mod8+ci,Ci是字节0x63的第i位。

该变换用矩阵表示如下所示:

⎢1⎥⎢

⎢y⎥⎢1

⎢2⎥⎢

⎢y⎥⎢1

⎢4⎥⎢

5

⎢6⎥⎢

⎢y

7

⎥⎦⎢0

1000111

⎥⎢1⎥⎢⎥

1100011⎥⎢x⎥⎢0⎥

⎥⎢2⎥⎢⎥

3

1111000⎥⎢x⎥⎢0⎥

⎥⎢4⎥⎢⎥

5

⎥⎢6⎥⎢⎥

0011111⎥⎢x

7

⎥⎦⎢0⎦

2.2、行移位变换

在行移位变换中,状态的第一行没有任何变化,第二行循环移位C1字节,第三行循环移位C2字节,第四行循环移位C3字节。位移量C1、C2和C3与分组长度Nb有关,如下表:

行移位举例如下所示:

2.3、列混合变换

列混淆即是用一个常矩阵乘以第二步变换后的矩阵,以达到矩阵中每一个元素都是该元素原所在列所有元素的加权和。

2.4、轮密钥加变换

状态与轮密钥(16byte)异或相加。轮密钥由种子密钥通过密钥调度算法产生得到,轮密钥长度等于分组长度Nb。

3、密钥调度算法

轮密钥是通过密钥调度算法从密钥中产生的,这其中包括两个部分:密钥扩展和轮密钥选取。基本原理如下:

1、所有轮密钥比特的总数等于轮数加1乘以分组长度(如128比特的分组长度

和10轮迭代,共需要1408比特的密钥);

2、将密钥扩展成一个扩展密钥;

3、轮密钥按下述方式从扩展密钥中选取:第一个轮密钥由一开始的N b个字组

成,第二个轮密钥由接下来的Nb个字组成,如此继续下去。

3.1密钥扩展

扩展密钥用数组W[Nb*(Nr+l)]表示,前Nk个字是种子密钥,其它的密钥字通过递归定义生成。由于密钥扩展函数取决于Nk的值,我们分了Nk≤6和Nk>6两种情况。对于密钥扩展,用类C语言描述如下:

KeyExpansion(byte key[4*Nk],word w[Nb*(Nr+1)],Nk)

begin

word temp

i=0

while(i

w[i]=word(key[4*i],key[4*i+1],key[4*i+2],key[4*i+3])

i=i+1

end while

i=Nk

while(i

temp=w[i-1]

if(i mod Nk=0)

temp=SubWord(RotWord(temp))xor Rcon[i/Nk]

else if(Nk>6and i mod Nk=4)

temp=SubWord(temp)

end if

w[i]=w[i-Nk]xor temp

i=i+1

end while

end

扩展算法如下:

①最前面的Nk个字是由种子密钥填充的。

②之后的每一个字W[j]等于前面的字W[j-1]的与Nk个位置之前的字W[j-Nk]的异或。

③而且对于Nk的整数倍的位置处的字,在异或之前,对W[j-1]的进行如下变换:

1、字节的循环移位RotByte,即当输入字为(a,b,c,d)时,输出字为(b,c,d,a)

2、用S盒进行变换字中的每个字节

3、异或轮常数Rcon[i/Nk]

轮常量是一个字,这个字最右边三个字节总是0。每轮的轮常量均不同,其定义为Rcon[j]

=(RC[j],0,0,0),其中RC[1]=1,RC[j]=2*RC[j-1],且乘法定义在域GF(2^8)上。

j1234567810

9

RC[j](HEX)041036 0102082040801B

3.2轮密钥的选择

在进行密钥加时,密钥长必须与分组长相等,所以第i轮的密钥与分组长度有关,并

相关文档
最新文档