1. 从多消息安全到 CPA 安全

Lecture 5 中,伪 OTP 能保护单条消息,但反复使用同一密钥会暴露明文之间的关系。本节先解释这种问题,再允许攻击者主动选择明文、观察加密结果,定义更强的 CPA 安全性。

1.1 确定性加密的限制

固定密钥后,确定性加密会让同一明文每次得到同一密文;正确性又要求不同明文不能得到同一密文,否则接收者无法确定该恢复哪条消息。因此,比较密文是否相同,就能判断明文是否相同。

定理:确定性加密不能满足多消息安全

若消息空间中存在两条不同的等长消息 ,则满足正确性的无状态、确定性私钥加密方案不满足多消息窃听安全性。无状态指加密不保存此前调用的历史。

证明:攻击者提交两组候选消息

挑战者选择一整组,用同一密钥加密并返回两条密文。第一组得到的密文必然相同,第二组得到的密文必然不同,攻击者因此以概率 1 判断挑战位。

这里不必恢复密钥,也不必读懂任何一条密文;仅仅知道“两条消息是否相同”,就已经泄露了明文之间的关系。

1.2 CPA 安全的定义

CPA 是 Chosen-Plaintext Attack,意为选择明文攻击。攻击者能自行选择一些明文,取得它们在秘密密钥下的加密结果,再利用这些结果分析目标密文。

可以把加密 oracle(预言机)理解为一台内部保存密钥的加密机器:攻击者能输入明文、得到密文,但不能读取密钥。算法虽然公开,没有密钥仍无法自行计算该密钥下的加密结果,因此这个接口给了攻击者额外能力。

与一次提交全部候选消息的多消息游戏相比,CPA 允许自适应查询:看完一次回复,再决定下一次询问什么。游戏中的挑战者负责保管密钥、执行加密,攻击者 则尝试识别目标密文加密了哪条消息。

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

对方案 ,定义实验 :

  1. 挑战者生成 。
  2. 挑战前,PPT 攻击者 可反复提交合法明文 ,得到 。
  3. 提交两条合法、等长的挑战消息 。挑战者独立选择均匀比特 ,返回挑战密文 。
  4. 挑战后, 仍可继续进行加密查询。
  5. 输出猜测 ;若 ,实验输出 1,否则输出 0。

全过程使用同一密钥,每次加密使用独立的新随机性。攻击者的总运行时间与查询次数均为多项式有界。

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

则称 满足 CPA 安全性(IND-CPA)。概率包括密钥、挑战位、每次加密和攻击者的随机性。

与窃听实验相比,多出的是挑战前后两段加密查询:

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),每次使用新的随机性
    end
    A->>C: 等长挑战消息 m₀, m₁
    Note over C: 抽均匀比特 b
    C-->>A: c* ← Enc_k(m_b)
    loop 挑战后,继续查询
        A->>C: 明文 m,可以是 m₀ 或 m₁
        C-->>A: Enc_k(m)
    end
    A->>C: 猜测 b′

要求 等长,是因为这里通常允许密文泄露消息长度,要保护的是长度之外的内容。随机猜测本来就能以 的概率获胜,可忽略的是超过随机猜测的额外优势。

一个容易疑惑的地方是:攻击者可以在挑战前后查询 或 的加密结果。这是模型有意允许的能力。我们希望即使攻击者已经见过候选消息的其他加密,也无法认出目标密文的内容;现实中也不能保证某条敏感消息从未出现在其他加密操作中。

查询 得到的是一次新的加密结果,并没有直接告诉攻击者“挑战密文是否加密了 ”。对于随机化加密,两次调用会使用独立随机性,即使明文相同,密文也可能不同;因此不能直接靠比较两条密文是否相同来识别挑战消息。

随机化使这种比较攻击不再必然成功,但是否 CPA 安全仍需证明。攻击者只有加密接口,没有解密接口,不能把挑战密文交给机器要求恢复明文。

也可以固定挑战位为 ,记 为整个实验中攻击者最终输出 1 的概率。等价的安全条件是

比较的是两个世界中同一个输出事件。若这一概率随挑战消息明显改变,就说明攻击者能利用交互结果分辨两个世界。

1.3 CPA 安全蕴含多消息安全

目标是说明:若一个方案能抵抗 CPA 攻击,就能保护同一密钥下的整组消息。障碍在于 CPA 只提供一个挑战密文,而多消息游戏返回一整组,必须把这两种输入衔接起来。

定理:安全性之间的关系

对标准私钥加密方案,

假设有多消息攻击者 能区分两组消息的加密。我们要构造 CPA 攻击者 ,利用 识别自己的单个挑战密文。

只负责处理一组密文并输出判断; 负责从 CPA 挑战者取得一个挑战密文,并通过加密 oracle 补齐其他位置,拼成 熟悉的输入。 始终不知道密钥。

策略是将第一组逐个替换成第二组。相邻两个实验只差一个位置,这个位置正好可由一次 CPA 挑战承载,其余位置事先固定,故无需知道挑战位也能生成。

形式化证明:设消息数为 。定义 为前 个位置加密第二组、其余位置加密第一组的实验,并记

均匀选择 ,将第 对消息交给 CPA 挑战者;通过 oracle 加密第二组中位置小于 的消息、第一组中位置大于 的消息。组装完整向量后,输出 的结果。

挑战位为 0 时模拟 ,为 1 时模拟 。对随机位置求平均,差值中的中间项相互抵消:

若 区分整组的优势不可忽略,除以多项式 后仍不可忽略,于是 违反 CPA 安全性。消息组长度不固定时,可用两组相同的合法消息补齐到统一的多项式上界。多消息安全推出单消息安全则直接令消息数为 1。

2. 伪随机函数(PRF)

前面的问题来自重复使用固定掩码 。希望保留同一密钥,却能根据每次加密的新输入 生成不同位置的掩码,因此需要一个带密钥的函数 。

PRG 的安全性描述一段输出串;这里要描述攻击者多次选择输入、观察函数值后的整体行为。为了说明这种行为应该像什么,先定义理想的随机函数 ,再要求短密钥指定的 与它在计算上不可区分。 是安全分析的参照对象,实际构造使用的是可高效计算的 。

2.1 真随机函数

可以把函数想成一张“输入—输出”对照表。随机函数为每个不同输入独立选一个随机输出,再把整张表固定下来;以后遇到同一输入,必须查到同一结果。随机性来自选表的过程。

定义:随机函数

记

真随机函数是从 中均匀采样得到的 。等价地,为每个不同输入 独立、均匀地选定一个 位输出 ;相同输入再次查询时始终返回同一输出。

定义域有 个输入,每个输入有 种输出选择,因此

完整存储函数表需要 位。理想实验不必预先生成整个表,可用惰性采样(lazy sampling):首次查询某个输入时生成并保存一个独立均匀输出,再次查询则返回保存值。面对多项式次查询,只需保存多项式大小的表。

不同输入的输出可以相同;随机函数没有要求一一对应。它也不同于“每次调用都重新生成随机输出”,后者无法保证重复查询的一致性。

2.2 带密钥函数与 oracle 访问

随机函数的完整表需要指数大小的存储。希望改用一个短密钥指定函数:通信双方只保存密钥和公开算法,就能计算任意输入的函数值,而不必保存整张表。

定义:带密钥函数(Keyed Function)

带密钥函数 是确定性多项式时间可计算的函数。

为密钥, 为输入,记 。固定 后, 是一个从 位串到 位串的固定函数。

位密钥最多指定 个不同函数;不同密钥可能恰好对应同一函数,因此不必正好有 个。

攻击者知道算法 ,但不知道 。记 表示其拥有对函数 的 oracle 访问:可以自适应提交输入 、取得 ,但不能读取密钥或整个函数表。 只是“当前黑盒函数”的通用名字,在不同实验里可以是 或 。

oracle 给出的是查询能力,不会直接交出函数的秘密描述。攻击者可以观察自己选定位置的函数值;安全要求是在多项式次这样的观察后,仍难以判断黑盒属于哪种来源。

固定 后, 是确定性的;这与理想随机函数重复查询时也返回固定结果一致。伪随机性衡量的是整个查询记录是否容易区分,不要求同一输入每次得到不同输出。

2.3 PRF 的正式定义

现在比较两个完整实验。真实世界先随机选密钥 ,让攻击者查询 ;理想世界先随机选整张函数表 ,让攻击者查询 。两边都允许攻击者观察回复、继续选择输入,最后作出判断。

定义:伪随机函数(Pseudorandom Function)

确定性、多项式时间的带密钥函数 是 PRF,如果对任意 PPT oracle 区分器 ,存在可忽略函数 ,使对所有 ,

每个实验中的密钥或随机函数只采样一次,在全部查询中保持不变。概率还包括区分器自身的随机性。

sequenceDiagram
    participant D as PPT 区分器 D
    participant O as 函数 oracle O
    Note over O: 真实世界:O = F_k,k ← Uₙ<br/>理想世界:O = f,f ← Funcₙ<br/>整个实验只采样一次
    loop 自适应、多项式次
        D->>O: 输入 x
        O-->>D: O(x),重复输入返回同一值
    end
    Note over D: 输出一个比特,判断 O 的来源

定义中的 是试图区分函数来源的程序, 和 表示运行同一个程序,只替换它能够查询的黑盒。比较两边“最终输出 1”的概率,衡量查询记录是否暴露了黑盒的来源。

等价的来源猜测游戏是:挑战者选均匀比特 ,若 则提供 oracle,若 则提供随机函数 oracle;攻击者多次查询后猜 ,获胜概率应至多为 。

对象攻击者观察的内容随机性的来源
PRG一段比种子长的输出串均匀种子
PRF对自选输入的多次函数求值固定的随机密钥;理想世界则随机选择整个函数

短密钥函数族与全部随机函数的分布并不相同。无界攻击者可以枚举密钥、比较完整函数表来区分;但随机函数也可能恰好属于密钥族,因此并非每次都能确定来源。PRF 只承诺抵抗高效区分器。

3. 用 PRF 构造 CPA 安全加密

目标是让同一个密钥可用于多次加密。伪 OTP 总使用固定的 ,现在每次随机选一个输入 ,改用 作掩码。

接收者也必须生成同一个掩码,所以密文要同时传输两部分:公开的 告诉接收者到函数的哪个位置求值, 承载加密后的消息。秘密密钥 决定这个位置的函数值,始终不发送给攻击者。

构造:基于 PRF 的定长加密

设 是 PRF,消息空间为 。

  • :采样 。
  • :独立采样 ,输出 。
  • :输出 ;密文格式或长度非法时返回 。

密文为 位。接收者读出 ,用自己的密钥计算 ,再与第二分量异或,正确性为

各个量的来历与是否公开:

量谁产生、怎样产生何时产生、用几次攻击者是否知道
算法 公开标准固定知道
密钥 均匀采样事先一次,所有消息共用不知道
输入 加密算法均匀采样每次加密重新采样知道,随密文发送
掩码 收发双方用 各自计算每次加密一个不知道,从不发送
发送方计算每次加密一个知道,随密文发送
sequenceDiagram
    participant Alice as 发送方(持有 k)
    participant Eve as 攻击者(知道 F,不知道 k)
    participant Bob as 接收方(持有 k)
    Note over Alice,Bob: 事先:k ← Uₙ,此后所有消息共用
    Note over Alice: 1. 采样 r ← Uₙ<br/>2. 计算 F_k(r)<br/>3. s = F_k(r) ⊕ m
    Alice->>Bob: c = ⟨r, s⟩
    Note over Eve: 看到 r 与 s,但没有 k,算不出 F_k(r)
    Note over Bob: 1. 读出 r<br/>2. 计算 F_k(r)<br/>3. m = F_k(r) ⊕ s
    Note over Alice: 下一条消息:重新采样 r′,掩码变为 F_k(r′)

PRF 本身仍是确定性的,随机性由加密算法选择 的过程引入。同一明文重新加密时,通常会得到不同的 ,因此完整密文也不同,不能再像确定性方案那样直接比较密文来识别明文。

即使攻击者查询了 ,取得 ,它学到的也是 。要解开挑战密文 ,却需要 。当 时,这是函数的另一个位置;PRF 安全性用于阻止攻击者借已观察的函数值,有效预测尚未观察位置的掩码。

每次重新采样 并不保证它绝不重复;若查询命中挑战的 ,上述区分就失效,所以安全证明还必须控制碰撞概率。

4. 用混合论证证明 CPA 安全

已知前提是 满足 PRF 安全性,目标是证明第 3 节的加密方案满足 CPA 安全性。难点是攻击者既观察挑战密文,还能在挑战前后反复查询加密;证明必须覆盖整个交互过程。

假想的加密攻击者 试图区分挑战消息。归约程序 则拥有一个来源未知的函数 oracle,要利用 判断这个函数是 还是真随机函数。两者处理的接口不同: 询问明文, 询问函数输入; 必须把函数回复加工成正确的密文,才能让 参与证明。

定理:PRF 加密方案的 CPA 安全性

若 是 PRF,则第 3 节的定长加密方案满足 IND-CPA 安全性。

4.1 四个混合游戏

混合游戏(hybrid)是用于比较的中间实验。每个游戏都完整运行一次 CPA 交互,攻击者仍可在挑战前后自适应查询;我们只逐步改变内部使用的函数,以及挑战加密的是 还是 。

混合所有加密查询使用的函数挑战密文
,
,
,
,

对应真实 CPA 游戏中挑战位固定为 0, 对应固定为 1。 是中间的理想实验,用来把 PRF 假设与 OTP 的性质接起来。

每个游戏固定一个函数,查询和挑战均使用它;每次加密独立采样随机数。特别地,将 PRF 换成随机函数时, 的普通加密查询也必须使用同一个 ,这样每个游戏的全部回复才来自一致的函数。

记 。由两世界安全定义,只需证明 可忽略;三角不等式给出

三个差值分别由下面两节控制,每一步只改变一处:

flowchart TB
    H0["H₀:所有加密用 F_k,挑战加密 m₀"]
    H1["H₁:所有加密用 f,挑战加密 m₀"]
    H2["H₂:所有加密用 f,挑战加密 m₁"]
    H3["H₃:所有加密用 F_k,挑战加密 m₁"]
    H0 -->|"只换函数:PRF 安全性,差值 ≤ ν₀"| H1
    H1 -->|"只换挑战消息:随机掩码 + 碰撞,差值 ≤ q/2ⁿ"| H2
    H2 -->|"只换函数:PRF 安全性,差值 ≤ ν₁"| H3

4.2 两端:利用 PRF 安全性替换函数

要证明 难以区分,利用它们唯一的差别:整个实验使用的是 还是 。若 能认出这一差别,就能帮助另一个程序判断函数 oracle 的来源。

构造 。 不知道 的密钥或函数表,但可以选择输入并得到 ;它按以下方式把这个能力转成 所需要的加密接口:

  1. 运行 ,等待其请求加密某条明文 。
  2. 独立采样 ,向自己的 oracle 查询 ,取得 ,再回复 。
  3. 收到挑战消息对 时,同样采样 、查询 ,用 生成挑战密文。挑战后的查询仍按第 2 步处理。
  4. 输出 最终输出的比特。

能完成模拟,是因为拼接密文与异或消息不需要密钥;唯一需要秘密函数值的地方,都通过自己的 oracle 取得。

若 ,模拟的正是 ;若 ,模拟的正是 。 不需要知道密钥,只需访问 oracle,且运行时间为多项式。因此由 PRF 定义,

把模拟中的挑战消息改成 ,同理得到另一个 PPT 区分器 ,从而

其中 均可忽略。

4.3 中间:随机函数、OTP 与碰撞概率

都使用随机函数,唯一差别是挑战消息。这里要回答:攻击者已经见过其他加密结果,为什么挑战的掩码还能像 OTP 一样隐藏消息?

随机函数在不同输入处的值独立均匀。如果挑战输入 没有用于其他加密,那么此前观察到的函数值不会说明 是多少;之后只要其他加密也没有命中它,掩码就不会被额外暴露。

设攻击者挑战前后的加密查询总数至多为 ,第 次查询使用随机数 。定义坏事件

为什么把这个碰撞称为坏事件?攻击者知道自己查询的明文 ;若查询密文 恰好满足 ,就能算出 ,进而解开挑战密文。需要控制的是掩码被这样复用的概率。

每次加密的随机数都由挑战者独立均匀采样,单次查询命中挑战随机数的概率为 。对挑战前后至多 次查询使用并合界,得到

虽然 公开,CPA 攻击者只能选择明文,不能指定加密内部使用的 。因此它无法直接要求加密接口在 处生成掩码。

为了精确比较两个游戏,可以把它们的随机选择配对,使攻击者在碰撞前看到完全相同的回复。挑战前共用已生成的函数值;挑战输入尚未使用时,让两个游戏的挑战密文第二分量都取同一个独立均匀串 ,在各自的随机函数表中分别设置

这两项在各自游戏中都是合法的均匀函数值,因为固定消息与均匀串异或后仍然均匀。它们分别与 异或,挑战的第二分量就都成为 ,攻击者看不出加密了哪条消息。

其余输入的函数值保持相同,所以只要后续查询没有命中 ,所有回复仍然一致。若 已在挑战前使用过,则直接计入坏事件。这种比较覆盖了完整的自适应交互,而不仅是单独一条挑战密文。

这使两个执行在坏事件发生前无法区分,故即使查询是自适应的,也有

这里不要求其他查询之间完全没有碰撞;只需控制它们是否命中挑战的 。

4.4 合并三个差值

两端已经说明“换函数”只能造成可忽略差别,中间已经说明“换消息”的差别至多来自碰撞。把三个差值相加,就得到真实 CPA 两个挑战世界之间的差别:

PRF 安全性保证 可忽略; 为多项式,因此 也可忽略。由 Lecture 4 的闭包性质,右侧可忽略,方案满足 CPA 安全性。