Lecture 6 用 PRF 构造了可以反复使用同一密钥的加密方案。本讲先补全它的 CPA 安全证明,再考虑如何处理长消息,引入流密码、分组密码及 ECB、CBC 两种工作模式。

Review:构造与证明目标

设 是 PRF, 表示 位串的均匀分布。固定秘密密钥 ,加密一条 位消息时:

Bob 收到 ,用相同的 重算掩码,恢复 。每次加密重抽的是公开随机数 ,秘密密钥 保持不变。

CPA 攻击者 可以在挑战前后选择明文、查询加密,也可以查询候选消息 。但接口只接受明文,内部随机数由加密算法独立生成; 不能要求下一次加密使用指定的 。

用四个完整的交互实验,把“替换函数”和“替换挑战消息”分开:

游戏所有加密使用的函数挑战加密的消息
真随机函数
真随机函数

每个实验中,普通查询与挑战加密共用同一个函数,每次加密独立采样 。随机函数也保持一致:同一输入再次出现时,必须返回上次的函数值。

记 。比较的是四个实验中同一个输出事件,不是分别比较“猜中各自挑战位”的概率。只需证明 可忽略。

1. 第一次替换: 与

两者加密的挑战消息相同,唯一差别是全部加密使用 还是真随机函数 。因此要把一个能察觉这种差别的加密攻击者,变成 PRF 区分器。

引理:PRF 替换

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

1.1 谁在询问什么

是试图区分挑战消息的加密攻击者。我们构造程序 ,让它运行 、回答后者的请求,并利用其最终输出区分函数。

得到函数 oracle :它能选择输入 并获得 ,但不知道 来自 还是随机函数 ,也不知道秘密密钥。

程序可以提交什么收到什么
明文 ;挑战消息对 普通密文;挑战密文
函数输入 函数值

函数 oracle 是证明中给 的接口。 仍然只能使用加密接口,不能直接拿 查询 。

1.2 模拟与概率对应

按以下方式模拟整个 CPA 交互:

  1. 运行 。每当它请求加密 ,独立采样 ,查询 ,返回 。
  2. 收到挑战消息对 时,采样新 ,查询 ,返回 。
  3. 挑战后的普通加密查询仍按第 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 的理想对象是“随机洗牌”:所有输出各用一次,保持可逆。

对比PRFPRP
理想对象均匀随机函数均匀随机置换
不同输入能否同输出可以不可以
是否要求可逆不要求要求
固定密钥后确定性函数确定性置换

前面的 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 的加密、解密都能并行。这个例子说明:底层分组密码安全,还必须配上合适的工作模式。

7. CBC

CBC(Cipher Block Chaining,密码分组链接)在每条消息开头引入随机 IV,再把前一个密文块混入下一个明文块,使每块的输入与前文相关。

7.1 加密与解密

IV 是公开的初始化值,长度与一个分组相同。Alice、Bob 仍然共用同一个秘密密钥 。

定义:CBC 模式

给定分组密码 及其逆 ,对 :

  1. 每条消息独立采样 ,设 。
  2. 按顺序计算
  1. 输出完整密文 。

解密使用收到的 ,逐块计算

解密先用 撤销分组密码,得到 ,再异或一次 ,便恢复 。

7.2 安全性与效率

ECB 中直接重复的明文块会给出重复密文块。CBC 先异或 IV 或前一密文块,同一个明文块在不同上下文中不再必然得到相同输入;同一整条消息再次加密时,也会重抽 IV。

定理:随机 IV 的 CBC 满足 CPA 安全性

若 是安全 PRP,每条消息使用独立均匀的 IV,且总加密分组数 满足碰撞项 可忽略,则 CBC 满足 CPA 安全性。

直观上,先把底层置换换成随机置换,再分析链接过程中输入碰撞的概率;在没有相关碰撞时,新输入处的输出难以预测。完整证明还需控制各块之间的依赖,不能仅凭“加入了随机数”就断言安全。

IV 公开不影响解密与安全,但 CBC 需要在明文被选定时,下一条消息的 IV 尚不可预测。 每条消息由加密算法独立均匀采样即可满足要求。仅仅保证 IV 不重复,还不足以替代这一条件;也不能直接把上一条消息的最后一个密文块当作下一条消息的 IV。

加密必须先得到 才能计算 ,所以各块串行。解密时,所有密文块已经收到,各个 可以独立计算,因此能并行。

对比ECBCBC
密文长度,不计填充
初始化值无每条消息一块随机 IV
加密 / 解密并行 / 并行串行 / 并行
CPA 安全性不满足上述条件下满足

CBC 单独不提供完整性保护。例如把 IV 改为 ,而保持其他密文块不变,解出的第一块就变成 。隐藏消息内容与检测消息是否被篡改,需要分别考虑。