AES加密解密算法的FPGA实现(二)

解密部分结构设计


加密部分总体概述


加密部分算法如下:
AES加密解密算法的FPGA实现(二)_第1张图片

解密部分与加密部分大体一致,故而Xorkey、key8bit、用于行变换的dpram,用于key8bit的sbox是通用的,row_trans和col_trans进行了部分改变。同时,考虑到解密部分的密钥异或模块使用的密钥与密钥扩展运算顺序相反,即第一次密钥异或模块使用的密钥是密钥扩展第十轮的结果,第二次则为第九轮结果……故采取先算出十轮密钥扩展结果并进行存储,轮变换时再进行读取并运算的方法。
解密部分用于密钥扩展有Simreq, Time_adjust与Keysave模块,存储输入数据使用了一片FIFO,逆Sbox运算使用Inv_sbox模块,同时增加了用于调整运算顺序的Inv_comb模块。
解密部分的所有模块如下:
Inv_storekey:用于存输入数据的FIFO
Simkeyreq:模拟keyreq变化
Key8bit:密钥扩展模块(与加密共用)
Sbox用于密钥扩展部分(共用)
Time_adjust:密钥读写地址控制
Keysave:用于存扩展秘钥的ram
Xorkey:密钥异或模块(共用)
Inv_sbox:逆S盒变换
Row_trans:行变换(部分共用)
Dpram:用于行变换的ram(共用)
Col_tran:列变换(部分共用)
Inv_comb:解密运算顺序调整
下面重点阐述解密与加密不同的模块。

解密部分密钥扩展结构

由于key8bit消耗资源比较多,故解密部分需要充分利用key8bit模块。考虑到key8bit的使能输入是keyreq,持续16个周期的高电平,key8bit会算完一轮扩展密钥,故解密部分通过Simkeyreq模块模拟keyreq的变换控制key8bit进行十轮运算,Time_adjust模块用于输出相应的写地址至ram(keysave)中,同时也输出相应的写使能。Simkeyreq模块结构如下:

AES加密解密算法的FPGA实现(二)_第2张图片

其中enain是用户的输入信号,cycle_cnt是来自key8bit的密钥扩展次数。Simkeyreq耗用17LE。 Time_adjust模块结构如下:

AES加密解密算法的FPGA实现(二)_第3张图片

keyreq是来自Simkeyreq的信号,用于计算密钥扩展输出时的写地址与写使能信号wren,keyreqaddr是来自轮变换的取密钥信号,keyreqaddr为高时模块计算通往ram的读地址rd_addr。Inv_cyclecnt是轮变换的次数,用于计算rd_addr。Time_adjust耗用26个LE。 Keysave模块是一个准双口ram,用于存储扩展后的密钥。下图是Simkeyreq、keysave和Time_adjust模块连接示意图

AES加密解密算法的FPGA实现(二)_第4张图片

密钥扩展花费226个时钟,写代码的时候这里没注意还能不能进行时间上的优化,之后会进一步考虑。

运算控制Inv_comb模块设计结构

由于解密部分与加密部分的运算顺序的不同,故设计一个Inv_comb模块进行密钥异或,行变换、列变换之间的调控以及轮变换进行次数的计算。

AES加密解密算法的FPGA实现(二)_第5张图片

enain是行变换的输出使能,Rd_addr是通往行变换ram的读地址,enaout是通往Xorkey的输入使能,keyreqaddr是通往Time_adjust的扩展密钥读使能信号,Inv_cyclecnt是轮变换运算次数的输出。该模块消耗45个LE。写到这里发现该模块的rd_addr与列变化模块有重复之处,应该可以继续优化。

AES加密解密模块实现结果

按照本文所设计的结构,分别采用Altera公司的CycloneIV和Xilinx公司的Spartan6 xc6slx9FPGA进行综合,得到结果如下。

CycloneIV(LE) Spartan6(Slice)
加密 476(6%) 265(5%)
整体 805(13%) 463(8%)

加密速率为27.7Mbps,解密速率为14.1Mbps。考虑到秘钥扩展部分以及解密模块的部分逻辑重复应该还有一定的速率和资源的优化空间。

你可能感兴趣的:(个人项目(FPGA))