DES加密
前言:不是第一次接触DES了, 每次总是忘了细节。写篇博客和复现代码来防止自己遗忘
文章目录
- DES加密
- 一.DES概念
- 二.DES核心加密流程
- 1.基本原理:
- 2.大致流程
- 涉及几个核心概念:
- ==3.详细加密步骤==
- **(1)置换:**
- **(2)轮循环加密:**
- **(3)轮密钥异或:**
- (4)P盒置换:
- 4.==循环迭代==
- 三.补充
- **子密钥的生成:**
- PC_1置换:
- 分组
- 循环移位
- PC_2置换
- 流程总结:
- 参考资料:
一.DES概念
什么是DESDES(Data Encryption Standard)是一种对称加密算法。它是在20世纪70年代初期由IBM研发的。它的设计目标是提供高度的数据安全性和性能,并且能够在各种硬件和软件平台上实现。
tips:对称加密:加密和解密使用的密钥相同,DES使用的是 Feistel function 网络,解密使用的是同一个轮函数。
DES使用56位的密钥和64位的明文块进行加密。DES算法的分组大小是64位,因此,如果需要加密的明文长度不足64位,需要进行填充;如果明文长度超过64位,则需要使用分组模式进行分组加密。
二.DES核心加密流程
1.基本原理:
- DES传入的密钥和明文都是64位,明文是按照64位为一组进行划分,如果不是64的倍数会进行补位。
- 密钥长64位,但是只有56位参与运算,剩下的8位用作奇偶校验位,实际上经过s盒代换后参与的只有48位(后面再讲)
- n个64位明文数据经过DES加密后得到的n个64位便是密文
2.大致流程
涉及几个核心概念:
- Ip置换:根据ip表对明文进行替换(ip表就是一个全局变量常数表,一会会讲)
- 分组迭代:64位数据,后32位赋给L0,前32位是经过轮函数f(ro,k1)代换后再和l0异或带入,就是每次对右半32位进行轮函数代换后再和左32位异或,然后交换左右32位,使得异或后的右半成为下一轮的左半。然后再把前一轮未处理的左半放在下一轮作为右半处理。
- F轮函数:先扩展32位至48位,然后进行异或48位的子密钥k,然后进行S_box压缩为32位,最后再进行一轮p置换
可能有很多概念初听比较繁琐,待我一点点深入
3.详细加密步骤
(1)置换:
如下图,initial permutation是初始置换所使用的表,final是最后逆置换所使用的表。
这个置换表是固定的全局数组,在逆向分析中,可以通过这个表锁定DES的加密特征
解释下:58是在这个表的第一位,58代表的意思是将原来明文的第58个数据放在这个第一位。依次,50就是将原来的明文第50位数据放在第二位。这个表是8*8=64位,如此一轮循环下来,刚好对原来的明文进行了一次置换,所以叫初始置换。逆置换同理。
(2)轮循环加密:
这里我就不用复杂的公式了,在经过第一轮对明文的置换后,数据分为左半32位和右半32位,此时进入第一轮循环:
左32位L0=刚才的右半32位,右半32位进行轮函数处理后再和左半32位进行异或,填入。第一轮循环完毕。
这个轮循环加密就是针对每一轮的右半32位。
以下为操作步骤:
- E扩展
将32位数据扩展为48位。
为什么是48位?:因为密钥是64位,去除校验位后是56位,然后经过压缩代换后是48位。明文要和密钥进行异或,就要保证数据位数长度一致。所以要把明文扩展为48位。*
**扩展规则:**
很简单:把32位数据以4位为一组进行划分:刚好分为8组,对每一组的数据都在最前一位和最后一位扩展一位,进而形成每组数据都是6位,然后八组就是6*8=48位。
如下图1为原始数据,图2为扩展后的数据
注意:扩展的数据都是来自扩展前的明文,这一点不要搞混,不要觉得1来自上一组扩展后的最后一位数据就行
(3)轮密钥异或:
将扩展后的数据和经过代换后的子密钥进行异或,形成新的数据。
子密钥的生成较为复杂,这里先不讲,等会说,只需要知道原来的64位密钥变成了16轮子密钥
- S盒压缩
S盒压缩的目的是将48位数据再次变成32位,这样就可以恢复原来的明文长度
操作如下:
先解释下S盒表,这也是个常量表,是由8个4进15出的数据表(这是我自己命名的,可能与网上有些出入)
操作步骤:现在的数据不是68=48位吗,我们扩展的位数是两位,一共有22=4种组合方式。中间的数据不是4位吗,表示的最大数是15,这样对于每一组数据,扩展的位数所表示的10进制数就是我们的行数,中间的原始数据所表示的位数就是我们的列数。共有4*16=64种组合。然后一共有8组,这就是s盒的由来。
以111111为例
11111:扩展数据:11-->表示3 原始数据1111-->>表示15 查盒:第3行第15列:所表示的数据就是我们压缩后的数据,这个数据是一个<15的十进制数,转化为2进制后就是刚好四位。这样我们就把6位的数据又还原成了4位的长度。好奇妙!
(4)P盒置换:
P盒是一个4*8=32位的数据盒,也是固定常量。像初始代换表一样,将这个还原后的数据(32位)进行一轮p盒置换后所形成的数据就是我们一轮加密后形成的结果。
4.循环迭代
如此重复16轮,最终形成的密文进行拼接就是密文。
此时,密文的右半部分应该等于上一轮即第15轮加密时的左半32位,密文的左半32位应该等于上一轮即第15轮加密后的右半32位数据。
三.补充
子密钥的生成:
这里是对第二步:"轮循环加密"的第二步"轮密钥异或"其中的子密钥的生成进行的补充
我们的原始密钥长度是64位,去除8位校验位后剩余56位,什么是校验位请去搜索计组–海明校验码。
56位的数据我们需要取其中的48位进行和明文进行异或。这个从56位取48位的规则就是本章要讲解的重点。
PC_1置换:
PC-1盒是一个56位的数据表,通过对密钥进行这样的代换后就形成了初始的56位数据。具体的代换规则和上面的代换规则一样。
分组
将56位数据分为左半28位和右半28位,分别用Ci和Di来表示
循环移位
tips: 1. 第i次迭代分别对应第几次循环,因为要进行16次循环加密,所以一共有16次迭代。
2.分别对每次迭代的次数按照对应的移位次数表对左半和右半的数据进行循环左移。
eg:
第一次迭代:对应i=1,然后查表,发现循环左移的次数是1,那么对于c1和d1,我们就需要分别进行循环左移1位。(循环移位不同于普通的移位,高位会被覆盖到低位),这里需要说明,这个迭代是对应第几次循环的时候用的,例如第二次循环你就查第二次迭代的表就行了,循环移位完成后就进入下一步。不需要再看这个表。
PC_2置换
PC_2是一个6*8=48位的数据表,通过把循环移位后的56位数据进行查盒代换,变成48位。
有趣的是,这个56变48位并不是什么很复杂的规则,仅仅是选择了48个数制成了表盒,然后通过56位的数据进行查盒替换而已。这个盒和前面的盒不一样的地方就在于原来的盒的长度和之前的明文的长度是一致的,但是这个盒的长度和明文(密钥)的长度不一致。它可能最大的数是64,但是所有的数的个数加起来是48个,仅此而已。
经过PC_2置换后的48位数据就是子密钥,第一代就是子密钥K1,第二代就是子密钥K2,如此往复。一共16个子密钥。对应16次循环
流程总结:
1.明文传入64位,密钥传入64位–>2.明文按照初始代换表进行代换–>3.明文分为左半32位和右半32位->4.右半32位传入下一轮作为左半32位,左半32位进行func加密后再和上一步的右半32位(即本轮的左半32位)进行异或—>5.最后再进行逆置换形成密文。
func加密包含16次循环,每次循环都有对应的子密钥的生成,func的步骤包含e扩展,轮密钥异或,s盒压缩,P盒置换代换。
用到的常量盒:(可以作为逆向DES的特征分析)
(1)初始IP置换盒
(2)逆IP代换盒
(3)S盒
(4)P盒
(5)PC-1置换盒
(6)PC_2置换盒
(7)循环移位表
代码实现见我下一篇文章。
参考资料:
通俗易懂,十分钟读懂DES,详解DES加密算法原理,DES攻击手段以及3DES原理-CSDN博客
DES加密算法|密码学|信息安全_哔哩哔哩_bilibili DES加密算法-加密过程_哔哩哔哩_bilibili