下面先分别描述各运算的内部功能,最后将它们全部连接起来,构成组合逻辑运算模块block_top。
3.3.1 选择扩展运算E
选择扩展运算的实现非常简单,只要按照表2-4所示,将输入的32bit数据映射到输出即可。为了描述的方便,程序将输出的48bit分为8组,每组6bit。这样,可以提高程序可读性,并有利于后文中的S盒压缩运算。选择扩展运算模块的管脚如图3-5所示,输入数据为32bit,被扩展为48bit,并分为8组输出。
图3-5 选择扩展运算模块管脚图
3.3.2 异或加密运算
异或加密运算的实现非常简单,将选择扩展运算输出的48bit数据(8组,每组6bit)与48bit的子密钥逐位进行异或运算。异或加密运算模块的管脚图如图3-6所示。
图3-6 异或加密运算模块管脚图
3.3.3 S盒压缩运算
S盒压缩运算包括8个S盒的代换,而每个S盒的代换规律又都不相同。因此,必须逐个描述S盒的内部功能,最后将8个S盒并联起来。[15]
以S1盒为例,输入信号为6bit,输出信号为4bit,根据2.1节中介绍的原理,计算输出信号。
其它S盒的实现方法与上述例程相同,只是需要根据各自的S盒代换表按照本程序注释部分的方法计算输出信号即可。
最后,将8个S盒并行连接起来,每个S盒的输入数据来自上一步骤中的异或加密。S盒压缩模块的管脚图如图3-7所示。
图3-7 S盒压缩运算模块管脚图
3.3.4 置换运算P
根据表2-6,进行置换运算,模块的输入为S盒压缩后的结果4bit*8,即32bit数据,输出为32bit数据。置换运算运算模块的管脚图如图3-8所示。
图3-8 置换运算模块管脚图
3.3.5 左右分组异或运算
左右分组异或运算的输入/输出数据均为32bit,其中输入数据分别为右边处理后的32bit数据和左边的32bit数据,因此输出结果为32bit。管脚图如图3-9所示。
图3-9 左右分组异或运算模块管脚图
3.3.6 组合运算模块顶层文件
如图3-10所示,组合运算模块的输入管脚有R_in(0 to 31)、L_in(0 to 31)和Round_key_des(0 to 47),输出管脚有R_out(0 to 31)和L_out(0 to 31)。
图3-10 组合运算模块顶层管脚图
其中,R_in(0 to 31)是本模块要处理的32bit数据,输入模块后直接进入选择扩展运算模块。Round_key_des(0 to 47)是每次迭代中的子密钥,用于异或加密运算。L_in(0 to 31)是左边的32bit,用于在运算的最后与右边被处理后的32bit数据相异或。根据算法流程图2-2,输出R_out(0 to 31)应该为左右分组异或后的结果,而L_out(0 to 31)直接等于R_out(0 to 31)。即有 基于VHDL语言的DES加密算法设计(8):http://www.youerw.com/zidonghua/lunwen_6115.html