Lecture 6 用 PRF 构造了可以反复使用同一密钥的加密方案。本讲先补全它的 CPA 安全证明,再考虑如何处理长消息,引入流密码、分组密码及 ECB、CBC 两种工作模式。
Review:构造与证明目标
设 是 PRF, 表示 位串的均匀分布。固定秘密密钥 ,加密一条 位消息时:
Bob 收到 ,用相同的 重算掩码,恢复 。每次加密重抽的是公开随机数 ,秘密密钥 保持不变。
CPA 攻击者 可以在挑战前后选择明文、查询加密,也可以查询候选消息 。但接口只接受明文,内部随机数由加密算法独立生成; 不能要求下一次加密使用指定的 。
证明思路:先证明理想世界安全,再回到实际方案
目标是证明:攻击者即使见过许多已知明文的加密,也无法判断挑战密文加密了 还是 。
一次查询会暴露对应位置的掩码 ,目标却需要 。我们希望说明“知道其他位置,不能帮助知道目标位置”。对实际 PRF,不能直接把各位置的输出当成独立随机数,因此先换成真随机函数 。
真随机函数在不同输入处的值独立均匀。只要其他加密没有用到 ,挑战掩码 就像 OTP 的随机密钥一样隐藏消息;碰巧用到同一个输入的情况,再单独计算概率。
最后利用 PRF 假设回到实际方案:如果替换函数能让攻击者明显察觉,就可以借它区分 PRF 和随机函数,与前提矛盾。整个过程中,攻击者的 CPA 查询能力都被保留。
用四个完整的交互实验,把“替换函数”和“替换挑战消息”分开:
| 游戏 | 所有加密使用的函数 | 挑战加密的消息 |
|---|---|---|
| 真随机函数 | ||
| 真随机函数 | ||
每个实验中,普通查询与挑战加密共用同一个函数,每次加密独立采样 。随机函数也保持一致:同一输入再次出现时,必须返回上次的函数值。
记 。比较的是四个实验中同一个输出事件,不是分别比较“猜中各自挑战位”的概率。只需证明 可忽略。
1. 第一次替换: 与
两者加密的挑战消息相同,唯一差别是全部加密使用 还是真随机函数 。因此要把一个能察觉这种差别的加密攻击者,变成 PRF 区分器。
引理:PRF 替换
若 是 PRF,则对任意 PPT 攻击者 ,存在可忽略函数 ,使得
1.1 谁在询问什么
是试图区分挑战消息的加密攻击者。我们构造程序 ,让它运行 、回答后者的请求,并利用其最终输出区分函数。
得到函数 oracle :它能选择输入 并获得 ,但不知道 来自 还是随机函数 ,也不知道秘密密钥。
| 程序 | 可以提交什么 | 收到什么 |
|---|---|---|
| 明文 ;挑战消息对 | 普通密文;挑战密文 | |
| 函数输入 | 函数值 |
函数 oracle 是证明中给 的接口。 仍然只能使用加密接口,不能直接拿 查询 。
证明思路: 不知道密钥,怎么回答加密查询
生成 只需要三步:自己抽 、向 oracle 取得 、与已知的 异或。 无需知道 oracle 内部如何计算。
如果 ,这些回复就是真实 PRF 方案的密文;如果 ,它们就是随机函数方案的密文。 用同一套代码,让 oracle 的来源自动决定模拟的是哪个世界。
因而,若 能明显分辨两种密文交互, 直接转交它的输出,就能明显分辨两种函数。这里并没有破解密钥,而是把一种攻击转成另一种攻击。
1.2 模拟与概率对应
按以下方式模拟整个 CPA 交互:
- 运行 。每当它请求加密 ,独立采样 ,查询 ,返回 。
- 收到挑战消息对 时,采样新 ,查询 ,返回 。
- 挑战后的普通加密查询仍按第 1 步回答,最后输出 的输出比特。
夹在中间:对 扮演加密挑战者,对函数 oracle 扮演查询者。
sequenceDiagram participant A as 加密攻击者 A participant B as 归约 B(不知道 k) participant O as 函数 oracle O A->>B: 请加密明文 m Note over B: 自己采样 r ← Uₙ B->>O: r O-->>B: y = O(r) B-->>A: ⟨r, y ⊕ m⟩ A->>B: 挑战消息 m₀, m₁ Note over B: 采样新的 r* B->>O: r* O-->>B: O(r*) B-->>A: ⟨r*, O(r*) ⊕ m₀⟩ Note over A,B: 挑战后的加密查询同第一段 A->>B: 输出比特 Note over B: 原样输出:O = F_k 时模拟 H₀,O = f 时模拟 H₁
比较 时,两边的挑战消息都固定为 ,所以 不必猜挑战位。由模拟的精确对应关系,
每次加密只多做一次函数查询和一次异或,仍为 PPT。因此 PRF 安全性给出
2. 中间替换: 与
现在两边都使用随机函数,只把挑战消息从 换成 。这一步依靠 OTP 的性质和随机数碰撞的概率,不需要再使用 PRF 假设。
引理:随机函数世界中的消息隐藏
若 在挑战前后总共至多进行 次普通加密查询,则
对多项式 ,右边是可忽略函数。
2.1 唯一需要排除的情况
设挑战密文为 ,第 次普通查询返回 。攻击者知道查询明文 ,所以能恢复 。
若 ,它得到的是随机函数另一个位置的值,与 独立;若 ,它就拿到了挑战掩码,能恢复挑战明文。定义坏事件
挑战随机数独立于之前的随机数;挑战后的每次加密也独立采样随机数。即使攻击者根据已有密文自适应选择明文,也不能控制这一采样。单次命中概率为 ,并合界给出
这里只需控制普通查询与挑战输入的碰撞。普通查询之间重复不一定暴露挑战掩码,不必把所有碰撞都算进这个界。
2.2 没有碰撞时,为什么两种消息看起来一样
挑战位置尚未出现时, 是一个此前没有泄露的独立均匀串。无论挑战明文是什么, 都均匀分布;之后只要查询不命中 ,这个掩码也不会被额外暴露。
证明思路:把两个世界的回复配成一样
为了同时覆盖挑战前后的交互,可以把两个实验的随机选择“配对”:各自仍有正确分布,但尽量让攻击者看到完全一样的回复。
挑战前共用同一份交互记录。若 尚未使用,取一个均匀串 ,让两个挑战密文都为 ,并在各自的随机函数表中设置
因为 均匀,这两个函数值在各自世界中也均匀,符合随机函数的规则。其他输入处使用相同函数值,普通加密也使用相同随机数。
这样,两个世界的交互记录在发生 之前完全一致。若之后有查询命中 ,两份函数表才可能给出不同回复;若挑战时已经重复,也直接计入 。因此输出概率的差异最多等于这个坏事件的概率。
于是
这不是说查询被禁止或什么也学不到,而是说:查询通常只暴露其他位置的随机掩码,无法帮助分辨目标消息。
3. 合并得到 CPA 安全
最后把 的随机函数换回 PRF,保持挑战消息 不变。第 1 节的归约只需把挑战处的 改成 ,便得到 。
定理:PRF 加密方案满足 CPA 安全性
若 是 PRF,则加密方案
在同一密钥下、每次独立采样 时,满足 IND-CPA 安全性。
由三角不等式,
两端正是真实方案挑战位分别为 的实验。若 输出的比特作为猜测 ,则
证明的三步分别是:PRF 替换、随机掩码隐藏消息并控制碰撞、PRF 替换回去。
4. 流密码
前面的构造每次处理固定长度消息。长消息需要更长的掩码,而 PRG 的定义固定了输出长度。流密码把生成过程做成可持续运行的形式,按需产生密钥流(keystream)。
设密钥流各块为 ,与明文块等长。加密、解密都只做异或:
关键不是异或本身,而是双方如何生成相同的密钥流,以及如何避免把同一段密钥流用于不同明文。
4.1 同步方式:保存生成状态
Alice 和 Bob 从同一个秘密种子出发,各自保存生成器状态,并按相同顺序消耗密钥流。
例如,若 PRG 每次输出“下一状态”和“一块密钥流”,就可以迭代
用 加密当前块,再保存 供下次使用。接收方运行同样的过程,得到同一个 。
这里需要同步的是密钥流的位置:Alice 用第 块,Bob 也必须用第 块。若没有额外的位置管理,丢失、乱序或重置状态就可能使双方错位;把状态重置回旧位置还可能复用密钥流。
4.2 非同步方式:每条消息携带 IV
另一种方法是让每条消息带一个公开的初始化向量(initialization vector,IV)。双方通过秘密密钥 和 IV,独立生成这条消息的密钥流:
传输 。Bob 用同一个 、收到的 IV 重算 ,再异或恢复消息;无需知道上一条消息用到了哪一段密钥流。
同一 会产生同一密钥流,因此必须避免复用这一组合。若复用,便重新出现
这里的 表示具有相应安全保证的带密钥流生成器。不能仅凭普通 PRG 的定义,就断言把 当作种子可获得 CPA 安全;普通 PRG 的定义没有保证攻击者观察多个相关种子生成的输出时仍然安全。前面的 构造则有明确的 PRF 假设与证明。
5. 分组密码与工作模式
流密码生成掩码,再与明文异或。分组密码提供另一种基本工具:把一个固定长度的输入块,变成同样长度、可以用密钥逆转的输出块。
5.1 分组密码是带密钥的置换
可以把置换(permutation)想成给所有 位串重新排座位:每个输入对应唯一输出,每个输出也能唯一找回输入。因此它既不丢信息,也不会让不同输入得到相同输出。
定义:分组密码
分组密码由高效可计算的算法 构成,其中
是密钥长度, 是分组长度。对每个密钥 , 都是 上的置换,且 可以高效计算:
的算法公开,密钥 保密。固定 后, 和 都是确定性的。分组密码还需要安全要求,通常用下面的 PRP 或强 PRP 描述;仅仅可逆并不保证安全。
5.2 PRF 与 PRP
PRF 的理想对象是“随机填一张函数表”:不同输入可以碰巧填入相同输出。PRP 的理想对象是“随机洗牌”:所有输出各用一次,保持可逆。
| 对比 | PRF | PRP |
|---|---|---|
| 理想对象 | 均匀随机函数 | 均匀随机置换 |
| 不同输入能否同输出 | 可以 | 不可以 |
| 是否要求可逆 | 不要求 | 要求 |
| 固定密钥后 | 确定性函数 | 确定性置换 |
前面的 PRF 加密不需要求 :Bob 重新计算 即可。直接用分组密码变换明文时,解密则可能需要 。
5.3 PRP 安全性
攻击者不应仅凭若干输入、输出,就认出这个置换来自真实密码还是随机洗牌。记 为 上所有置换组成的集合。
定义:伪随机置换(PRP)
设 是高效可计算的带密钥置换。若对任意 PPT 区分器 ,存在可忽略函数 ,使得
则称 是 PRP。其中 均匀选自 ; 可自适应选择输入并查询正向函数,同一实验始终使用同一个置换。
5.4 强 PRP 安全性
普通 PRP 游戏只让攻击者问“这个输入变成什么”。强 PRP 进一步允许它问“这个输出原来是什么”,即同时提供正向和逆向查询。
定义:强伪随机置换(SPRP)
设 是带密钥置换,,两者均可高效计算。若对任意 PPT 区分器 ,存在可忽略函数 ,使得
则称 是强 PRP。区分器可以自适应查询两个 oracle;理想世界的 必须是同一个置换及其逆。
两种游戏的区别只在逆向查询:
sequenceDiagram participant D as PPT 区分器 D participant O as 置换 oracle Note over O: 真实世界:E_k 与 D_k,k ← Uₙ<br/>理想世界:π 与 π⁻¹,π ← Perm_b loop 自适应、多项式次 D->>O: 正向查询 x O-->>D: E_k(x) 或 π(x) D->>O: 逆向查询 y(仅强 PRP 游戏允许) O-->>D: D_k(y) 或 π⁻¹(y) end Note over D: 输出一个比特,判断是哪个世界
强 PRP 蕴含 PRP:只能正向查询的攻击者,也是强 PRP 游戏中一种不使用逆向接口的攻击者;反向蕴含一般不成立。能否高效解密与给予攻击者哪些查询权限,是不同层面的要求。
5.5 长消息与密文开销
一个分组密码只处理一块,长消息需要规定多块之间如何配合,这就是工作模式(mode of operation)。以下把 分为 位块;不足整块时,需要双方约定可唯一去除的填充规则。
先沿用已证明安全的 PRF 方案,逐块独立采样 ,使用定义域、值域均为 位的安全 PRF:
在前述 PRF 与碰撞概率可忽略的条件下,同一密钥下反复调用 CPA 安全方案仍能保护多条消息,因此这种逐块处理可以保护长消息。不过每块都携带一个随机数,密文长度为
接下来考虑能否只用一块 IV,甚至不用 IV,同时保持安全。
6. ECB
ECB(Electronic Codebook,电子密码本)最直接:对每个明文块分别调用分组密码,不增加 IV,也不把相邻块联系起来。
定义:ECB 模式
给定分组密码 及其逆 ,对 ,
解密逐块计算 ,再拼接还原消息。
flowchart LR m1["m₁"] --> E1["E_k"] --> c1["c₁"] m2["m₂"] --> E2["E_k"] --> c2["c₂"] m3["m₃"] --> E3["E_k"] --> c3["c₃"]
开销虽小,但同一密钥下,相同明文块总得到相同密文块。即使 是很安全的 PRP,这个相等关系也会暴露。
例题:不用加密查询,也能区分 ECB
选两块不同的值 ,提交等长挑战消息
收到两块挑战密文 后,若相等就猜 ,否则猜 。
加密 时,两块密文一定相同;加密 时,由于 是置换,,两块密文一定不同。因此攻击成功率为 ,ECB 不满足 CPA 安全性。
各块彼此独立,所以 ECB 的加密、解密都能并行。这个例子说明:底层分组密码安全,还必须配上合适的工作模式。
7. CBC
CBC(Cipher Block Chaining,密码分组链接)在每条消息开头引入随机 IV,再把前一个密文块混入下一个明文块,使每块的输入与前文相关。
7.1 加密与解密
IV 是公开的初始化值,长度与一个分组相同。Alice、Bob 仍然共用同一个秘密密钥 。
定义:CBC 模式
给定分组密码 及其逆 ,对 :
- 每条消息独立采样 ,设 。
- 按顺序计算
- 输出完整密文 。
解密使用收到的 ,逐块计算
解密先用 撤销分组密码,得到 ,再异或一次 ,便恢复 。
例题:两块消息的 CBC 加密与解密
图中两次 使用同一个秘密密钥; 都随密文公开。
flowchart TB accTitle: Two Block CBC Encryption accDescr: The first plaintext block is XORed with a public IV before encryption. Its ciphertext is then XORed with the second plaintext block before encryption under the same secret key. public_iv["公开 IV = c₀"] --> xor_first(("⊕")) plaintext_first["明文 m₁"] --> xor_first xor_first --> encrypt_first["用 E_k 加密"] --> ciphertext_first["密文 c₁"] ciphertext_first --> xor_second(("⊕")) plaintext_second["明文 m₂"] --> xor_second xor_second --> encrypt_second["用 E_k 加密"] --> ciphertext_second["密文 c₂"]Bob 已经收到 IV 和全部密文块,因此可以分别计算
恢复 只需要收到的 ,不必先恢复 。
7.2 安全性与效率
ECB 中直接重复的明文块会给出重复密文块。CBC 先异或 IV 或前一密文块,同一个明文块在不同上下文中不再必然得到相同输入;同一整条消息再次加密时,也会重抽 IV。
定理:随机 IV 的 CBC 满足 CPA 安全性
若 是安全 PRP,每条消息使用独立均匀的 IV,且总加密分组数 满足碰撞项 可忽略,则 CBC 满足 CPA 安全性。
直观上,先把底层置换换成随机置换,再分析链接过程中输入碰撞的概率;在没有相关碰撞时,新输入处的输出难以预测。完整证明还需控制各块之间的依赖,不能仅凭“加入了随机数”就断言安全。
IV 公开不影响解密与安全,但 CBC 需要在明文被选定时,下一条消息的 IV 尚不可预测。 每条消息由加密算法独立均匀采样即可满足要求。仅仅保证 IV 不重复,还不足以替代这一条件;也不能直接把上一条消息的最后一个密文块当作下一条消息的 IV。
加密必须先得到 才能计算 ,所以各块串行。解密时,所有密文块已经收到,各个 可以独立计算,因此能并行。
| 对比 | ECB | CBC |
|---|---|---|
| 密文长度,不计填充 | ||
| 初始化值 | 无 | 每条消息一块随机 IV |
| 加密 / 解密 | 并行 / 并行 | 串行 / 并行 |
| CPA 安全性 | 不满足 | 上述条件下满足 |
CBC 单独不提供完整性保护。例如把 IV 改为 ,而保持其他密文块不变,解出的第一块就变成 。隐藏消息内容与检测消息是否被篡改,需要分别考虑。