DES算法详解

Sher10ck 发布于 2026-04-07 175 次阅读


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 网络。它的基本过程如下:

  1. 对 64 bit 明文做一次 初始置换 IP
  2. 将结果分成左右两部分:L0R0,各 32 bit
  3. 进行 16 轮迭代: Li=Ri1L_i = R_{i-1}Ri=Li1F(Ri1,Ki)R_i = L_{i-1} \oplus F(R_{i-1}, K_i)
  4. 16 轮结束后,将左右交换
  5. 再经过一次 末置换 FP
  6. 得到最终密文

这个结构非常关键,因为它意味着 加密和解密流程几乎相同,只是子密钥顺序相反。.

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 再次打乱顺序,得到轮函数最终输出。

因此可以把轮函数记成:F(R,K)=P(S(E(R)K))F(R, K) = P(S(E(R) \oplus K))

DES 子密钥生成过程

DES 不是 16 轮都直接用同一个 key,而是要从原始 key 中生成 16 个不同的子密钥。

生成流程如下:

  1. 原始 64 bit key 先经过 PC-1 置换
    • 去掉奇偶校验位
    • 得到 56 bit 数据
  2. 将其分为两部分:C0D0,各 28 bit
  3. 每轮对 CD 按规定进行循环左移
  4. 将移位后的 C_i || D_i 经过 PC-2 置换
  5. 得到当前轮 48 bit 子密钥 K_i

左移次数规律为:[1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1][1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1]

这串规律在逆向里很有价值。
如果你在代码里看到 16 轮、每轮对两个 28 bit 状态进行 1 或 2 位循环左移,那基本就是 DES key schedule 了。

具体细节可以参考大佬的这篇文章,对DES的讲解做的十分详尽通俗易懂,十分钟读懂DES,详解DES加密算法原理,DES攻击手段以及3DES原理。Python DES实现源码-CSDN博客

此作者没有提供个人介绍。
最后更新于 2026-04-07