DES算法原理C++模拟实现

算法实现按照《信息安全原理与技术》(郭亚军、宋建华、李莉、董慧慧编著)给出的过程,输入输出格式按照本书56页例3.8指定,即输入16个字符的16进制明文和密钥 (输入16个16进制char后自动处理成64位的2进制进行计算,也即DES分组大小和DES的密钥大小),输出64位2进制密文(解密时输出64位2进制明文)和对应的16位16进制密文/明文,如下图:

个人地址:http://hlyin.space/Information-Security/des/

源码丢在github上,有需要的可以下载查看,地址:https://github.com/louiehuang/DES

一、算法过程

DES原理本身不难理解,只是实现起来比较麻烦,所以这里只是大概提一下算法过程,详细过程可以参考《信息安全原理与技术》或 DES算法实例详解,讲得都比较清楚。

(1)处理密钥

  1. 输入64位密钥,经过置换选择1(56位)得到56位的实际密钥
  2. 按28位1组分成前后C和D两个部分
  3. 进行16轮循环,每轮循环中先对C和D循环左移,再将结果合并
  4. 通过置换选择2(48位)选出当前轮的48位子密钥。

(2)处理明文

  1. 输入64位明文,初始置换
  2. 按32位1组分成前后L和R两个部分
  3. 进行16轮迭代,每轮迭代中,下一轮使用的L为本轮的R,下一轮使用的R需经过如下计算得到:
    先将32位的R经过扩展置换E扩展成48位,与当前轮使用的子密钥(加密时为顺序使用子密钥,解密时为逆序使用子密钥)进行异或,将得到的48位结果按6位1组分成8组,每组使用1个S盒进行置换,每组得到4位输出,即最后得到32位的输出,将此输出结果经置换P后得到的结果与本轮的L相异或,即为下一轮的R
  4. 16轮迭代结束后,将最后得到的L和R交换,即(R,L)
  5. 逆初始置换后得到64位密文

二、算法实现

为了清晰理解DES算法的原理,希望将算法中所有的中间结果均能输出出来查看,基于这个目的,我选取的主要数据结构为char数组,不需要输出中间结果则可以使用bool类型,运算效率比char高… 嗯没管效率只是为了理解DES而已…

我按课本56页例3.8制定输入格式,即输入的明文和密钥均为16位的16进制字符串,因此为了输出中间过程,需要将输入转换成64位的2进制字符数组,char类型数组最后一位需要放’\0’,因此所有的char数组的实际大小均为算法所需大小加1,主要的数据结构如下:

输入:

  • char HexMsg[17], char HexKey[17] //明文和密钥输入为16位的16进制字符串

预处理:

  • char HexMsg[17] → char BiMsg[65] //64位的2进制明文
  • char HexKey[17] → char BiKey[65] //64位的2进制密钥

DES:
产生子密钥:

  • char realKey[57] //经置换选择1选出56位
  • char C[29], D[29] //前后2部分,各28位
  • char CDCombine[57] //循环左移后将C、D数组结合
  • char subKey[16][49] //置换选择2后产生的子密钥

初始置换:

  • char BiMsgCopy[57] //复制一份原数组,否则在期间的改变会使得替换的元素发生改变
  • char L[33], R[33] //前后2部分,各32位

16轮迭代:

  • char RCopy[29] //复制R,运算期间会改变R,而最后需要将本轮开始的R赋给下一轮的L
  • char ExtendedR[49] //扩展48位,与子密钥的异或直接修改ExtendedR
  • char group[7] //将48位的ExtendedR分层6位1组的group,对每组group按S盒查找替换,替换
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值