33 1 41 9 49 17 57 25
2.2 DES解密方法
DES算法的解密与加密大致相似,区别仅仅在于第一次迭代时使用子密钥k(16)、第二次k(15)、••••••最后一次使用k(1),算法本身并没有任何变化。
3 DES算法的VHDL实现
3.1 总体设计
DES算法的原理比较复杂,因而用VHDL实现也具有一定的难度。幸运的是,DES算法每次迭代内部的运算都可以用组合逻辑实现。系统控制部分只要控制好迭代次数以及乘积交换步骤即可,而子密钥的产生由单独的模块来完成。系统的总体框图如图3-1所示。
其中,组合电路模块完成每次迭代中的逻辑运算,包括选择扩展运算E、密钥加密运算、选择压缩运算S、置换运算P和左右分组异或运算。这些运算都是组合逻辑可以完成的,不需要时钟信号的控制,因此将它们集成到一个统一的模块中。而16次迭代过程的管理和控制由时序电路来完成,该时序电路可以描述为一个状态机,依次完成读原始密钥、读数据、循环迭代控制和输出结果控制等功能。子密钥产生模块在时序控制电路的控制下,根据当前迭代次数,产生子密钥提供给组合电路模块。[12]
3.2 子密钥产生模块
如图3-2所示,子密钥产生模块的输入为原始密钥64bit,模块根据当前迭代次数产生相应的子密钥。
根据图2-3和图2-4,子密钥的产生是一个纯组合逻辑过程,运算类型只有置换和移位两种,且子密钥由原始密钥和当前迭代次数唯一确定。因此,子密钥的数据最终表现为原始密钥的置换(去除原始密钥的第8,16,32,64位)。因而,可以直接用信号赋值语句实现子密钥的产生和输出。[13]
例如,当迭代次数为1时,我们根据子密钥产生原理来看原始密钥(1~64位)的第1位数据将会置换到子密钥的哪一位。
由图2-4可知,原始密钥的第1位数据a经过PCI运算,置换到结果的第8位。
由表2-1可知,此时应该向左循环移位1次,因此a被移到第7位(注意,数据自左向右是从低到高编排的);
由表2-2可知,上一步骤结果的第7位被置换到了第20位。
综上所述,当迭代次数为1时,原始密钥的第1位数据被置换到子密钥的第20位,如例程1中的K1,kin_in(0)在K1的第20位。同理,计算出原始密钥其余各位数据位(去除原始密钥的第8,16,32,和64位)在子密钥中的位置,就可以推导出各迭代次数下完整的子密钥了。子密钥产生模块的管脚图如图3-3所示,其中,ldkey为输入信号,ldkey为高时表示输入的key数据有效,否则表示输入的key无效,key_ready将被拉低。
图3-3 子密钥产生模块管脚图
例程中K1到K16是按照图3-3所示产生,并由相关的表格数据直接推导出来的,所有的关系均可以按照上述三个步骤推导,推导过程较复杂,可以利用计算机等工具。
3.3 组合逻辑运算模块
本模块完成图2-2中对右边32bit数据的一系列运算,包括选择扩展运算E_expression、异或加密运算add_key、S盒压缩运算S_box、置换运算P_box和左右分组的异或运算add_left,不包括乘积交换和迭代控制。因此本模块可以用纯组合逻辑来实现。本模块的框图如图3-4所示,其中在进行扩展运算时就将数据分为8组,每组6bit,以便于进行S盒压缩运算,并降低书写难度(太长的表达式书写时容易出错)。
其中,R_in(0to31)是右边32bit数据,也是本模块要处理的32bit数据,输入模块后直接进入选择扩展运算模块。Round_key_des(0to47)是每次迭代中的子密钥,用于异或加密运算add_key。L_in(0to31)是左边的32bit,用于在运算的最后与右边被处理后的32bit数据相异或add_left。根据算法流程图2-2,输出R_out(0to31)应该为左右分组异或后的结果,而L_out(0to31)直接等于R_out(0to31)。 基于VHDL语言的DES加密算法设计(7):http://www.youerw.com/zidonghua/lunwen_6115.html