DES数据加密标准 复习笔记

DES 数据加密标准 复习笔记


一、基本属性

  • 密码类别:分组密码
  • 核心结构:Feistel 结构
  • 关键参数
    • 分组长度:64 bit
    • 原始密钥长度:64 bit(含 8 位校验位,实际有效密钥 56 bit
    • 迭代轮数:16 轮

二、整体加密流程

  1. 初始置换 IP:对 64 bit 明文按固定规则重排
  2. 16 轮 Feistel 迭代:数据拆分为左右各 32 bit,逐轮执行轮函数运算
  3. 左右交换:16 轮结束后互换左右两半数据
  4. 逆初始置换 $\boldsymbol{IP^{-1}}$:执行 IP 的逆置换,输出 64 bit 密文
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
flowchart TD
subgraph 明文输入
A[64bit 明文]
end

subgraph 加密主链路
B[初始置换 IP]
C[第 1 轮 Feistel 迭代]
D["... 共 16 轮迭代 ..."]
E[第 16 轮 Feistel 迭代]
F[左右两半交换]
G[逆初始置换 IP⁻¹]
end

subgraph 密钥扩展链路
K0[64bit 原始密钥]
K1[置换选择 PC-1\n剔除8位校验位 → 56bit]
K2[逐轮左循环移位 + PC-2 压缩]
K3[生成 16 组 48bit 子密钥 K₁~K₁₆]
end

subgraph 密文输出
H[64bit 密文]
end

A --> B --> C --> D --> E --> F --> G --> H
K0 --> K1 --> K2 --> K3
K3 -->|按轮输入子密钥| C
K3 -->|按轮输入子密钥| E

三、Feistel 轮运算

1. 核心公式

$$
\begin{align*}
L_i &= R_{i-1} \
R_i &= L_{i-1} \oplus F(R_{i-1},\ K_i)
\end{align*}
$$

  • $L_i,R_i$:第 $i$ 轮左、右半部分 32 bit 数据
  • $F$:轮函数;$K_i$:第 $i$ 轮 48 bit 子密钥

2. 轮函数 F 执行步骤

输入:32 bit 右半数据 $R_{i-1}$;输出:32 bit 运算结果

  1. 扩展置换(E 表):32 bit → 48 bit,匹配子密钥长度,增强扩散性
  2. 异或子密钥:48 bit 扩展结果与 48 bit 子密钥 $K_i$ 按位异或
  3. S 盒代换
    • 48 bit 分为 8 组,每组 6 bit 对应 1 个 S 盒
    • 单盒规则:6 进 4 出;输入第 1、6 位为行号,第 2~5 位为列号,按行优先查表输出 4 bit
    • 8 盒输出拼接为 32 bit
  4. 置换运算(P 表):对 32 bit 结果重排,强化扩散效果

四、子密钥生成(密钥扩展)

  1. PC-1 置换:64 bit 原始密钥剔除 8 位校验位,输出 56 bit 有效密钥
  2. 分组移位:56 bit 拆分为左 $C_0$、右 $D_0$ 各 28 bit;每轮按规则执行左循环移位
  3. PC-2 置换:移位后的 56 bit 压缩置换为 48 bit,得到当前轮子密钥 $K_i$
  4. 16 轮共生成 16 个子密钥 $K_1 \sim K_{16}$

五、解密规则

解密算法与加密完全一致,仅需将 16 轮子密钥逆序使用(第 1 轮用 $K_{16}$,最后一轮用 $K_1$),是 Feistel 结构的核心优势。


六、核心常量变换汇总

类别 变换名称
明文置换 初始置换 IP、逆初始置换 $IP^{-1}$
轮函数变换 扩展 E 表、S 盒代换、置换 P 表
密钥扩展变换 置换选择 PC-1、置换选择 PC-2、左循环移位位数表

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 slowbirdie.top@outlook.com