🏠 总目录📚 本教程 06 · 分组密码
📑 本页目录(点开跳转)

06 · 分组密码

25 分钟 | ⭐ 现代对称加密的地基


🎯 一句话

分组密码是一个由密钥控制的、固定长度的置换: 给它 128 bit,还你 128 bit,换个密钥就是完全不同的一张对应表几乎所有现代对称加密都建立在它之上。


🧱 一、定义与直觉

$$E_K: \{0,1\}^n \to \{0,1\}^n \quad\text{(可逆,$D_K(E_K(m)) = m$)}$$

💡 人话翻译

想象一本巨大的字典,它把每个 128 bit 的值映射到另一个 128 bit 的值, 一一对应,没有重复。密钥的作用就是「选哪一本字典」。

   K = 密钥A:  0000...  →  a7f3...
               0001...  →  9c2e...
               ...

   K = 密钥B:  0000...  →  3d81...   ← 完全不同的一本
               0001...  →  f0b6...

⭐ 核心概念:PRP 和 PRF

概念 全称 含义
PRP 伪随机置换 在固定密钥下,$E_K$ 看起来像一个随机的置换(可逆)
PRF 伪随机函数 看起来像一个随机的函数(不要求可逆)
   分组密码的安全目标:它是一个好的 PRP

   ⭐ 关键定理(PRP/PRF 切换引理):
      当 n 足够大时,PRP 和 PRF 在 q 次查询下的区别 ≈ q²/2ⁿ⁺¹

   → 128-bit 分组,查询 2⁶⁴ 次以内,两者【几乎无法区分】
   → 所以可以【把分组密码当 PRF 用】(第 7 章 CTR 模式就是这么干的)⭐
📐 为什么 PRP 和 PRF 会有差别(想看再点)

随机函数允许碰撞:$f(x_1) = f(x_2)$ 是可能的。 随机置换不允许:它是一一对应的。

所以攻击者的区分策略是:查询 q 次,看有没有出现输出碰撞

这就是两者的全部差距。$n=128$、$q = 2^{64}$ 时,这个优势约为 $2^{-1}$ —— 所以实际使用要保证同一密钥下的分组数远小于 $2^{64}$

💡 这个 $2^{n/2}$ 的界叫「生日界」,它是很多模式的实际安全上限, 也是 AES 的 128-bit 分组在超大数据量下开始吃紧的原因。


🏛️ 二、两种经典结构

① SPN(代换–置换网络)—— AES 走的路

每一轮:

SubBytes ← 代换,提供【混淆】
重复 10 / 12 / 14 轮(对应 128 / 192 / 256 位密钥)

🔗 这就是第 2 章 Shannon 说的混淆与扩散的工程实现: SubBytes 做混淆,ShiftRows + MixColumns 做扩散, 反复多轮,让改动 1 bit 的影响铺满整个分组

   雪崩效应实测:AES 改 1 bit 明文
   → 2 轮后就有约一半的 bit 变化
   → 10 轮后统计上和随机没有区别

② Feistel 网络 —— DES 走的路

   把分组劈成左右两半 (L, R):

   L' = R
   R' = L ⊕ f(R, K)     ← f 可以是【任意】函数,不需要可逆 ⭐

   解密:
   R  = L'
   L  = R' ⊕ f(L', K)   ← 一模一样的结构,倒着跑

💡 Feistel 的漂亮之处不管 f 是什么(甚至可以完全不可逆),整体结构一定可逆。 这让设计者可以自由地把 f 设计得尽可能非线性,不用操心可逆性。

副产品:加密和解密可以复用同一套硬件,只是轮密钥顺序相反。


📊 三、该用哪个(以及不该用哪个)

算法 分组 密钥 状态
DES 64 bit 56 bit 💀 已死。1998 年专用机器 56 小时暴力破解
3DES 64 bit 112 bit 有效 ⚠️ 已弃用。64-bit 分组导致 Sweet32 攻击
AES-128/256 128 bit 128/256 默认选择,有硬件指令(AES-NI)
ChaCha20 流密码 256 ✅ 无硬件加速时更快,移动端首选

💥 Sweet32(2016):3DES 和 Blowfish 的分组只有 64 bit, 由生日界,传输约 2³² 个分组(32GB)就会出现分组碰撞,泄露明文信息。 这是"分组长度"本身导致的攻击,和密钥长度无关 —— 也是为什么现代标准把分组定在 128 bit。

⚠️ 一个常见误解

   ❌ "AES-256 比 AES-128 安全一倍"

   ✅ 实际情况:
      · AES-128 的 2¹²⁸ 已经远超任何可行的攻击
      · 选 AES-256 的真正理由是【抗量子】(Grover 算法把强度减半,
        AES-256 → 128 bit 有效强度,见第 23 章) ⭐
      · AES-256 轮数更多,性能略低

   → 日常用 AES-128 完全足够;有长期保密需求才上 256

🔬 四、怎么判断一个分组密码是安全的

没有人能"证明" AES 安全 —— 只能说它经受住了所有已知的攻击方法:

攻击方法 思路
差分密码分析 追踪"明文差值 → 密文差值"的概率偏差
线性密码分析 找"某些明文位 ⊕ 某些密文位 ⊕ 某些密钥位 = 0"的统计偏差
积分攻击 / 不可能差分 构造特殊的明文集合,看输出的结构性质
相关密钥攻击 利用密钥之间的已知关系

🔑 一个有意思的历史DES 在 1977 年的设计就已经对差分密码分析免疫 —— 但差分分析直到 1990 年才被公开发表。 后来证实 IBM 和 NSA 当时就知道这个技术,只是没公开。

💡 这说明了公开审查的价值:AES 是公开竞赛选出来的(1997–2000), 全世界密码学家攻了三年,这比任何单一机构的背书都可信。


🔗 和站内其他章的关系

相关的地方 和这一章的关系
第 2 章 混淆与扩散 AES 的 SubBytes / MixColumns
第 4 章 PRG 分组密码在 CTR 下就是 PRG
第 5 章 流密码 CTR 模式把分组密码变成流密码
第 7 章 工作模式 分组密码只能加密 128 bit,长消息怎么办
第 1 章 侧信道 AES 的查表实现有缓存计时攻击,要用 AES-NI 或恒定时间实现 ⭐
AI 基础设施 · 显存与带宽墙 缓存计时攻击的物理前提,就是那张内存层次表体现的东西:越往下越慢、差好几个数量级,而这个时间差可以测量,查表实现就靠它泄露密钥字节 ⭐ ⚠️ 注意那张表给的是带宽(Shared Memory/L1 比 HBM 约 5 倍),计时攻击吃的是访存延迟之比 —— 后者在 CPU 上(L1 vs DRAM)接近百倍
AI 基础设施 · GPU 到底是什么 Tensor Core 和 AES-NI 是同一个思路——把热点原语做进指令集;密码学这边还白得一个副产品:硬件实现天然是恒定时间的

✅ 检查点

  1. 分组密码的定义是什么?密钥的作用是什么?
  2. PRP 和 PRF 的区别?为什么可以把分组密码当 PRF 用?
  3. 攻击者怎么区分随机置换和随机函数?这给出了什么安全上限?
  4. SPN 的四个步骤各提供什么?
  5. Feistel 网络最漂亮的性质是什么?带来什么好处?
  6. Sweet32 攻击的根因是什么?它和密钥长度有关吗?
  7. AES-256 比 AES-128 好在哪?真正的理由是什么?
  8. 为什么说 AES 的公开竞赛比机构背书更可信?
👀 答案
  1. $E_K: \{0,1\}^n \to \{0,1\}^n$,一个可逆的、固定长度的置换。密钥的作用是选哪一本"字典"(哪个置换)。
  2. PRP 是伪随机置换(可逆、不碰撞),PRF 是伪随机函数(可碰撞)。因为 PRP/PRF 切换引理:q 次查询下差距约 q²/2ⁿ⁺¹,128-bit 分组在 2⁶⁴ 次查询内几乎无法区分。
  3. 查询 q 次看有没有输出碰撞——随机函数会碰撞(概率约 q²/2ⁿ⁺¹),随机置换永远不会。这给出 2^(n/2) 的生日界,即同一密钥下的分组数必须远小于 2⁶⁴。
  4. SubBytes 提供混淆、ShiftRows 换位置、MixColumns 提供扩散、AddRoundKey 混入轮密钥。反复多轮达成雪崩效应。
  5. 不管 f 是什么(甚至完全不可逆),整体结构一定可逆。好处:设计者可以自由地把 f 做得尽可能非线性;且加解密能复用同一套硬件,只是轮密钥顺序相反。
  6. 根因是分组长度只有 64 bit。由生日界,约 2³² 个分组(32GB)后出现分组碰撞泄露明文。和密钥长度完全无关——这是分组长度本身导致的,也是现代标准定在 128 bit 的原因。
  7. 主要是抗量子:Grover 算法把对称密码强度减半,AES-256 → 128 bit 有效强度。AES-128 的 2¹²⁸ 对经典计算机已远超可行范围,日常够用。
  8. 因为 AES 是 1997–2000 的公开竞赛选出来的,全世界密码学家公开攻了三年。对比:DES 对差分分析的免疫力是 IBM/NSA 私下知道但没公开的——公开审查让"没人攻破"真正有意义。

🛑 可以停在这里

走神救援

分组密码 = 由密钥控制的、固定长度的可逆置换(给128bit还128bit),密钥的作用是选哪一本字典。⭐PRP(伪随机置换,可逆不碰撞)vs PRF(伪随机函数,可碰撞):区分方法是查询 q 次看有没有输出碰撞,差距约 q²/2ⁿ⁺¹ → 生日界 2^(n/2),所以 128-bit 分组在 2⁶⁴ 次内两者几乎无法区分,因此可以把分组密码当 PRF 用(CTR 模式的理论依据)。两种结构:SPN(AES)——SubBytes 混淆 / ShiftRows 换位 / MixColumns 扩散 / AddRoundKey,多轮迭代达成雪崩(改1bit,2轮后半数bit变化);Feistel(DES)——L'=R, R'=L⊕f(R,K),⭐漂亮之处:不管 f 是否可逆整体一定可逆,所以 f 可以尽情非线性,且加解密复用同一套硬件。选型:DES 已死(56bit密钥)、3DES 弃用(💥Sweet32:64-bit 分组,传 32GB 就出现分组碰撞——这是分组长度导致的,和密钥长度无关,也是现代定在128bit的原因)、AES-128 默认够用、ChaCha20 无硬件加速时更快。⚠️AES-256 不是"安全一倍",真正理由是抗量子(Grover 把强度减半,256→128有效)。安全性无法证明,只能靠经受住差分/线性/积分/相关密钥分析——⭐AES 是公开竞赛选出来的,全世界攻了三年,这比机构背书可信(对比:DES 对差分分析的免疫是 IBM/NSA 私下知道却没公开的)。⚠️ AES 查表实现有缓存计时攻击,要用 AES-NI 或恒定时间实现。

下一节 👉 07-工作模式.md

打卡记录保存在你的浏览器里,首页能看到总进度