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 游戏中以概率 猜对挑战位。

攻击过程:

  1. 查询三块消息 ,得到 ,其中 。此时挑战者的状态为 ,即挑战密文将以 为 IV。
  2. 提交单块挑战消息
  3. 收到挑战密文 。若 输出 ,否则输出 。
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。对 :

  1. 采样 ,令 。
  2. 迭代生成密钥流:,。
  3. 加密:;输出 。

解密时由收到的 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。对 :

  1. 采样初始计数值 。
  2. 对 ,计算 与 ,其中 按模 计算后写成 位串。
  3. 输出 。

解密时用收到的 重算 ,得到 。

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 安全加密 / 解密其他
ECBPRP,需逆否(确定性)并行 / 并行无 IV
CBC,随机 IVPRP,需逆是串行 / 并行
Chained CBCPRP,需逆否串行 / 并行IV 可预测
OFBPRF是,带状态变体也是串行 / 串行可预计算密钥流
CTRPRF是并行 / 并行可预计算、可单独解密某块

除 ECB 外,表中模式的密文都比明文多一块 IV 或计数值,比 Lecture 7 中逐块带随机数的方案(密文长度翻倍)节省得多。

5. 选择密文攻击(CCA)安全

CPA 攻击者只能获得加密结果。实际中,攻击者还可能把自己构造的密文发给接收方,观察其解密结果或反应。选择密文攻击(Chosen-Ciphertext Attack,CCA)把这种能力形式化:在 CPA 的基础上,再给攻击者一个解密 oracle。

5.1 定义

定义:CCA 区分实验与安全性

对方案 ,定义实验 :

  1. 挑战者生成 。
  2. 第一查询阶段:PPT 攻击者 可以自适应地多次查询加密 oracle 和解密 oracle :提交明文 得到密文,提交密文 得到其解密结果。
  3. 挑战阶段: 提交两条等长消息 ;挑战者选择均匀比特 ,返回 。
  4. 第二查询阶段: 继续查询两个 oracle,唯一限制是不能向解密 oracle 提交 本身。
  5. 输出猜测 ;若 ,实验输出 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 游戏中以概率 猜对挑战位。

攻击过程:

  1. 提交任意两条不同的等长消息 ,收到 ,其中 。
  2. 任取 ,向解密 oracle 提交 。它不等于 ,是合法查询,返回
  3. 计算 ,与 比较即可。
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。