2. 算法实现
2.1 AES算法每一轮都是用代替和混淆处理整个数据分组,由4个不同的阶段组成,包括:1)字节代替SubBytes:用一个S盒完成分组中的按字节的代替;2)行移位ShiftRows:一个简单的置换;3)列混淆MixColumns:一个利用在域GF(2^8)上的算术特性的代替;4)轮密钥加AddRoundKey:一个利用当前分组和扩展密钥的一部分进行按位异或。
2.2 给定一个明文X,将State初始化为X,并进行AddRoundKey操作,将轮密钥与State异或。对前Nr-1轮中的每一轮,用S盒进行一次SubBytes代替操作;对State做一次ShiftRows行移位操作;再对State做一次MixColumns列混淆操作;然后进行AddRoundKey操作。最后一轮(即第Nr轮)依次进行SubBytes,ShiftRows,AddRoundKey操作。将最后State中的内容定义为密文Y。即在第一轮之前要进行一个AddRoundKey操作,中间各轮依次进行SubBytes,ShiftRows,MixColumns,AddRoundKey操作,最后一轮中没有MixColumns操作。
伪代码描述为:
Cipher(byte in[4*Nb], byte out[4*Nb], word w[Nb*(Nr+1)]) Begin
Byte state[4, Nb] State=in
AddRoundKey(state,w)
for round=1 step 1 to Nr-1 //前Nr-1轮
SubBytes(state) ShiftRows(state) MixColumns(state)
AddRoundKey(state, wound*Nb) end for
SubBytes(state) ShiftRows(state)
AddRoundKey(state, w+Nr*Nb) out=state
end
其中in[],out[],w[]和state中分别存储加密处理的输入,输出,密钥和中间态数据;Nr和Nb分别为迭代轮数和中间态的列数。
2.3基本加密变换
2.3.1 S盒变换-SubBytes(字节运算)
SubBytes()变换是一个基于S盒的非线性置换,它用于将输入或中间态的每一个字节用过一个简单的查表操作,将其映射为另一个字节。映射方法是:把输入字节的高4位作为S盒的行值,,低4位作为列值,然后取出S盒中对应行和列的元素作为输出。例如,输入为“95(十六进制表示)”的值所对应的S盒的行值为’9’,列值为’5’,S盒中相应位置的值为’2a’,就说明’95’被映射为’2a’。 SubBytes()的伪代码描述如下: SubBytes(byte state[4, Nc], Nc) Begin
for r=0 step 1 to 3 for c=0 step 1 to Nc-1
State[r,c]=Sbox[state[r,c]] end for
end for
end
S盒(十六进制)
2.3.2 列混合变换-MixColumns(字运算) MixColumns()实现逐列混合,其方式是: S`(x)=c(x)*s(x)mod(x^4 + 1)
式中,c(x)={03}*x^3+{01}*x+{02},{}内的数表示是字节; s`(x)=s`0,c+s`1,c*x+s`2c*x^2+s`3,c*x^3; s(x)=s0c+s1c+s2c*x^2+s3c*x^3.
伪代码描述为:
MixColumns(byte state[4,Nc], Nc) begin byte t[4]
for c=0 step 1 to Nc-1 for r=0 step 1 to 3 t[r]=state[r,c]
end for for r=0 step 1 to 3
state[r,c]=FFmul(0x02, t[r])xor FFmul(0x03,t[(r+1)mod4])xor t[(r+2)mod4]xor t[(r+3)mod4] end for end for end
2.3.3 行移位运算--ShiftRows
ShiftRows()完成基于行的循环移位操作,变换方法如图所示,即行移位变换作用在中间态的行上,第0行不变,第1行循环左移1个字节,第2行循环左移2个字节,第3行循环左移3个字节。
ShiftRows()的伪代码描述: ShiftRows(byte state[4,Nc],Nc) begin byte t[Nc]
for r=1 step 1 to 3 for c=0 step 1 to Nc-1
t[c]=state[r,(c+h(r,Nc))moodNc]

