Lecture 7 介绍了 ECB 与 CBC:ECB 是确定性的,不满足 CPA 安全;CBC 在每条消息使用独立随机 IV 时满足 CPA 安全,但加密只能串行。本讲先说明 IV 可预测时 CBC 会被攻破,再引入 OFB、CTR 两种只需 PRF 的模式;随后加强攻击者能力,定义 CCA 安全;最后转向加密之外的目标——消息完整性,引入消息认证码(MAC)。
下文沿用 Lecture 7 的记号:分组长度为 ,消息 ,每块 位; 为分组密码(PRP), 为 PRF。
1. Chained CBC 不满足 CPA 安全
CBC 每条消息都要传一块新的随机 IV。一个看似节省的做法是:只在第一条消息采样 IV,之后每条消息直接把上一条消息的最后一个密文块当作 IV。Lecture 7 已指出这样不行,这里给出具体攻击。
定义:Chained CBC
加密第一条消息时采样 ,按 CBC 计算 ,其中 。
此后发送方保存状态:上一条消息的最后一个密文块 。下一条消息以 作为 继续按 CBC 加密,不再采样、也不再传输新的 IV。
问题在于:加密下一条消息前,攻击者已经从上一条密文中看到了 ,即下一条消息的 IV 是可预测的。CBC 中第一块的分组密码输入是 ;预先知道 IV,攻击者就能选择明文,让这个输入等于某个之前出现过的输入,从而得到重复的密文块。
命题:Chained CBC 不满足 CPA 安全
即使 是安全的 PRP,Chained CBC 也存在 PPT 攻击者,在 CPA 游戏中以概率 猜对挑战位。
攻击过程:
- 查询三块消息 ,得到 ,其中 。此时挑战者的状态为 ,即挑战密文将以 为 IV。
- 提交单块挑战消息
- 收到挑战密文 。若 输出 ,否则输出 。
sequenceDiagram participant A as 攻击者 A participant C as 挑战者(持有 k) A->>C: 加密 oracle:m₁ ‖ m₂ ‖ m₃ Note over C: 采样 IV,按 CBC 加密 C-->>A: IV, c₁, c₂, c₃,其中 c₁ = E_k(IV ⊕ m₁) Note over C: 状态更新:下一条的 IV = c₃ Note over A: 已知下一条的 IV 是 c₃ A->>C: 挑战:M₀ = IV ⊕ m₁ ⊕ c₃,M₁ ≠ M₀ Note over C: 抽 b,计算 c* = E_k(c₃ ⊕ M_b) C-->>A: c* Note over A: b = 0 时 E_k 的输入为 IV ⊕ m₁,c* = c₁<br/>c* = c₁ 则猜 0,否则猜 1 A->>C: 猜测 b′
若 ,第一块输入为 ,故 。若 ,输入 ,而 是置换,故 。攻击者总能猜对。
查询几块并不重要,只查询一块消息、用 作下一条的 IV 同样可行。关键是 IV 在攻击者选择明文之前就已确定并且被攻击者知道;CBC 需要的是选择明文时 IV 不可预测,而不仅仅是 IV 不重复。
2. OFB 模式
Chained CBC 的漏洞来自明文直接进入 的输入,攻击者可以通过选择明文控制输入。若改为让 只作用于与明文无关的值,用它生成密钥流,再与明文异或,就避开了这个问题。这就是输出反馈(Output Feedback,OFB)模式,它把 PRF 当作流密码的密钥流生成器。
定义:OFB 模式
设 是 PRF。对 :
- 采样 ,令 。
- 迭代生成密钥流:,。
- 加密:;输出 。
解密时由收到的 IV 重算同一组 ,得到 。
flowchart TB IV["IV = r₀(随机,公开)"] --> F1["F_k"] --> r1["r₁"] r1 --> F2["F_k"] --> r2["r₂"] r1 --> X1(("⊕")) m1["m₁"] --> X1 --> c1["c₁"] r2 --> X2(("⊕")) m2["m₂"] --> X2 --> c2["c₂"]
明文只参与最后的异或,不进入 。
的输入是 IV 和此前的 输出,与明文无关;解密也只需正向计算 。因此 OFB 有以下特点:
- 不需要 可逆: 只需是 PRF,不必是置换。
- 若 是 PRF,则 OFB 满足 CPA 安全。 直观上,换成随机函数后,只要挑战消息使用的这串输入 没有与其他加密用到的输入重复,挑战密钥流就是新的均匀串,像 OTP 一样隐藏明文;发生重复的概率可忽略。
- 带状态变体也满足 CPA 安全:只在第一条消息采样 IV,之后每条消息从上一条最后的 继续迭代,相当于把一条长密钥流分段使用。攻击者虽能由 算出 ,但仍无法预测 ,也无法通过选择明文影响 的输入。这正是它与 Chained CBC 的区别。
- 缺点: 依赖 ,加密、解密都只能串行。不过密钥流与明文无关,IV 确定后可以预先计算,收到明文时只需做异或。
3. CTR 模式
OFB 的串行来自密钥流的迭代。若改为对一串不同的计数值分别求 ,各块密钥流就互不依赖。这就是计数器(Counter,CTR)模式。
3.1 定义
定义:CTR 模式
设 是 PRF。对 :
- 采样初始计数值 。
- 对 ,计算 与 ,其中 按模 计算后写成 位串。
- 输出 。
解密时用收到的 重算 ,得到 。
flowchart LR t1["ctr + 1"] --> F1["F_k"] --> X1(("⊕")) m1["m₁"] --> X1 --> c1["c₁"] t2["ctr + 2"] --> F2["F_k"] --> X2(("⊕")) m2["m₂"] --> X2 --> c2["c₂"]
CTR 的优点:
- 不需要 可逆,只需 PRF。
- 若 是 PRF,则 CTR 满足 CPA 安全。
- 加密、解密都可并行:各 只依赖 和 。密钥流同样可以预先计算。
- 可以单独解密第 块:只需计算 ,不必处理前面的块。
3.2 为什么安全
证明与 Lecture 7 中 PRF 加密方案的证明相同:先把 换成随机函数 ,再说明挑战密钥流与攻击者见过的一切独立。
一次加密使用的是一段连续的 输入 。随机函数在不同输入上的值独立均匀,所以只要挑战消息的这段输入与其他加密的输入区间不重叠,挑战密钥流就是此前未泄露的均匀串,挑战密文与 、 无关。
坏事件只剩区间重叠。设挑战用 、长度 ,某次查询用 、长度 。两段重叠当且仅当 落在 个特定值之中;两个计数值独立均匀,故此概率至多 。若共 次查询,每条消息至多 块,由并合界,
在 为多项式时可忽略。
4. 工作模式对比
| 模式 | 底层要求 | CPA 安全 | 加密 / 解密 | 其他 |
|---|---|---|---|---|
| ECB | PRP,需逆 | 否(确定性) | 并行 / 并行 | 无 IV |
| CBC,随机 IV | PRP,需逆 | 是 | 串行 / 并行 | |
| Chained CBC | PRP,需逆 | 否 | 串行 / 并行 | IV 可预测 |
| OFB | PRF | 是,带状态变体也是 | 串行 / 串行 | 可预计算密钥流 |
| CTR | PRF | 是 | 并行 / 并行 | 可预计算、可单独解密某块 |
除 ECB 外,表中模式的密文都比明文多一块 IV 或计数值,比 Lecture 7 中逐块带随机数的方案(密文长度翻倍)节省得多。
5. 选择密文攻击(CCA)安全
CPA 攻击者只能获得加密结果。实际中,攻击者还可能把自己构造的密文发给接收方,观察其解密结果或反应。选择密文攻击(Chosen-Ciphertext Attack,CCA)把这种能力形式化:在 CPA 的基础上,再给攻击者一个解密 oracle。
5.1 定义
定义:CCA 区分实验与安全性
对方案 ,定义实验 :
- 挑战者生成 。
- 第一查询阶段:PPT 攻击者 可以自适应地多次查询加密 oracle 和解密 oracle :提交明文 得到密文,提交密文 得到其解密结果。
- 挑战阶段: 提交两条等长消息 ;挑战者选择均匀比特 ,返回 。
- 第二查询阶段: 继续查询两个 oracle,唯一限制是不能向解密 oracle 提交 本身。
- 输出猜测 ;若 ,实验输出 1,否则输出 0。
若对任意 PPT 攻击者 ,存在可忽略函数 ,使得
则称 满足 CCA 安全性(IND-CCA)。
与 CPA 实验相比,两个查询阶段都多了解密 oracle:
sequenceDiagram participant A as PPT 攻击者 A participant C as 挑战者(持有 k) Note over C: 生成 k ← Gen(1ⁿ) loop 第一查询阶段 A->>C: 明文 m(加密 oracle) C-->>A: Enc_k(m) A->>C: 密文 c(解密 oracle) C-->>A: Dec_k(c) end A->>C: 等长挑战消息 m₀, m₁ Note over C: 抽均匀比特 b C-->>A: c* ← Enc_k(m_b) loop 第二查询阶段 A->>C: 明文,或密文 c ≠ c* C-->>A: 加密或解密结果 end A->>C: 猜测 b′
禁止解密 是为了排除平凡攻击;除此之外,任何密文都可以查询,包括与 只差一位的密文。不使用解密 oracle 的攻击者就是 CPA 攻击者,所以 CCA 安全蕴含 CPA 安全。
5.2 PRF 加密方案不满足 CCA 安全
Lecture 7 证明了 满足 CPA 安全。有了解密 oracle 后,它立即被攻破。
命题:CPA 安全的 PRF 加密方案不满足 CCA 安全
存在 PPT 攻击者,在 CCA 游戏中以概率 猜对挑战位。
攻击过程:
- 提交任意两条不同的等长消息 ,收到 ,其中 。
- 任取 ,向解密 oracle 提交 。它不等于 ,是合法查询,返回
- 计算 ,与 比较即可。
sequenceDiagram participant A as 攻击者 A participant C as 挑战者(持有 k) A->>C: m₀, m₁ Note over C: 抽 b,采样 r C-->>A: c* = ⟨r, s⟩,s = F_k(r) ⊕ m_b Note over A: 任取 s′ ≠ s A->>C: 解密 oracle:⟨r, s′⟩,不等于 c* C-->>A: m′ = F_k(r) ⊕ s′ Note over A: m′ ⊕ s′ = F_k(r)<br/>F_k(r) ⊕ s = m_b A->>C: 猜测 b′
攻击没有求出 在新位置上的值,而是利用了可延展性(malleability):改动密文中的 ,明文就以可预测的方式随之改变。这样就能构造一个“不同但相关”的密文,绕过对 的限制。
Remark:本讲的 CPA 安全模式都不满足 CCA 安全
OFB、CTR 同样是“密钥流异或明文”,翻转 的某些位,就翻转 的对应位,可用完全相同的方式攻击。CBC 中把 IV 改为 ,解密出的第一块变为 ,同样可以利用。要抵抗 CCA,需要让被篡改的密文无法得到有意义的解密结果。
6. 阶段回顾:前三章
到这里,教材前三章的内容已经完成:
| 章节 | 主要内容 | 笔记 |
|---|---|---|
| Ch. 1 Introduction | 古典密码及其攻击;现代密码学三原则 | Lecture 1、Lecture 2 |
| Ch. 2 Perfectly Secret Encryption | 完美保密、OTP、密钥长度下界 | Lecture 2、Lecture 3 |
| Ch. 3 Private-Key Encryption | 计算安全、PRG 与伪 OTP、CPA 安全、PRF/PRP、流密码与分组密码工作模式、CCA 安全 | Lecture 4 至本讲 |
主线是:完美保密要求密钥与消息一样长,于是放宽为计算安全;用 PRG 得到单消息安全,用 PRF 得到 CPA 安全,并用工作模式高效处理长消息。这些方案解决的都是保密性;下一章转向另一类目标。
7. 消息完整性
除了不让 Eve 读懂消息,Bob 还需要确认:收到的消息 确实来自 Alice,并且传输中没有被修改。这称为消息完整性(message integrity)。这里 Eve 是主动攻击者,可以拦截、篡改或伪造消息。
7.1 加密不能保证完整性
保密性只要求密文不泄露明文信息,并不阻止攻击者有目的地修改密文。以伪 OTP 为例,。Eve 截获 后发送
Bob 解密得到 ,即每一位都被翻转。Eve 不知道 和 ,却精确控制了明文的变化;若她知道 ,发送 还能把明文换成任意等长的 。Bob 对此没有任何检测手段。
第 5.2 节的可延展性也是同一个问题。因此完整性需要单独的工具。
7.2 MAC 的语法与正确性
消息认证码(Message Authentication Code,MAC)让 Alice 用共享密钥为消息计算一个标签(tag) ,与消息一起发送 。Bob 用同一个密钥检查标签;没有密钥的 Eve 难以为被修改的消息配上合法标签。MAC 只负责完整性,不隐藏 。
sequenceDiagram participant Alice as Alice(持有 k) participant Eve as Eve(不知道 k) participant Bob as Bob(持有 k) Note over Alice,Bob: 事先:k ← Gen(1ⁿ) Note over Alice: t ← Mac_k(m) Alice->>Bob: (m, t),明文公开传输 Note over Eve: 想换成 (m′, t′),但没有 k,<br/>难以为 m′ 配出合法标签 Note over Bob: Verify_k(m, t) = 1 才接受
定义:消息认证码(MAC)
MAC 由三个 PPT 算法 组成:
- 密钥生成 :输入安全参数,输出密钥 。
- 标签生成 :输入密钥 与消息 ,输出标签 ;可以是随机化的。
- 验证 :输入密钥、消息与标签,输出比特 ; 表示有效(valid), 表示无效(invalid)。
正确性:对任意 、任意由 输出的 以及任意 ,
若存在函数 ,使 只对 有定义,则称其为固定长度 MAC。
Alice、Bob 共享同一个 ,所以 MAC 属于私钥(对称)方案。正确性只保证诚实生成的标签能通过验证;Eve 能否伪造标签,由之后的安全定义刻画。
7.3 规范验证
若 是确定性的,验证方可以直接重算标签,这称为规范验证(canonical verification):
此时正确性自动成立。若 是随机化的,重算一般得不到同一个标签,就需要专门设计 。
接下来要回答的问题是:怎样形式化“攻击者无法伪造标签”,以及如何用 PRF 构造满足这一要求的 MAC。