Archipelago

Lec 4对称原语 II:PRP、Feistel、DES 与 AES

讲义完成更新于 2026-09-16

Lec 4 对称原语 II:PRP、Feistel、DES 与 AES

MIT 6.5610 · Lecture 4 · 关键词:PRP、PRP/PRF 切换引理、三步设计法、Feistel 网络、Luby–Rackoff、DES、AES(迭代 Even-Mansour)、缓存攻击、线性密码分析 来源:课程自家 PRP/AES 讲义(Henry Corrigan-Gibbs),对应 2026"Symmetric-key primitives II"。


TL;DR

  • PRP 是带密钥的可逆置换,PRF 是随机外观函数;在查询量远小于生日界时,PRP/PRF Switching Lemma 允许把两者近似替换。
  • Feistel 网络用不可逆轮函数构造可逆置换,Luby–Rackoff 给出轮数与安全性的联系;DES 展示了密钥长度和结构老化的风险。
  • AES 依靠迭代的非线性代换与线性混合抵抗差分、线性分析,但查表实现仍可能经缓存侧信道泄露密钥。

0. 量子 vs 后量子(先厘清概念)

设定诚实方敌手
经典密码经典经典
后量子密码(本课)经典量子
量子密码(6.S895)量子量子

🔎 后量子 = 今天就能在经典计算机上运行、却能抵御未来量子计算机的算法(NIST 新标准即此类)。注意:Shor 这类简单量子算法所需电路,远小于"量子零知识证明"这类复杂计算——后者离实用极其遥远。


1. PRP:分组密码的真身

定义

定义(伪随机置换 · Pseudorandom Permutation, PRP) "分组密码"其实是 PRP(而非 PRF)。与 PRF 的区别:

  1. 输入输出空间相同:P:K×X→XP:K\times X\to X;
  2. 不同输入映到不同输出(无碰撞,是置换);
  3. 给定密钥有高效逆算法 P−1(k,⋅)P^{-1}(k,\cdot)。 AES、DES 都是分组密码(PRP)。 :::

PRP/PRF 切换引理(Switching Lemma) 看到 TT 对输入输出时,PRP 与 PRF 的可区分优势仅约 T2∣X∣.\frac{T^2}{|X|}. 故当输出空间够大(如 256 位)时,PRP 实用上可直接当 PRF 用。

🔎 这正是生日界:TT 次查询里 PRF 可能撞出碰撞而 PRP 永不碰撞,差异即 ≈T2/∣X∣\approx T^2/|X|。


2. 通用三步设计法

几乎所有对称原语(分组密码、哈希)今天都按此设计:

  1. 假设可访问一个理想原语(如 nn 位上的公开随机置换);
  2. 用理想原语构造新原语;
  3. 用"希望行为足够接近理想"的东西实例化理想原语 ← 唯一的"信仰之跃"。

没有第 3 步时,新原语安全可归约到理想原语;第 3 步引入不可归约的假设。换言之,"AES 的 PRF 安全" 实际就建立在 "AES 是安全 PRF" 这一 ad-hoc 假设上。 评估流程:用已知攻击试破 → 办竞赛互相攻击 → 经年审视后认定够好。许多密码学家愿赌 256 位 AES 永无 2402^{40} 攻击,却没人敢拿性命赌因子分解/ECDLP 困难。(格假设介于其间——很多人愿赌左手 LWE 困难。)

NIST 三大分组密码:

密钥块大小
DES (1975)5664
3DES16864
AES (1998)128/192/256128

⚠️ 小块大小会被某些攻击利用,128 位是下限。


3. DES 与 Feistel 网络

例

Feistel 置换(把随机函数变成可逆随机置换) πf:{0,1}2n→{0,1}2n\pi_f:\{0,1\}^{2n}\to\{0,1\}^{2n},对函数 f:{0,1}n→{0,1}nf:\{0,1\}^n\to\{0,1\}^n: πf(x,y):=(y, x⊕f(y)).\pi_f(x,y) := (y,\ x\oplus f(y)). 天然可逆——无论 ff 是否可逆,πf\pi_f 都是置换。这是 Feistel 的精髓:用不可逆的随机函数搭出可逆的随机置换。

DES 结构:DES(x)=(P1∘πf16∘⋯∘πf2∘πf1∘P0)(x)\mathrm{DES}(x)=(P_1\circ\pi_{f_{16}}\circ\cdots\circ\pi_{f_2}\circ\pi_{f_1}\circ P_0)(x),56 位密钥、64 位块、16 轮,P0,P1P_0,P_1 为固定比特置换(对安全无明显作用,疑似为拖慢软件实现)。

定理

Luby–Rackoff:当 n→∞n\to\infty 且把 fif_i 建模为随机函数时,三轮 Feistel 即与随机置换不可区分(强 PRP 需四轮)。但对实际 DES 意义有限(fif_i 并不随机,且块太小,渐近结论不适用)。

轮函数:从 56 位密钥导出 16 个 48 位轮密钥;每轮 = 线性混合 → 拆成 6 位块、各过不同 S-盒(查表的非线性替换)→ 比特置换。唯一非线性来自 S-盒;若 S-盒随机选取密码会变弱,DES 的 S-盒经精心设计具备抗攻击的统计性质(如无输出比特接近输入的线性函数)。

教训:多轮简单操作 + 避开所有已知攻击需极度小心,随机选参数行不通。 DES 56 位密钥从发布之初就太短(Diffie–Hellman 当年即指出,建议 128 位);今日最佳攻击为 Matsui 线性密码分析(1993),2472^{47} 已知明文对即可恢复密钥。


4. AES:迭代 Even-Mansour

整体结构与 DES 不同:AES = "迭代 Even-Mansour 密码"(单轮即 Even-Mansour)。密钥 128/192/256,块固定 128。

理想原语:可逆公开置换 π\pi(建模为真随机置换)。构造:从密钥线性导出轮密钥 k0,…,krk_0,\dots,k_r,then st←x⊕k0;for i=1..r: st←π(st)⊕ki;输出 st.st\leftarrow x\oplus k_0;\quad \text{for } i=1..r:\ st\leftarrow \pi(st)\oplus k_i;\quad \text{输出 } st. (最后一轮用略不同的 π\pi 以利硬件优化。)渐近意义下该理想构造行为如 PRF。

实例化公开置换 π\pi(三步,128 位密钥时 r=10r=10 轮):

  • SubBytes:查表 S:{0,1}8→{0,1}8S:\{0,1\}^8\to\{0,1\}^8 对 16 字节逐一非线性替换(精心设计的 S-盒)。
  • ShiftRows:视为 4×44\times4 字节矩阵,第 ii 行循环右移 ii 格。
  • MixColumns:乘以 GF(28)GF(2^8) 上的固定矩阵。

⚠️ 缓存时序攻击:S-盒查表在软件实现中危险——连续查 S[1],S[1]S[1],S[1] 比查 S[1],S[187]S[1],S[187] 更快,这点微小时序差泄露内部状态,足以发动毁灭性攻击。设计要小心,实现更要小心(用常时实现 / AES-NI 硬件指令)。


5. 线性密码分析(攻击的味道)

存在线性关系:若有比特位置集合 Bx,By,BkB_x,B_y,B_k 使 Pr⁡[x[Bx]⊕y[By]=k[Bk]]≥12+e,y←F(k,x),\Pr\big[x[B_x]\oplus y[B_y]=k[B_k]\big] \ge \tfrac12 + e,\quad y\leftarrow F(k,x), 偏置 ee 可察觉(真随机函数 e=0e=0,具体 PRF 可非零)。

攻击:收集大量 (xi,yi)(x_i,y_i),对所有 xi[Bx]⊕yi[By]x_i[B_x]\oplus y_i[B_y] 取多数表决作为 k[Bk]k[B_k] 的猜测。由 Chernoff 界,猜对概率 ≥1−exp⁡(Te2/2)\ge 1-\exp(Te^2/2),故约 T=4/e2T=4/e^2 对即可获得一比特密钥信息(概率远超 1/21/2)。DES 中一条线性关系依赖 12 位密钥,配合更多关系可恢复全密钥。


6. PRP、Feistel 与 AES 小结

  • 分组密码 = PRP;大输出时切换引理(T2/∣X∣T^2/|X|)让它可当 PRF 用。
  • 设计三步法:理想原语 → 构造 → 实例化(信仰之跃在第 3 步)。
  • Feistel 用随机函数造可逆置换;Luby–Rackoff 3/4 轮。
  • AES = 迭代 Even-Mansour(SubBytes/ShiftRows/MixColumns);防缓存侧信道。
  • 攻击靠统计偏置 + 海量明密文对(线性/差分密码分析)。

我的理解

分组密码的抽象安全与实现安全是两层问题;理想化 PRP 证明不会自动覆盖缓存、功耗和故障侧信道。