1. 从多消息安全到 CPA 安全
Lecture 5 中,伪 OTP 能保护单条消息,但反复使用同一密钥会暴露明文之间的关系。本节先解释这种问题,再允许攻击者主动选择明文、观察加密结果,定义更强的 CPA 安全性。
1.1 确定性加密的限制
固定密钥后,确定性加密会让同一明文每次得到同一密文;正确性又要求不同明文不能得到同一密文,否则接收者无法确定该恢复哪条消息。因此,比较密文是否相同,就能判断明文是否相同。
定理:确定性加密不能满足多消息安全
若消息空间中存在两条不同的等长消息 ,则满足正确性的无状态、确定性私钥加密方案不满足多消息窃听安全性。无状态指加密不保存此前调用的历史。
证明:攻击者提交两组候选消息
挑战者选择一整组,用同一密钥加密并返回两条密文。第一组得到的密文必然相同,第二组得到的密文必然不同,攻击者因此以概率 1 判断挑战位。
这里不必恢复密钥,也不必读懂任何一条密文;仅仅知道“两条消息是否相同”,就已经泄露了明文之间的关系。
1.2 CPA 安全的定义
CPA 是 Chosen-Plaintext Attack,意为选择明文攻击。攻击者能自行选择一些明文,取得它们在秘密密钥下的加密结果,再利用这些结果分析目标密文。
可以把加密 oracle(预言机)理解为一台内部保存密钥的加密机器:攻击者能输入明文、得到密文,但不能读取密钥。算法虽然公开,没有密钥仍无法自行计算该密钥下的加密结果,因此这个接口给了攻击者额外能力。
与一次提交全部候选消息的多消息游戏相比,CPA 允许自适应查询:看完一次回复,再决定下一次询问什么。游戏中的挑战者负责保管密钥、执行加密,攻击者 则尝试识别目标密文加密了哪条消息。
定义:CPA 区分实验与安全性
对方案 ,定义实验 :
- 挑战者生成 。
- 挑战前,PPT 攻击者 可反复提交合法明文 ,得到 。
- 提交两条合法、等长的挑战消息 。挑战者独立选择均匀比特 ,返回挑战密文 。
- 挑战后, 仍可继续进行加密查询。
- 输出猜测 ;若 ,实验输出 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 猜对。
伪 OTP 还可以通过一次特殊查询暴露全部掩码:
攻击者取得 后,可用 恢复挑战明文。选择全零消息的意义是让已知明文在异或中消失,从而直接观察固定掩码。
也可以固定挑战位为 ,记 为整个实验中攻击者最终输出 1 的概率。等价的安全条件是
比较的是两个世界中同一个输出事件。若这一概率随挑战消息明显改变,就说明攻击者能利用交互结果分辨两个世界。
1.3 CPA 安全蕴含多消息安全
目标是说明:若一个方案能抵抗 CPA 攻击,就能保护同一密钥下的整组消息。障碍在于 CPA 只提供一个挑战密文,而多消息游戏返回一整组,必须把这两种输入衔接起来。
定理:安全性之间的关系
对标准私钥加密方案,
假设有多消息攻击者 能区分两组消息的加密。我们要构造 CPA 攻击者 ,利用 识别自己的单个挑战密文。
只负责处理一组密文并输出判断; 负责从 CPA 挑战者取得一个挑战密文,并通过加密 oracle 补齐其他位置,拼成 熟悉的输入。 始终不知道密钥。
策略是将第一组逐个替换成第二组。相邻两个实验只差一个位置,这个位置正好可由一次 CPA 挑战承载,其余位置事先固定,故无需知道挑战位也能生成。
证明思路:用三条消息看如何拼出整个输入
以下写的是各位置被加密的消息,攻击者实际收到的是对应密文,全部加密使用同一密钥。
游戏 被加密的消息组 比如要比较 与 ,只有第二个位置不同。 向加密 oracle 查询 和 ,得到第一、第三位置的密文;将 作为自己的挑战消息对,用收到的挑战密文填第二个位置。
挑战位为 0,拼出 ;为 1,拼出 。其他位置固定, 不必先猜出挑战位才能完成模拟。
若攻击者能区分两端,逐个替换产生的总差异就不可忽略。随机选择挑战放入的位置,可以保留总差异的平均份额,只损失一个多项式因子。
形式化证明:设消息数为 。定义 为前 个位置加密第二组、其余位置加密第一组的实验,并记
均匀选择 ,将第 对消息交给 CPA 挑战者;通过 oracle 加密第二组中位置小于 的消息、第一组中位置大于 的消息。组装完整向量后,输出 的结果。
挑战位为 0 时模拟 ,为 1 时模拟 。对随机位置求平均,差值中的中间项相互抵消:
若 区分整组的优势不可忽略,除以多项式 后仍不可忽略,于是 违反 CPA 安全性。消息组长度不固定时,可用两组相同的合法消息补齐到统一的多项式上界。多消息安全推出单消息安全则直接令消息数为 1。
2. 伪随机函数(PRF)
前面的问题来自重复使用固定掩码 。希望保留同一密钥,却能根据每次加密的新输入 生成不同位置的掩码,因此需要一个带密钥的函数 。
PRG 的安全性描述一段输出串;这里要描述攻击者多次选择输入、观察函数值后的整体行为。为了说明这种行为应该像什么,先定义理想的随机函数 ,再要求短密钥指定的 与它在计算上不可区分。 是安全分析的参照对象,实际构造使用的是可高效计算的 。
2.1 真随机函数
可以把函数想成一张“输入—输出”对照表。随机函数为每个不同输入独立选一个随机输出,再把整张表固定下来;以后遇到同一输入,必须查到同一结果。随机性来自选表的过程。
定义:随机函数
记
真随机函数是从 中均匀采样得到的 。等价地,为每个不同输入 独立、均匀地选定一个 位输出 ;相同输入再次查询时始终返回同一输出。
定义域有 个输入,每个输入有 种输出选择,因此
完整存储函数表需要 位。理想实验不必预先生成整个表,可用惰性采样(lazy sampling):首次查询某个输入时生成并保存一个独立均匀输出,再次查询则返回保存值。面对多项式次查询,只需保存多项式大小的表。
不同输入的输出可以相同;随机函数没有要求一一对应。它也不同于“每次调用都重新生成随机输出”,后者无法保证重复查询的一致性。
例题:重复查询随机函数会得到什么
设输入和输出都为 2 位串。某次采样得到的随机函数可以出现下面的查询记录:
查询输入 返回结果 前两个不同输入恰好得到相同输出是允许的。第三次输入再次为 ,必须返回第一次保存的 。若这次重新随机生成结果,就可能被重复查询轻易识别,不能作为 PRF 的理想参照。
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 安全性。
证明思路:为什么要经过四个游戏
目标是证明:Eve 即使能在挑战前后查询加密,仍然无法判断目标密文加密了 还是 。
为什么要引入真随机函数?我们希望说明“查询得到其他位置的掩码,不能帮助知道目标位置的掩码”。对真随机函数 ,这个直觉容易证明:不同输入处的值独立随机生成,因此其他位置的值不会帮助计算目标位置的值。只要挑战输入没有用于其他加密,挑战掩码就像 OTP 的均匀密钥一样隐藏消息;输入重复的情况再单独计算概率。
实际使用的 没有这种“真正独立”的保证,但已知它满足 PRF 安全性:高效查询者难以分辨 与随机函数 。因此先在随机函数世界里证明加密安全,再用 PRF 假设把安全性带回实际方案。
为了连接这两个世界,定义四个完整的 CPA 实验:
游戏 所有加密使用的函数 挑战加密的消息 实际的 真随机函数 真随机函数 实际的 我们要比较的是 和 ,也就是实际方案加密两条不同候选消息的情形。中间的 用于过渡,让每一步只改变一件事:
- :保持挑战消息 ,把整个实验使用的函数换成 。这一步的差别由 PRF 安全性控制。
- :保持随机函数 ,把挑战消息从 换成 。这一步依靠均匀掩码隐藏消息,并计入挑战输入重复的小概率。
- :保持挑战消息 ,将函数换回 。再次使用 PRF 安全性。
四个游戏都保留 Eve 的全部 CPA 查询能力;换函数时,普通加密查询和挑战加密一起替换。若每一对相邻游戏都只能产生可忽略的差别,三个差别相加仍可忽略,于是 Eve 也难以区分两端的真实游戏。
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 的来源。
构造 。 不知道 的密钥或函数表,但可以选择输入并得到 ;它按以下方式把这个能力转成 所需要的加密接口:
- 运行 ,等待其请求加密某条明文 。
- 独立采样 ,向自己的 oracle 查询 ,取得 ,再回复 。
- 收到挑战消息对 时,同样采样 、查询 ,用 生成挑战密文。挑战后的查询仍按第 2 步处理。
- 输出 最终输出的比特。
能完成模拟,是因为拼接密文与异或消息不需要密钥;唯一需要秘密函数值的地方,都通过自己的 oracle 取得。
若 ,模拟的正是 ;若 ,模拟的正是 。 不需要知道密钥,只需访问 oracle,且运行时间为多项式。因此由 PRF 定义,
把模拟中的挑战消息改成 ,同理得到另一个 PPT 区分器 ,从而
其中 均可忽略。
4.3 中间:随机函数、OTP 与碰撞概率
都使用随机函数,唯一差别是挑战消息。这里要回答:攻击者已经见过其他加密结果,为什么挑战的掩码还能像 OTP 一样隐藏消息?
随机函数在不同输入处的值独立均匀。如果挑战输入 没有用于其他加密,那么此前观察到的函数值不会说明 是多少;之后只要其他加密也没有命中它,掩码就不会被额外暴露。
设攻击者挑战前后的加密查询总数至多为 ,第 次查询使用随机数 。定义坏事件
为什么把这个碰撞称为坏事件?攻击者知道自己查询的明文 ;若查询密文 恰好满足 ,就能算出 ,进而解开挑战密文。需要控制的是掩码被这样复用的概率。
每次加密的随机数都由挑战者独立均匀采样,单次查询命中挑战随机数的概率为 。对挑战前后至多 次查询使用并合界,得到
虽然 公开,CPA 攻击者只能选择明文,不能指定加密内部使用的 。因此它无法直接要求加密接口在 处生成掩码。
为了精确比较两个游戏,可以把它们的随机选择配对,使攻击者在碰撞前看到完全相同的回复。挑战前共用已生成的函数值;挑战输入尚未使用时,让两个游戏的挑战密文第二分量都取同一个独立均匀串 ,在各自的随机函数表中分别设置
这两项在各自游戏中都是合法的均匀函数值,因为固定消息与均匀串异或后仍然均匀。它们分别与 异或,挑战的第二分量就都成为 ,攻击者看不出加密了哪条消息。
其余输入的函数值保持相同,所以只要后续查询没有命中 ,所有回复仍然一致。若 已在挑战前使用过,则直接计入坏事件。这种比较覆盖了完整的自适应交互,而不仅是单独一条挑战密文。
这使两个执行在坏事件发生前无法区分,故即使查询是自适应的,也有
这里不要求其他查询之间完全没有碰撞;只需控制它们是否命中挑战的 。
4.4 合并三个差值
两端已经说明“换函数”只能造成可忽略差别,中间已经说明“换消息”的差别至多来自碰撞。把三个差值相加,就得到真实 CPA 两个挑战世界之间的差别:
PRF 安全性保证 可忽略; 为多项式,因此 也可忽略。由 Lecture 4 的闭包性质,右侧可忽略,方案满足 CPA 安全性。