算法实现按照《信息安全原理与技术》(郭亚军、宋建华、李莉、董慧慧编著)给出的过程,输入输出格式按照本书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)处理密钥
- 输入64位密钥,经过置换选择1(56位)得到56位的实际密钥
- 按28位1组分成前后C和D两个部分
- 进行16轮循环,每轮循环中先对C和D循环左移,再将结果合并
- 通过置换选择2(48位)选出当前轮的48位子密钥。
(2)处理明文
- 输入64位明文,初始置换
- 按32位1组分成前后L和R两个部分
- 进行16轮迭代,每轮迭代中,下一轮使用的L为本轮的R,下一轮使用的R需经过如下计算得到:
先将32位的R经过扩展置换E扩展成48位,与当前轮使用的子密钥(加密时为顺序使用子密钥,解密时为逆序使用子密钥)进行异或,将得到的48位结果按6位1组分成8组,每组使用1个S盒进行置换,每组得到4位输出,即最后得到32位的输出,将此输出结果经置换P后得到的结果与本轮的L相异或,即为下一轮的R- 16轮迭代结束后,将最后得到的L和R交换,即(R,L)
- 逆初始置换后得到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盒查找替换,替换