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 ,定义实验 :
- 挑战者生成 。
- PPT 攻击者 输入 ,可以自适应地多次查询标签 oracle:提交消息 ,得到 。记 为所有查询过的消息组成的集合。
- 输出一对 。
- 当且仅当以下两条同时成立时,实验输出 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,每条消息只有一个合法标签,两种定义等价。
例题:安全但不强安全的 MAC
题目:给定安全 MAC ,构造一个安全但不强安全的 MAC 。
构造:在原标签前附一个验证时忽略的随机比特。
- 。
- :计算 ,采样 ,输出 。
- :解析 ,输出 。
安全:若有人能为新消息 造出合法的 ,去掉 就得到 的伪造 ,与 安全矛盾。
不强安全:查询一次即可。
sequenceDiagram participant A as 攻击者 A participant C as 挑战者(持有 k) A->>C: 消息 m C-->>A: t′ = r ‖ t Note over A: 翻转首位:(1 − r) ‖ t A->>C: 伪造 (m, (1 − r) ‖ t) Note over C: 验证忽略首位,通过;该对未被查询过
2. 用 PRF 构造定长 MAC
PRF 的输出在没查询过的位置上看起来完全随机。直接把消息当作 PRF 的输入、函数值当作标签:攻击者查询过的位置知道标签,没查询过的位置猜不到。
构造:基于 PRF 的定长 MAC
设 是 PRF。
- :采样 。
- :对 ,输出 。
- :规范验证, 时输出 1,否则输出 0。
定理:PRF 给出安全的定长 MAC
若 是 PRF,则上述 是消息长度为 的安全 MAC。
MAC 也是私钥方案:每对通信者都要共享一把密钥,多方两两通信时需要很多把密钥。
2.1 证明
证明思路:先换成随机函数,再算猜中的概率
目标是说明攻击者几乎不可能为新消息造出合法标签。
若标签函数是真随机函数 ,结论很直接: 没被查询过, 是一个攻击者从没见过的均匀 位串,猜中的概率只有 。
实际用的是 ,所以先说明把 换成 不会明显改变攻击者的获胜概率。若改变明显,就能用攻击者区分 与 ,违反 PRF 假设。这与 CPA 安全证明中的混合论证相同,但只需两个游戏。
定义两个游戏: 是真实伪造实验,标签为 ; 中挑战者改用随机函数 ,标签为 ,其余不变。
目标 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)。
定义:认证加密(非形式)
加密方案若同时满足以下两条,则称为认证加密:
- CCA 安全:攻击者看到密文 ,无法得知 的信息,即使拥有加密与解密 oracle。
- 不可伪造性(unforgeability):攻击者若篡改密文或自行构造新密文 ,接收方解密得到 。
两条要求是相连的:若任何被改动的密文都会被拒绝,CCA 攻击者的解密 oracle 就只能返回 ,Lecture 8 中那种“改一改再请求解密”的攻击随之失效。
接下来要形式化不可伪造性,并研究怎样把 CPA 安全的加密与 MAC 组合成认证加密。