DES 对称加密算法
前言:DES 对称加密算法笔记,最近老师将该算法流程讲解了一遍,自己正好有时间进行记录和巩固
参考文章:https://www.cnblogs.com/gqgqa/p/15389239.html
参考文章:https://blog.csdn.net/qq2489021103/article/details/112994887
什么是DES对称加密算法
DES是现代密码发展史上第一个被广泛应用的商用数据加密算法,同时开创了公开密码算法的先例。
它是一个基于分组密码设计,分组长度为64位,密钥长度为64位(实际只有56位,另外的8位被用于奇偶验证),使用64位的分组长度和56位的密钥长度,将64位的明文输入经过一系列变换得到64位的输出
注意:这里就有一个问题了,分组加密的明文64位,而密钥长度实际上只有56位,那么它们之间是如何进行加密的?
DES算法利用多次组合替代算法和换位算法,通过混淆和扩散的相互作用,把明文编辑成密码强度很高的密文,解密则使用了相同的步骤和相同的密钥。
由于密钥位数少,迭代次数偏少,安全性无法得到保障,虽然它已经被相关的AES或者三重DES进行取代,但是其设计思想可以进行拿来学习借鉴
DES算法加密解密流程
DES算法具体通过对明文进行一系列的排列和替换操作来将其加密。过程的关键就是从给定的初始密钥中得到16个子密钥的函数。
要加密一组明文,每个子密钥按照顺序(1-16)以一系列的位操作施加于数据上,每个子密钥一次,一共重复16次。每一次迭代称之为一轮。
要对密文进行解密可以采用同样的步骤,只是子密钥是按照逆向的顺序(16-1)对密文进行处理。
明文数据置换
首先来看第一部分的操作,就是置换操作,如下图所示
这里还需要知道这个置换的顺序是固定的,并且是有规律的
-
矩阵上32位为偶数,并且自上向下递增
-
矩阵上32位为奇数,并且自上向下递增
因为DES算法是分组算法,所以每次加密的位数为64位,这里的话会先进行置换操作,如这个矩阵所示,第一位是58,即代表打乱后的明文的第一位是打乱之前的明文的第58位,以此类推
置换在密码方面的作用不大,其意义就在于打乱原来的明文输入和ASCII码字的关系
明文数据加密
按照上面矩阵的位置进行置换之后,在第一波加密的环节中,将上四行的数据作为L0的数据,下四行的数据作为L0的数据,第二轮就是L1和R1,以此类推
然后接着计算出 R1=f(R0,K0)^L0,L1=R0 ,这里的K0表示第一轮的密钥
依次类推,上述的加密迭代需要进行16次
子密钥迭代变换
这里需要先提出一个问题,第一轮f函数中的K1和我们输入的密钥是一样的吗
并不是一样,我们输入的为64位密钥,而第一轮的密钥K0实际上只有32位,因为f函数中另一个变量R0同样也是32位,所以要相匹配
那么这个第一轮f函数中的K0是如何从64位转换为32位的?
- 之前谈及到关于奇偶校验位,这个奇偶校验位就占了8位,位置分别在第8,16,24,32,40,48,56,64位
那么去除了奇偶校验位现在只剩下56位了,那么这里如何把56位转换为32位?这里就用到了密码学中的压缩
首先这里也同样会先将初始的密钥(56位,不包含奇偶校验位)进行置换,置换的顺序如下所示,参考其中的PC1置换表
置换完了之后这时候这56位才真正开始作为密钥的运算输入,此时一共是56位,第一轮中分别分为C0和D0,C0为前四行,D0为后四行,以此类推
子密钥迭代变换是如何迭代的
DES对称加密算法中有规定,第i轮分别对Ci-1和Di-1进行循环左移。而这里的循环左移同样有说法,当生成对应的子密钥,其i=1,2,9,16的时候,对应左移的位数为1位,其他的则是2位
当移位完成之后,最终还需要经过PC_2的置换,从中选取48位作为第一轮的密钥,PC_2的置换表如下所示,最终PC_2的置换的矩阵对应C1和D1,此时这个56位才作为第一轮的K0密钥来进行使用,以此类推
这里需要注意的几个点:
-
我们可以计算下总共移动了多少位,
移动1位*4
+移动2位*12
=28位,而我们的C0和D0同样也是28位,那么最终密钥又循环左移还原了 -
下一轮的加密并不是以PC_2置换的数据为起点的,而是以为经过PC_2置换(只经过了循环移位)的数据为起点
函数f的过程
到了这里,我们已经将每轮的密钥Ki,然后要进行加密的明文Li-1(32位)和Ri-1(32位)输入都已经弄好了
其中计算的时候是Ri=f(Ri-1,Ki)^Li-1,但是这里其实还有个问题通过f函数生成的Ri是32位,但是密钥是48位,它是如何跟Ri-1经过f函数后生成的Ri呢?所以这里还需要讲解下
这里还需要经过位选择函数E,根据E置换矩阵,将其Ri-1原本32位扩散到48位,这里将E置换结果作为E(A)
S盒生成
到了这里密钥为48位,Ri-1此时也已经扩散到了E(A) 48位,然后接着f函数会继续生成S盒子,按照E(A) ^ Ki (^指的是模2加运算)得到48位比特串,将其结果分为8个6比特串Bj,Bj=B1 B2 B3 B4 B5 B6
Bj=B1 B2 B3 B4 B5 B6 又会继续进行压缩,将其每个8个比特位的其中B2-B5作为二进制转换为10进制作为列,B1和B6作为二进制转换为行,在对应的Sj中根据行列找到对应的十进制,然后将其转换为二进制,结果就是8个6比特串一次性转换为32位,
P盒置换
上面8个6比特串一次性转换为32位还需要经过下面的P盒进行置换,最后输出32位
这里输出的32位则是作为下一次Ri,而这些变换总共需要作16轮
逆置换
以上规则进行16轮变换之后,最后还需要根据图中IP-1表进行依次逆置换,最后生成的64位数据就是加密的数据
解密的流程
其他的都是一样,因为16轮密钥恢复成原来的,所以解密的时候就是用的循环右移,规则还是一样,先进行IP-1逆置换,然后最后来进行IP置换
C语言实现的加解密
参考代码:https://github.com/tarequeh/DES
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY