DES算法依旧要求依旧是特征识别,加密流程还是呢一套
从逆向角度看,DES 有几个很鲜明的标志:
- 使用 64 位分组分成L0和R0两组
- 实际有效密钥长度为 56 位
- 整体采用 16 轮 Feistel 结构
- 轮函数里通常会出现 扩展置换、异或、S 盒查表、P 置换
- 子密钥生成过程会出现 PC-1、循环左移、PC-2
只要在题目中看到这些特征,基本就可以往 DES 方向怀疑。
DES 的整体结构
DES 是一种典型的分组密码算法,每次处理 64 bit 明文块。
密钥长度名义上是 64 bit,但其中有 8 bit 用作奇偶校验,因此真正参与加密运算的是 56 bit。
DES 的核心是 Feistel 网络。它的基本过程如下:
- 对 64 bit 明文做一次 初始置换 IP
- 将结果分成左右两部分:
L0和R0,各 32 bit - 进行 16 轮迭代:
- 16 轮结束后,将左右交换
- 再经过一次 末置换 FP
- 得到最终密文
这个结构非常关键,因为它意味着 加密和解密流程几乎相同,只是子密钥顺序相反。.
DES 轮函数 F 的组成
DES 的难点主要集中在轮函数 F 上。
这个函数接收两个输入:
- 右半部分
R,32 bit - 当前轮子密钥
K_i,48 bit
处理过程分为四步:
1. E 扩展置换
把 32 bit 的 R 扩展成 48 bit。
本质上是重新选位并复制某些边界位,目的是让后面能和 48 bit 子密钥异或。
2. 与子密钥异或
扩展后的 48 bit 数据与当前轮子密钥做异或。
3. S 盒替换
将 48 bit 划分成 8 组,每组 6 bit。
每组分别输入一个 S 盒,输出 4 bit。
8 个 S 盒总共把 48 bit 压缩回 32 bit。
S 盒是 DES 最核心的非线性来源,也是逆向题最容易藏表的地方。
4. P 置换
将 S 盒输出的 32 bit 再次打乱顺序,得到轮函数最终输出。
因此可以把轮函数记成:
DES 子密钥生成过程
DES 不是 16 轮都直接用同一个 key,而是要从原始 key 中生成 16 个不同的子密钥。
生成流程如下:
- 原始 64 bit key 先经过 PC-1 置换
- 去掉奇偶校验位
- 得到 56 bit 数据
- 将其分为两部分:
C0和D0,各 28 bit - 每轮对
C和D按规定进行循环左移 - 将移位后的
C_i || D_i经过 PC-2 置换 - 得到当前轮 48 bit 子密钥
K_i
左移次数规律为:
这串规律在逆向里很有价值。
如果你在代码里看到 16 轮、每轮对两个 28 bit 状态进行 1 或 2 位循环左移,那基本就是 DES key schedule 了。
具体细节可以参考大佬的这篇文章,对DES的讲解做的十分详尽通俗易懂,十分钟读懂DES,详解DES加密算法原理,DES攻击手段以及3DES原理。Python DES实现源码-CSDN博客
Comments NOTHING