type
status
date
slug
summary
tags
category
icon
1. 基础知识补充
这里的分组加密,指的是DES加密。
DES加密比较复杂,需要掌握二进制数的相关知识,比如:原码、反码、补码和位运算。
2. 什么是DES加密
DES加密是一种对称加密算法。对称加密算法即:通信双方同时掌握一个密钥,加密和解密都是用此密钥。
在DES加密中,将需要加密的明文按64位进行分组,加密密钥是按用户输入的输入的秘钥生成的。密钥长64位,但实际DES运算只有56位参与(第8、16、24、32、40、48、56、64位是校验位, 使得每个密钥都有奇数个1,在计算密钥时要忽略这8位)分组后的明文组和56位的密钥按位替代或交换的方法形成密文组。
3. DES算法的整体过程
- 将64bit明文进行IP置换,分成左右两个分支各32bit,左: ,右:;
- 左分支:,右分支:;
- 重复以上操作16次,得到相应的L1~L16,R1~R16;
- 最后再进行IP逆序置换,将左右两个分支合并为64bit的密文
每轮迭代过程可表示为:; 其中 Kn是向第N层输入的48位的秘钥,f是以Rn-1和Kn为变量的输出32位的函数
流程图如下:

4. F轮函数解析
F轮函数主要包括以下几个部分:
- IP置换
- 拓展置换位E:将32bit的R0拓展为48bit
- 异或操作:将48bit的R0和48bit的K1进行异或操作
- S盒压缩处理:大盒子里有8块6bit 的小盒子,刚好容纳48bit的二进制数,盒子的特点是6进4出,出了盒子就变成了32bit的二进制数

5. IP逆序置换
F轮函数代码:
5. 密钥生成过程
- 密钥原本为64bit ,去掉8位校验位,剩余56位参与运算
- 按照交换规则,生成16轮48bit的密钥
参考代码如下:
warning: 完整代码并未AC,若想参考此代码,需自己动手调试!
6. 总结
DES算法比较复杂,需要写的函数很多,并且用c语言来写的话,在字符串的处理上会是一个很大的问题,因为没有cpp的STL,很多处理都需要手动的完成。特别是在二维数组和指针传递的应用方面。
7. 参考文献
[1] DES加密解密算法:DES加密算法原理_张维鹏-松山湖开发者村综合服务平台