3.2.3 密钥扩展
在进行加密变换的时候,需要将状态与轮密钥进行多轮的按位异或,加密操作共需要Nr+1个轮密钥。
获得扩展密钥的伪代码如下[9]:
KeyExpansion(byte key[4*Nk], word w[Nb*(Nr+1)], Nk)
Begin
word temp;
i = 0;
while (i < Nk)
w[i] =f 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 < Nb * (Nr+1))
temp = w[i-1];
if (i mod Nk == 0)
temp = SubWord(RotWord(temp)) xor Rcon[i/Nk];
else if (Nk > 6 and i mod Nk = 4)
temp = SubWord(temp);
end if
w[i] = w[i-Nk] xor temp;
i = i + 1;
end while
end
其中
1、函数SubWord()对输入的4字节字中的每个字节施加S盒操作;
2、函数RotWord()对输入的4字节字进行一个字节的循环左移;
3、Rcon[i]为轮常数,由4字节组成。Rcon[i] = {xi-1, ’00’, ’00’, ’00’},其中x0为’01’,x1为’02’,x2为’04’,x3为’08’,。
3.2.4 AES加密算法的伪代码[10]:
Rijndael(State,Cipherkey)
{
KeyExpansion(Cipherkey,Expandedkey)
Addroundkey(state,Expandedkey)
For i=1 step 1 to Nr-1
Subbytes(state)
Shiftrows(state)
Mixcolumns(state)
Addroundkey(state,Expandedkey+Nb*i)
End for
Subbytes(state)
Shiftrows(state)
Addroundkey(state,Expandedkey+Nb*Nr)
End
}
3.3 AES解密算法说明
3.3.1 轮函数
解密部分流程与加密部分是一样的,只有所使用的函数均为加密部分的逆函数:
1、逆字节替代变换InvSubBytes():使用了与加密过程互逆的S盒,置换过程与加密是相同。例如,值为32h的字节将被置换为S盒中第3行、第2列的值,即被置换为a1h,与加密置换前的原值相同。
2、逆移行变换InvShiftRows():对状态数组的每一行进行循环右移操作,循环右移的为数取决于行号,与加密时循环左移的为数相同。
3、逆混列变换InvMixColumns():逆混列变换的过程与混列变换的过程是一样的,只有使用的列混合矩阵是与加密不同的,两个矩阵互逆。