temp=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加密过程由一个初始密钥加(异或)变换和十个轮变换构成,其中除第10个轮变换外,每个轮变换都是一样的,都是由字节代替(S盒变换)、行移位、列混合、密钥加4个子变换组成,第10个轮变换由字节代替、行移位、密钥加3个子变换组成,不包括列混合变换。
通过类似分析,可以得出AES解密过程包括逆S盒变换、09乘字节、0b乘字节、0d乘字节、0e乘字节、异或共6种操作。
4.控制模块的功能:
用于控制密钥扩展过程的执行,控制加密过程的执行,控制解密过程的执行。
2.3密钥扩展子模块体系结构
1)密钥扩展模块的电路结构如下图所示:
2)密钥扩展模块的外部信号如下表所示:
信号名称
信号宽度
传输方向
信号含义
clk
1位
输入
时钟信号。
rst
1位
输入
复位信号,1有效。
有效时使轮常数产生模块输出第一个轮常数。
keysel
1位
输入
轮密钥选择信号,keysel=0选择密钥寄存器中的种子密钥,否则,选择经过密钥扩展变换的轮密钥。
rndkren
1位
输入
轮密钥寄存器写使能信号,1有效。
wrrndkrf
1位
输入
轮密钥寄存器堆写使能信号,1有效。
addr
4位
输入
轮密钥寄存器堆地址,表示11个轮密钥寄存器的地址。
rconen
1位
输入
轮常数寄存器写使能信号,1有效。
当有效时将下一个轮常数写入轮常数寄存器。
key
128位
输入
种子密钥,来自于密钥寄存器的输出。
rndkrfout
128位
输出
轮密钥寄存器堆的输出,为加解密模块提供需要的轮密钥。
密钥扩展模块由1个128位的轮密钥寄存器rndkreg、1个11*128的轮密钥寄存器堆rndkrf、1个轮常数产生模块rcon、1个字节代替模块subword、1个32位的循环左移移位器rotword、1个128位的二选一选通器MUX以及5个32位异或器构成。
3)其电路工作原理如下:
在进行密钥扩展之前,首先令复位信号rst=1,以便使轮常数产生模块输出第1个轮常数。
然后,在第1个时钟周期,通过选通器选择种子密钥key作为第1个子密钥,并在本周期结束时的时钟上升沿,将其同时保存到轮密钥寄存器rndkreg和轮密钥寄存器堆rndkrf。
在第2个时钟周期,对保存在轮密钥寄存器rndkreg中的第1个子密钥先后进行循环左移、字节代替变换、异或、选通操作得到第2个子密钥,并在本周期结束时的时钟上升沿,将其同时保存到轮密钥寄存器rndkreg和轮密钥寄存器堆rndkrf。
重复第2个时钟周期的操作10次,就可以得到AES第1-10轮迭代所需要的轮密钥。
这样,经过11个时钟周期之后,AES加密/解密所需的全部11个子密钥就都产生出来了,并且被保存在轮密钥寄存器堆rndkrf中。
4)各个子模块的功能以及各子模块之间的相互关系与信号连接为:
其中,循环左移运算实现对一个32位的数据循环左移8位,在电路实现时通过硬件连线即可实现,无须设计专门的移位电路。
字节代替变换由4个8*8S盒实现,S盒采用查表方式实现。
为了充分利用cycloneFPGA中的RAM资源,减少LE(逻辑单元)的使用数量,我们利用cycloneFPGA中的RAM构建了一个8*8的ROM作为S盒,该ROM共有256个的存储单元,每个存储单元存储一个字节,这256个字节就是实现S盒变换的查找表。
该ROM可以利用quartusII的megafunction工具自动生成,但需要注意的是该ROM的地址要经寄存器锁存以后才能进入ROM,因此在地址有效的下一个周期才能在ROM的输出端口得到读出的数据。
二选一选通器MUX用于选择外部输入的种子密钥或者内部逻辑产生的数据作为子密钥。
轮密钥寄存器rndkreg是1个128位的寄存器,用于暂时保存当前产生的子密钥,以便产生下一个子密钥时使用。
轮密钥寄存器堆rndkrf共有11个128位的存储单元,用于保存密钥扩展以后的全部11个子密钥,供AES加密/解密使用。
轮常数产生模块rcon由1个8位寄存器和轮常数产生逻辑构成,当复位时,寄存器输出第一个轮常数,当轮常数寄存器写使能信号rconen有效时,将由轮常数产生逻辑产生的下一个轮常数写入轮常数寄存器。
5)密钥扩展的程序描述:
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.4加密子模块体系结构
1)AES加密/解密模块的电路结构如下图所示
2)AES加密/解密模块的外部信号如下表所示:
信号名称
信号宽度
传输方向
信号含义
clk
1位
输入
时钟信号。
wrsben
1位
输入
向S盒写入配置数据的使能信号,1有效。
wrsbaddr
7位
输入
S盒配置数据的地址,一个S盒包含256个字节,一次写入16位,因此共需要写128次,需要128个地址,所以需要7位地址码。
sbdata
16位
输入
S盒配置数据。
keyadsel
2位
输入
密钥加操作输入数据选择信号,
mixsel
1位
输入
选择是否进行逆列混合变换,在进行第1-9轮解密变换时为1,其余时间为0。
reginsel
1位
输入
结果寄存器输入数据选择信号。
wrregen
1位
输入
结果寄存器写使能信号,1有效。
intxt
128位
输入
外部输入数据(明文或密文)。
roundkey
128位
输入
子密钥。
shift
1位
输入
结果寄存器移位使能信号,1有效,有效时将128位结果寄存器中的数据右移16位。
outtxt
16位
输出
输出数据(加密/解密结果)。
AES加密过程由一个初始密钥加(异或)变换和十个轮变换构成,其中除第10个轮变换外,每个轮变换都是一样的,都是由字节代替(S盒变换)、行移位、列混合、密钥加4个子变换组成,第10个轮变换由字节代替、行移位、密钥加3个子变换组成,不包括列混合变换。
类似分析,可以得出AES解密过程包括逆S盒变换、09乘字节、0b乘字节、0d乘字节、0e乘字节、异或共6种操作。
3)AES加密/解密模块的工作原理如下:
加密流程:
首先将S盒配置为加密S盒,即在使能信号wrsben和地址信号wrsbaddr的控制下,通过S盒配置数据端口sbdata将加密S盒配置数据写入16个S盒sbox0~sbox15。
然后实现初始密钥加变换,即在选择信号keyadsel的控制下,通过四选一选通器选择外部输入明文数据intxt,与初始子密钥roundkey进行异或操作,并在选择信号reginsel的控制下,通过二选一选通器将异或操作的结果e0~e15保存到S盒的输入寄存器。
接下来进行第一轮加密变换,即初始密钥加变换的结果经sbox0~sbox15完成S盒变换后,在选择信号mixsel的控制下,通过二选一选通器进入byte0203模块,完成02乘字节和03乘字节运算,然后进行(5)式中前4项的异或运算,得结果c0~c15,在选择信号keyadsel的控制下,通过四选一选通器选择c0~c15与第一轮子密钥进行异或操作,从而得到第一轮加密变换的结果e0~e15,并将其保存到S盒的输入寄存器,作为下一轮加密变换的输入数据。
依次类推,可以完成第1-9轮加密变换。
最后进行第10轮加密变换,即第9轮加密变换变换的结果经sbox0~sbox15完成S盒变换后,在选择信号keyadsel的控制下,通过四选一选通器选择恰当的S盒输出与第10轮子密钥进行异或操作,即可得到密文,最后将其保存到结果寄存器resultreg。
初始密钥加变换和每轮加密变换都在一个周期内完成,因此上述加密过程共需要11个时钟周期。
解密流程:
首先将S盒配置为解密S盒,配置过程与加密S盒配置过程一样,只是配置数据不同。
然后实现初始密钥加变换,即在选择信号keyadsel的控制下,通过四选一选通器选择外部输入密文数据intxt,与初始子密钥roundkey进行异或操作,并在选择信号reginsel的控制下,通过二选一选通器将异或操作的结果e0~e15保存到S盒的输入寄存器。
接下来进行第一轮解密变换,即初始密钥加变换的结果经sbox0~sbox15完成逆S盒变换后,再与第一轮子密钥进行异或操作,然后在选择信号mixsel的控制下,通过二选一选通器进入byte0203模块和byte9bde模块,完成进行逆列混合变换所需要的字节乘法运算(即09乘字节、0b乘字节、0d乘字节和0e乘字节),然后通过一系列异或运算得列混合变换的结果g0~g15,在选择信号reginsel的控制下,通过二选一选通器选择g0~g15输出,从而得到第一轮解密变换的结果h,并将其保存到S盒的输入寄存器,作为下一轮解密变换的输入数据。
依次类推,可以完成第1-9轮解密变换。
最后进行第10轮解密变换,即第9轮加密变换变换的结果经sbox0~sbox15完成逆S盒变换后,在选择信号keyadsel的控制下,通过四选一选通器选择恰当的S盒输出与第10轮子密钥进行异或操作,即可得到明文,最后将其保存到结果寄存器resultreg。
初始密钥加变换和每轮解密变换都在一个周期内完成,因此上述解密过程共需要11个时钟周期。
需要注意的是,解密过程使用的子密钥与加密过程使用的子密钥相同,但使用顺序恰好相反。
4)AES加密过程可用伪代码描述为:
Cipher(bytein[4*4],byteout[4*4],wordw[4*(Nr+1)])
Begin
Bytestate[4,4]
State=in
AddRoundKey(state,w[0,3])
Forround=1step1toNr-1
SubBytes(state)
ShiftRows(state)
MixColumns(state)
AddRoundKey(state,w[round*4,(round+1)*4-1])
Endfor
SubBytes(state)
ShiftRows(state)
AddRoundKey(state,w[Nr*4,(Nr+1)*4-1])
Out=state
End
5)AES解密过程是加密过程的逆过程,可用伪代码描述为:
InvCipher(bytein[4*4],byteout[4*4],wordw[4*(Nr+1)])
Begin
Bytestate[4,4]
State=in
AddRoundKey(state,w[Nr*4,(Nr+1)*4-1])
Forround=Nr-1step-1to1
InvShiftRows(state)
InvSubBytes(state)
AddRoun