当前位置: 首页 > 图文教程 > 开发语言 > VC++ > IBM的MARS加密算法实现(下)

VC++
在类VC的界面实现中加入目录树
软件换肤技术在 BCB 中的实现
利用非模窗口生成MDI介面
报表输出轻松搞定
Windows 中不规则窗体的编程实现
解说Win32的窗口子类化
使用测试优先方法开发用户界面
一个简单的登录对话框的实现
一个简单的日记本程序
从资源中加载皮肤
一个在RichEdit中添加表情图象的类
ActiveSkin 4.3 软件换肤在VC中的实现
一种另类“关于(About)”对话框的动态显示方法
对话框打印预览及打印
关于如何换肤、子类化的解决方案
制作 MSN、QQ 的消息提示窗口
如何对 BCGControlBarPro 进行换肤
定制个性化的对话框窗口类
改变窗口中的光标形状
更新MFC中的视图,跟踪.NET Framework中的事件

VC++ 中的 IBM的MARS加密算法实现(下)


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 54 ::
收藏到网摘: n/a

IBM的MARS加密算法实现(下)
作者:西安 吴真

IBM的MARS加密算法实现(上)

2.3 密文解密

用于密文解密的40个子密钥的生成和明文加密时的40个子密钥的生成方法相同.

2.3.1 第一步前向混合
输入的128位密文分成四块D[0],D[1],D[2],D[3],选取生成的40个密钥的最后四个分别与上述四块数据进行加操作,
D[0] += K[36];
D[1] += K[37];
D[2] += K[38];
D[3] += K[39];
结果作为第一轮操作的输入数据.
第一轮:

D[0] D[1] D[2] D[3]
b0 b1 b2 b3 FirstTarget SecondTarget ThirdTarget

把D[0],D[1],D[2],D[3]合并成128位的数据,循环左移32位后分成四块D[0],D[1],D[2],D[3]其中D[0]作为源数据(Source),剩下的3个作为目标数据,把D[0]循环右移24位后的结果返回给D[0]
把32位的源数据D[0]分成8位的四块b0,b1,b2,b3
  b0 b1 b2 b3 FirstTarget SecondTarget ThirdTarget
移动前 D[0] D[1] D[2] D[3]
移动后 D[1] D[2] D[3] D[0]

b0和b2作为数组下标从S1中寻找s-box替换数:S1[b0],S1[b2]
b1和b3作为数组下标从S0中寻找s-box替换数:S0[b1],S0[b3]
对FirstTarget的操作:
FirstTarget按位异或S1[b0]的结果返回给FirstTarget
对SecondTarget的操作:
SecondTarget加上S0[b3]的结果返回给SecondTarget
对ThirdTarget的操作:
ThirdTarget按位异或S0[b1]后加上S1[b2]的结果返回给ThirdTarget.
本步骤共进行8轮,在第一轮和第五轮中操作结尾处添加将Source加上FirstTarget的结果返回给Source的操作.在第二轮和第六轮中操作结尾处添加将Source加上ThirdTarget的结果返回给Source的操作

2.3.2第二步密码核
把输入的128位数据循环左移32位后分成四块D[0],D[1],D[2],D[3],其中D[0]作为源数据(Source),剩下的3个作为目标数据, 把Source循环右移13位的结果返回给Source,
D[0] D[1] D[2] D[3]
Source FirstTarget SecondTarget ThirdTarget

把Source和对应两个子密钥(从第34个子密钥开始递减,本轮的输入子密钥K[34],K[35]下一轮的子密钥就是K[32],K[33])作为E-Fun(同加密)操作的输入参数,返回三个操作输出L,M,R,然后把这三个输出结果和三个目标数进行减法或异或操作,然后,合并D[0],D[1],D[2],D[3]形成128位数据作为下一轮的输入.
本步骤共进行16轮,假定E-Fun的第一个输出数为L,第二个输出数为M,第三个输出数为R

前8轮中:
FirstTarget 和 R按位异或的结果返回给Fir