Lecture 8 给出了 MAC 的语法与正确性。本讲先定义 MAC 的安全性,即攻击者无法伪造标签;再用 PRF 构造定长 MAC 并证明安全;之后用 CBC-MAC 处理长消息,说明它在消息长度可变时的漏洞与修补;最后引出同时要求保密与防篡改的认证加密。

Review:工作模式与两个新目标

模式并行每条消息独立随机 IV 时带状态连续加密时
ECB能不满足 CPA 安全—
CBC加密串行CPA 安全不满足(Chained CBC,IV 可预测)
OFB串行CPA 安全仍 CPA 安全
CTR能CPA 安全仍 CPA 安全

“带状态连续加密”指只在第一条消息选随机值,之后每条消息接着上一条的状态继续。OFB、CTR 接续的都是 的输入,攻击者无法通过选择明文控制它们;CBC 接续的是密文块,会把下一条的 IV 提前告诉攻击者。

上述方案都不满足 CCA 安全:密文可延展,改动密文能可预测地改动明文。因此需要抵抗修改的能力,这也是完整性的要求,工具是 MAC。

1. MAC 的安全性

MAC 的目标是:没有密钥的人无法为消息配上合法标签。攻击者在现实中可能见过许多合法的 ,甚至能诱导 Alice 为自选消息计算标签,所以定义中给攻击者一个标签 oracle。

1.1 伪造实验

定义:MAC 伪造实验与安全性

对 MAC ,定义实验 :

  1. 挑战者生成 。
  2. PPT 攻击者 输入 ,可以自适应地多次查询标签 oracle:提交消息 ,得到 。记 为所有查询过的消息组成的集合。
  3. 输出一对 。
  4. 当且仅当以下两条同时成立时,实验输出 1(攻击者获胜):
    • ;
    • 。

若对任意 PPT 攻击者 ,存在可忽略函数 ,使得

则称 是安全的 MAC。

sequenceDiagram
    participant A as PPT 攻击者 A
    participant C as 挑战者(持有 k)
    Note over C: 生成 k ← Gen(1ⁿ)
    loop 自适应、多项式次
        A->>C: 消息 m(标签 oracle)
        C-->>A: t ← Mac_k(m)
    end
    Note over A,C: Q = 查询过的消息集合
    A->>C: 伪造 (m*, t*)
    Note over C: 获胜:Verify_k(m*, t*) = 1 且 m* ∉ Q

与加密的安全定义不同,这里没有挑战位,也不和 比较:攻击者要做成一件事(产生新消息的合法标签),所以要求的是成功概率本身可忽略。

要求 ,是为了排除平凡攻击:直接重放查询得到的 必然通过验证。这也意味着 MAC 本身不防重放;重放需要在协议层面用序号、时间戳等另行处理。

1.2 强安全性

若 是随机化的,同一条消息再次查询会得到新的标签。若攻击者能为已查询过的消息造出一个新的合法标签,在普通定义下不算获胜,但这仍是一种伪造。强安全性把这种情况也算作攻击成功。

定义:MAC 的强安全性

实验流程与伪造实验相同,但 改为所有查询得到的消息—标签对 的集合。攻击者获胜当且仅当

  • ;
  • 。

若对任意 PPT 攻击者,获胜概率可忽略,则称 是强安全的 MAC。

蕴含 ,所以强安全蕴含安全。对使用规范验证的确定性 MAC,每条消息只有一个合法标签,两种定义等价。

2. 用 PRF 构造定长 MAC

PRF 的输出在没查询过的位置上看起来完全随机。直接把消息当作 PRF 的输入、函数值当作标签:攻击者查询过的位置知道标签,没查询过的位置猜不到。

构造:基于 PRF 的定长 MAC

设 是 PRF。

  • :采样 。
  • :对 ,输出 。
  • :规范验证, 时输出 1,否则输出 0。

定理:PRF 给出安全的定长 MAC

若 是 PRF,则上述 是消息长度为 的安全 MAC。

MAC 也是私钥方案:每对通信者都要共享一把密钥,多方两两通信时需要很多把密钥。

2.1 证明

定义两个游戏: 是真实伪造实验,标签为 ; 中挑战者改用随机函数 ,标签为 ,其余不变。

目标 1:。

反设差值不可忽略。构造 PRF 区分器 :它把 的每个标签查询转交给自己的函数 oracle ; 输出 后, 再查询 ,若 且 则输出 1,否则输出 0。

sequenceDiagram
    participant A as 伪造者 A
    participant B as 区分器 B(不知道 k)
    participant O as 函数 oracle O
    loop 多项式次
        A->>B: 消息 m
        B->>O: m
        O-->>B: y = O(m)
        B-->>A: 标签 y
    end
    A->>B: 伪造 (m*, t*)
    B->>O: m*
    O-->>B: y* = O(m*)
    Note over B: m* ∉ Q 且 y* = t* 则输出 1,否则输出 0

时, 精确模拟 ; 时,精确模拟 。因此

只比 多一次查询,仍为 PPT,其区分优势等于上述差值,不可忽略,与 是 PRF 矛盾。

目标 2:。

获胜要求 ,所以 从未出现在 的视图中,是独立于其视图的均匀 位串。无论 怎样选择 ,都有 。

合并两步:

右侧可忽略,定理得证。

3. CBC-MAC:从定长到长消息

上面的 MAC 只能处理恰好 位的消息。长消息 (每块 位)需要新的构造。

逐块计算 、输出 ,标签就和消息一样长;而且各块标签互不相关,交换两块消息及对应的标签块,就得到一条新消息的合法标签。CBC-MAC 改为像 CBC 一样把各块串起来,最后只输出一块 位标签。

3.1 构造

构造:CBC-MAC

设 是 PRF,消息为 ,。

  • :采样 。
  • :计算

只输出最后一块 。

  • :规范验证,重算 并与 比较。
flowchart LR
    m1["m₁"] --> F1["F_k"] --> t1["t₁"]
    t1 --> X2(("⊕"))
    m2["m₂"] --> X2 --> F2["F_k"] --> t2["t₂"]
    t2 --> X3(("⊕"))
    m3["m₃"] --> X3 --> F3["F_k"] --> t3["t = t₃"]

中间值 不输出。

定理:定长 CBC-MAC 的安全性

若 是 PRF,固定 ,则 CBC-MAC 对长度恰为 的消息是安全 MAC。

证明较复杂,这里不展开。

Remark:CBC-MAC 与 CBC 加密的差别

CBC-MAC 没有随机 IV,链从 开始,并且只输出最后一块;CBC 加密需要随机 IV,并输出全部密文块。这两点不能照搬到 MAC 上。例如若标签带随机 IV,即 、输出 ,则对单块消息,攻击者把 改成 ,就得到 的合法标签。

3.2 消息长度可变时不安全

若允许不同长度的消息,攻击者可以把一条短消息的标签当作长消息链中的中间值,从而拼出新消息的标签。

命题:CBC-MAC 对变长消息不安全

若消息空间包含不同块数的消息,则存在 PPT 攻击者以概率 1 伪造成功。

sequenceDiagram
    participant A as 攻击者 A
    participant C as 挑战者(持有 k)
    A->>C: 单块消息 m₁
    C-->>A: t₁ = F_k(m₁)
    Note over A: 选 m₂,使 m₂ ⊕ t₁ ≠ m₁
    A->>C: 两块消息 m₁ ‖ m₂
    C-->>A: t₂ = F_k(t₁ ⊕ m₂)
    A->>C: 伪造 (m* = m₂ ⊕ t₁, t* = t₂)
    Note over C: Mac_k(m*) = F_k(m₂ ⊕ t₁) = t₂,验证通过

单块消息 的标签是 ,正好是两块消息 链上的第二步,等于 。由于 在看到 后才选 ,可以保证 ; 只有一块,也不等于 。因此 ,伪造成功。

漏洞的根源是:短消息的标签就是长消息链上的中间值,CBC-MAC 不区分“链在这里结束”还是“链还要继续”。

3.3 两种修补

两种修补都让不同长度的消息无法共用链上的中间值。

方法一:长度前置。 把消息长度(这里用块数 ;用比特长度 同样可以)编码为一个 位块 ,先算 ,再从 开始照常链接:

flowchart LR
    L["⟨ℓ⟩(消息长度)"] --> F0["F_k"] --> t0["t₀"]
    t0 --> X1(("⊕"))
    m1["m₁"] --> X1 --> F1["F_k"] --> t1["t₁"]
    t1 --> X2(("⊕"))
    m2["m₂"] --> X2 --> F2["F_k"] --> t2["t = t₂"]

这等价于对 计算普通 CBC-MAC。长度不同的消息,链的起点就不同,短消息的标签不再是长消息链上的中间值。长度必须放在开头;放在最后一块仍不安全。

方法二:加密 CBC-MAC。 使用两把独立密钥 ,先用 计算普通 CBC-MAC 的结果 ,再输出

flowchart LR
    m["m₁ ‖ … ‖ m_ℓ"] --> CBC["用 k₁ 计算 CBC-MAC"] --> tl["t_ℓ(不公开)"]
    tl --> F2["F_k₂"] --> t["t"]

第 3.2 节的攻击需要拿到链上的中间值 。这里公开的标签是 ,不再等于链上的任何中间值,攻击者无法把它接到下一块上。

4. 认证加密

到这里,已有 CPA 安全的加密方案负责保密,也有安全的 MAC 负责防篡改。实际通信需要两者同时成立,这就是认证加密(Authenticated Encryption,AE)。

定义:认证加密(非形式)

加密方案若同时满足以下两条,则称为认证加密:

  1. CCA 安全:攻击者看到密文 ,无法得知 的信息,即使拥有加密与解密 oracle。
  2. 不可伪造性(unforgeability):攻击者若篡改密文或自行构造新密文 ,接收方解密得到 。

两条要求是相连的:若任何被改动的密文都会被拒绝,CCA 攻击者的解密 oracle 就只能返回 ,Lecture 8 中那种“改一改再请求解密”的攻击随之失效。

接下来要形式化不可伪造性,并研究怎样把 CPA 安全的加密与 MAC 组合成认证加密。