比较简单的FPGA项目,主要亮点在于消耗的资源比较少吧,加密加解密整个模块在Spartan6 xc6slx9下验证为463 Slice,在Cyclone IV下验证为805 LE。网上大多数代码只有加密部分,也没有仔细考虑过优化。源代码已经上传至github。毕竟还是第一次做大一点的项目,不够完善的地方还请多多指教。
整体模块按功能可分为加密部分和解密部分,通过输入端口mode进行选择。实际功能模块有,加密解密共用的密钥异或模块Xorkey,S盒替换模块Dsbox、Inv_sbox,行变换模块Row_trans,列混合模块Col_trans以及密钥扩展模块Key8bit。由于解密部分与加密的执行顺序不同以及解密部分密钥扩展的特殊性,针对解密部分还有时序调整 Time_adjust、Inv_comb模块,密钥存储模块Keysave,以及一片用于存储输入数据的FIFO。整体由Control模块控制。
对于加密,Xorkey模块将输入的数据进行异或,Dsbox由rom实现,行变换Row_trans模块输出地址至ram,Col_trans从ram中读取数据并进行相应的运算,密钥扩展与以上模块并行处理,一轮耗时22个时钟,从数据输入到输出完毕共用231个时钟,速率为27.7Mbps,资源消耗476LE。
对于解密,先算完十轮密钥扩展,并存至ram中,再进行类似加密的轮变换,只是密钥异或模块的密钥需从ram中取得。十轮密钥扩展完毕并存储花费227个时钟,十轮异或运算花费226个时钟,速率为14.1Mbps,资源消耗在600左右。(写解密的时候直接在加密模块上进行的逻辑修改,没有单独的数据,从后期结果推算的大致结果)。整体消耗805LES,RTL schematic图如下:
总体设计框图如下:
其中part of decryption是指与解密与加密不同的部分,包括对扩展密钥的存储、用于输入数据的FIFO以及部分时序调整。控制模块Control用于加密和解密的切换。
下面分别从加密和解密两个部分进行子模块和结构的描述。
加密部分算法流程图如下:
针对该加密算法,设计的模块及功能如下:
Xorkey:与扩展密钥进行异或运算
Dsbox:S盒变换
Row_trans:行变换
Col_trans:列变换
Key8bit:密钥扩展模块
下面一一进行阐述。
密钥异或模块将输入的8bit明文和密钥进行异或,由输入使能enain控制,enaout为输出使能,消耗9个LE。
Dsbox使用了双口rom,一方面用于变换Xorkey的输出数据,一方面用于密钥扩展时最后一列的S盒变换。
DSbox模块出输出数据通往ram,同时Row_trans模块接受到使能信号后,按照一定的规律向ram输入写入的数据地址,消耗20个LE。
如上所示,使能信号为高时,计数器counter从0记到15,计算地址部分根据mode的不同输出相应的地址。Wren是ram的写使能信号,col_st是加密部分中通往列变换模块的使能信号。Addrout是通往ram的写地址,由于采用了乒乓操作,位宽为5。
加密和解密的列变换算法不同,在轮变换中的顺序也不同,解密稍复杂一些。在加密功能中,col_trans接收到col_st为高后,从ram中按顺序读出数据,采用并行计算的方法,读入一个数据进行4次计算,读入4个数据后可开始输出结果。由于列变换中使用的第4个数据是行变换之前的最后一个数据,因此在行变换开始后的12个时钟,列变换模块才能开始从ram中读取数据,又经过4个时钟后才能输出,故该模块需要16个时钟。加密加上解密的列变换一共消耗321个LE。