SubBytes(State);
ShiftRow(State);
MixColumn(State);
AddRoundKey(State,ExpandedKey);
}
//最后一轮
SubBytes(State);
ShiftRow(State);
AddRoundKey(State,ExpandedKey);
Ciphertext=state;
}
其中plaintext是输入明文,可以定义成plaintext[4×Nb]数组;ciphertext是输出密文,可以定义成ciphertext[4×Nb]数组;CipherKey是加密密钥,可以定义成CipherKey[4×Nk]数组;圈密钥ExpandedKey可表示成w[Nb×(Nr+1)]数组;State是状态,整个加密过程都是针对State进行的。
(1)S盒变换SubBytes()
S盒变换又称字节替代变换,是一个针对字节的非线性、可逆变换。
它将状态中的每一个字节进行非线性变换转换为另一个字节,作用在状态上每个字节的变换可以表示为SubBytes(state)。
可以将变换SubBytes()对各种可能字节的变换结果排成一个表,如表2-3所示,该表称为AES的S盒。
通过查表可以直接得到SubBytes()的输出,这样可以加快程序执行的速度。
如果状态中的一个字节为xy,则S盒中第x行第y列的字节就是SubBytes()的输出。
表2-3S盒变换表
Tab.2-3ThetableofS-boxtransformation
列号y
0
1
0
3
4
5
6
7
8
9
A
B
C
D
E
F
行
号
x
0
63
7C
77
7B
F2
6B
6F
C5
30
01
67
2B
FE
D7
AB
76
1
CA
82
C9
7D
FA
59
47
F0
AD
D4
A2
AF
9C
A4
72
C0
2
B7
FD
93
26
36
3F
F7
CC
34
A5
E5
F1
71
D8
31
15
3
04
C7
23
C3
18
96
05
9A
07
12
80
E2
EB
27
B2
75
4
09
83
2C
1A
1B
6E
5A
A0
52
3B
D6
B3
29
E3
2F
84
5
53
D1
00
ED
20
FC
B1
5B
6A
CB
BE
39
4A
4C
58
CF
6
D0
EF
AA
FB
43
4D
33
85
45
F9
02
7F
50
3C
9F
A8
7
51
A3
40
8F
92
9D
38
F5
BC
B6
DA
21
10
FF
F3
D2
8
CD
0C
13
EC
5F
97
44
17
C4
A7
7E
3D
64
5D
19
73
9
60
81
4F
DC
22
2A
90
88
46
EE
B8
14
DE
5E
0B
DB
A
E0
32
3A
0A
49
06
24
5C
C2
D3
AC
62
91
95
E4
79
B
E7
C8
37
6D
8D
D5
4E
A9
6C
56
F4
EA
65
7A
AE
08
C
BA
78
25
2E
1C
A6
B4
C6
E8
DD
74
1F
4B
BD
8B
8A
D
70
3E
B5
66
48
03
F6
0E
61
35
57
B9
86
C1
1D
9E
E
E1
F8
98
11
69
D9
8E
94
9B
1E
87
E9
CE
55
28
DF
F
8C
A1
89
0D
BF
E6
42
68
41
99
2D
0F
B0
54
BB
16
(2)行移位变换ShiftRows()
行移位是将状态阵列的各行进行循环移位,不同状态行的位移量不同。
第0行不移位,保持不变,第1行移动C1个字节,第2行移动C2个字节,第3行移动C3个字节。
C1,C2,c3值依赖于分组长度Nb的大小。
位移量C1、C2和C3与分组长度Nb有关,如下表:
表2-4对应于不同分组长度的位移量
Tab.3-3thedisplacementcorrespondingtodifferentpacketlength
Nb
C1
C2
C3
4
1
2
3
6
1
2
3
8
1
3
4
在AES加密标准中Nb=4。
(3)列混合变换MixColumns()
列混合变换是对一个状态逐列进行变换,它将一个状态的每一列视为有限域GF(28)上的一个多项式。
令
则
其中,,是AES选择的一个逆元多项式,表示模乘法。
将表示为矩阵乘法:
(2-3)
相乘之后每一列的结果如下:
(4)轮密钥加AddRoundKey()变换
轮密钥加是将轮密钥简单地与状态矩阵进行逐比特异或运算。
每个轮密钥由密钥扩展算法得到,轮密钥的长度为Nb个字。
轮密钥按顺序取自扩展密钥ExpandedKey,扩展密钥是由原始密钥经过扩展后得到的,扩展密钥的长度为Nb(Nr+1)个字。
1.2AES的密钥扩展过程
AES算法得到初始密钥K后,首先经过一个密钥扩展过程以产生所有的轮密钥。
密钥扩展共产生Nb(Nr+1)个字,算法初始需要一个Nb个字的集合,接着每个轮操作都需要Nb个字的密钥数据。
最终的密钥流程共包含了一个4字节字的线性数组,用[wi]表示,。
扩展密钥程序涉及RotWord()、SubWord()和Rcon()模块。
它们的工作方式如下:
(1)位置变换RotWord():
把一个4字节的输入序列(a0,a1,a2,a3)循环左移一个字节后输出。
例如将(a0,a1,a2,a3)循环左移一个字节后输出为(a1,a2,a3,a0)。
(2)SubWord():
把一个4字节的输入序列(a0,a1,a2,a3)的每一个字节进行S盒变换,然后作为输出。
(3)变换Rcon[]:
Rcon[]是一个10个字节的常量数组,Rcon[i]是一个32比特字符串(xi-1,00,00,00)。
这里x=(02),xi-1是x=(02)的(i-1)次幂的十六进制表示,即x0=(01),x=(02),xi={02}·xi-1。
这里“·”表示有限域GF(28)中的乘法。
密钥扩展前Nk个字就是外部密钥CipherKey,以后的字w[i]等于它前一个字w[i-1]与前Nk个字w[i-Nk]的异或,w[i]=w[i-Nk]⊕SubWord(RotWord(w[i-1]))⊕Rcon[i/Nk]。
输入密钥扩展的整个过程可以用下面的程序段描述:
KeyExpansion(bytekey[4*NK],wordw[Nb*(Nr+1)],Nk)
begin
wordtemp
i=0
while(iw[i]=word(key[4*i],]key[4*i+1],key[4*i+2],key[4*i+3]
i=i+1
endwhile
i=Nk
while(itemp=w[i-1]
if(imodNk=0)
temp=Subword(Rotword(temp))xorRcon[i/Nk]
elseif(Nk>6andimodNk=4)
temp=Subword(temp)
endif
w[i]=w[i-Nk]xortemp
i=i+1
endwhile
end
2、AESIP核的体系结构设计方案
2.1AES模块框图及外部信号说明
图2AES模块框图
表1AES模块外部信号说明
信号名称
信号宽度
传输方向
信号含义
clk
1位
输入
时钟信号
rst
1位
输入
复位信号,1有效。
load
1位
输入
数据装载使能信号,用于控制输入明/密文、密钥、S盒配置数据等,1有效。
address
8位
输入
寄存器或RAM地址,用于表示明文/密文/密钥寄存器、S盒RAM单元。
keyexpen
1位
输入
密钥扩展使能信号,1有效。
keyexprdy
1位
输出
密钥扩展完成标识信号,1有效。
staenc
1位
输入
开始加密使能信号,1有效。
stadec
1位
输入
开始解密使能信号,1有效。
encdecrdy
1位
输出
加/解密运算完成标识信号,1有效。
din
16位
输入
输入数据总线,用于输入明/密文、密钥、配置数据等。
dout
16位
输出
输出数据总线,用于输出加/解密结果。
shift
1位
输入
结果移位输出使能信号,1有效。
有效时,每个时钟周期移位输出16位结果。
2.2AES模块体系结构
AES模块包括明/密文和密钥寄存器、密钥扩展、加/解密运算、控制等多个子模块,其系统结构图如下图所示。
图3AES模块系统结构图
每个子模块的功能如下:
1.明文/密文/密钥寄存器的功能:
在时钟信号clk的上升沿,若寄存器写使能信号write有效,则将输入数据总线din上的16位数据写入明文/密文/密钥寄存器的高16位,同时将寄存器原来的数据右移16位放入寄存器的低112位。
若寄存器写使能信号write无效,则寄存器保持原来的数据不变。
由此可见,1个128位的数据需要经过8个时钟周期,通过8次写操作才能装入寄存器。
2.密钥扩展模块的功能:
AES算法首先得到初始密钥K后,执行一个密钥扩展程序以产生所有的轮密钥。
密钥扩展共产生Nb(Nr+1)个32bit字,算法初始需要一个Nb个32bit字的集合,接着每个轮操作都需要Nb个32bit字的密钥数据。
3.加密/解密模块的功能:
实现AES加密和解密。
AES加密过程由一个初始密钥