AES分组对称加密算法学习笔记

      • State说明
      • S盒变换SubBytes
      • 行变换ShiftRows
      • 列变换MixColumns
      • 与扩展密钥的异或运算AddRoundKey
      • 密钥扩展程序Key Expansion
      • 参考文献

我们首先对AES分组对称加密算法有一个宏观的了解,它的模式主要为
AES分组对称加密算法学习笔记_第1张图片
AES分组对称加密算法学习笔记_第2张图片

以下是AES主要加密过程的伪代码。

Cipher(byte in[4*4] , byte out[4*4] , word w[4*(Nr+1)])
begin
byte state[4,4]
state=in
AddRoundKey(state,w)   //See Sec.3 .1 .4
for round=1 step 1 to Nr-1
  SubBytes(state)   //See Sec.3 .1 .1
  ShiftRows(state)  //See Sec.3 .1 .2
  MixColumns(state)  //See Sec.3 .1 .3
  AddRoundKey(state ,w +round *4)
end for
SubBytes(stat e)
ShiftRows(state)
AddRoundKey(state ,w +Nr *4)
out=state
end

State说明

state是一个4*4的数组,如果输入是ABCDEFGHIJKLMNOP,那么state将是:

A E I M
B F J N
C G K O
D H L P

S盒变换SubBytes()

注:S盒是一个16*16的矩阵,这是一个事先设计好的矩阵,S盒的设计很大程度影响了该加密的安全性。

S盒变换的具体流程是:
(1)对于一个输入A,可以看做是一个8位二进制数。
比如A=11010100 这时转换为16进制即c4,分解为两部分x=c ,y=4
(2)从S盒中找出S[ x , y]的值
比如:S[ x , y] =S[ c , 4] ={1c}=00011101
即完成了变换

行变换ShiftRows()

在行变换中, 中间状态矩阵State 的第一行不变;第二至第四行做如下变换, 即将表3 的状态矩阵变为表4的状态矩阵。其中State是一个4*4的矩阵
AES分组对称加密算法学习笔记_第3张图片

列变换MixColumns()

列变换是对中间状态矩阵State 逐列进行变换。其变换为如下的矩阵运算
AES分组对称加密算法学习笔记_第4张图片
这里每运算一次,得到的是一列的结果,因此一共要运算4次,得到4列的结果。
这里得到的新列是:
S(0, c)′= ({02}×S(0, c))⊕({03}×S(1 , c))⊕S(2 , c)⊕S(3, c)
S(1, c)′=S(0 , c)⊕({02}×S(1, c))⊕({03}×S(2 , c))⊕S(3 , c)
S(2, c)′=S(0 , c) ⊕S(1, c)⊕({02}×S(2 , c))⊕({03}×S(3 , c)
S(3, c)′=({03}×S(0 , c))⊕S(1, c)⊕S(2 , c)⊕({02}×S(3 , c))

其中⊕是异或运算,而×是按模乘同余规则计算。
所模乘同余规则就是,对于一个8位二进制数{b7b6b5b4b3b2b1b0}可以视为 b7x7+b6x6+b5x5+b4x4+b3x3+b2x2+b1x+b0

若两个数相乘,比如{57}×{83} 即{‭00111001‬}×{‭01010011‬}=
(x6+x4+x2+x+1)×(x7+x+1)=x13+x11+x9+x8+x6+x5+x4+x3+1
但是很显然,乘完后结果的位数超过了8,这里为了恢复为8位长,将该结果模一个八次不可约多项式,在AES 中这个八次不可约多项式为 m(x)=x8+x4+x3+x+1 则:

(x13+x11+x9+x8+x6+x5+x4+x3+1)mod(x8+x4+x3+x+1)=x7+x6+1

得到结果为{11000001}={c1}
也就是{57}×{83}={c1}

与扩展密钥的异或运算AddRoundKey()

扩展密钥只参与了这一个变换。根据加密的轮数用相应的扩展密钥的四个数据项和中间状态矩阵上的列进行按位异或。
[ S(0 , c)′,S(1 , c)′, S(2, c)′, S(3 , c)′] =[ S(0 , c), S(1 , c), S(2 , c),S(3 , c)] XOR[W(round ×nb +c)]

密钥扩展程序Key Expansion

AES 算法利用外部输入密钥K(密钥串的字数为
Nk), 通过密钥扩展程序得到共4 (Nr + 1)字的扩展密
钥w[ 4 ×(Nr +1)] 。涉及如下三个模块:
(1)位置变换RotWord()。把一个四个字节的序列
[ a0 , a1 , a2 , a3] 左移一个字节变为[ a1 , a2 , a3 , a0] 。
(2)SubWord()。对一个四字节的输入字[ a0 , a1 ,
a2 , a3] 的每一个字节进行S 盒变换, 然后作为输出(见
3.1.1)。
(3)变换Rcon[ ] 。Rcon[ i] 表示32 比特字符串
[ xi-1 , 00 , 00 , 00] 。这里x =(02), xi-1 是x =(02)的(i-1)
次幂的十六进制表示。例如, Rcon[ 1] =[ 01000000] , Rcon[ 2] =
[ 02000000 ] , Rcon [ 3] = [ 04000000] , Rcon [ 4 ] = [ 08000000 ] , … ,
Rcon[ 10] =[ 36000000] 。
(4)扩展密钥的生成。扩展密钥的前Nk 个字就是
外部密钥K ;以后的字w[ [ i] ] 等于它前一个字w[ [ i-1] ]
与前第Nk 个字w[ [ i-Nk] ] 的异或, 即w[ [ i] ] =w[ [ i-1] ]
XOR w[ [ i-Nk] ] 。但是若i 为Nk 的倍数, 则w[ i] =w[ i
-Nk] XOR SubWord(RotWord(w[ [ i-1] ] ))XOR Rcon[ i/
Nk] 。
举例:
①设外部输入的加密密钥CipherKey = 2b 7e 15 16
28 ae d2 a6 ab f7 15 88 09 cf 4f 3c
Nk =4 , 则w0=2b7e1516 w1 =28aed2a6 w2 =abf71588 w3=09cf4f3c;
w4 =w0 XOR SubWord(RotWord(w3))XOR Rcon[ 4/ Nk] =a0fafe17 ;
w5 =w[ [ i-1] ] XORw[ [ i-Nk] =w[ [ 4] ] XOR w[ [ 1] ] =88542cb1 ;…
w43 = b6630ca6 。

参考文献:

何明星, 林昊. AES算法原理及其实现[J]. 计算机应用研究, 2002, 19(12):61-63. DOI:10.3969/j.issn.1001-3695.2002.12.018.

你可能感兴趣的:(算法,加密,aes)