📑 本页目录(点开跳转)
08 · 安全定义
⏱ 24 分钟 | ⭐ 全教程的思维转折点
🎯 一句话
前面七章你一直在看"这个方案被这样打破了"。 这一章问一个更根本的问题:「安全」到底是什么意思? 答案会让你意识到,你之前对"安全"的理解一直是错的。
🤔 一、先看看"直觉的安全"错在哪
结果对照
结果对照
结果对照
🔑 问题的本质:这些定义都在说"攻击者不能做到某件具体的事"。 但攻击者想要的可能是任何关于明文的信息 —— 我们没法穷举所有他可能想知道的事。
💡 二、思路的翻转:不问"他学到了什么",问"他能不能分辨"
对照
⭐ 关键的翻转:
与其说"攻击者学不到任何信息"(无法穷举"任何"),
不如说:
"攻击者【分辨不出】密文对应的是 m₀ 还是 m₁"
↑ 他自己挑的两条消息!
为什么这个说法覆盖了"任何信息":
因果链
🔑 这就是"不可区分性(Indistinguishability)"的威力: 用一个可操作的、可证伪的条件,覆盖了"任何信息"这个不可穷举的要求。
💡 你在第 4 章 PRG 已经见过同一个模式了 —— 这不是巧合, 整个现代密码学都建立在"不可区分"这个模板上。
🎮 三、IND-CPA:把定义写成一个游戏
⭐ 方案是 IND-CPA 安全的,当且仅当对所有高效的 A:
Pr[b' = b] ≤ 1/2 + negl
💡 人话翻译:
就算攻击者能随便让你加密他挑的任何东西, 再让你在他挑的两条消息里随机加密一条, 他也猜不出你加密的是哪条 —— 优势不超过瞎猜。
⭐ 这个定义立刻推出三个重要结论
① 确定性加密永远不安全
流程图
🔑 这一条解释了前面所有的"为什么": - 为什么 ECB 不安全 → 它是确定性的 - 为什么 CBC 要 IV → 提供随机化 - 为什么 CTR 要 nonce → 提供随机化 - 为什么教科书 RSA 不安全 → 它是确定性的(第 14 章)⭐
一个定义,串起了四个看似无关的设计规则。
② 密文必然比明文长
对照
随机化 ⟹ 同一条明文有多个可能的密文
⟹ 密文空间必须大于明文空间
⟹ 密文更长(IV/nonce 就是那个额外开销)
③ 明文长度无法隐藏
关键信息
🔐 四、IND-CCA:更强的要求
对照
IND-CPA 的攻击者:只能【加密】他挑的东西
IND-CCA 的攻击者:还能【解密】他挑的密文(挑战密文 c* 除外)⭐
为什么需要这么强的要求:
关键信息
- 现实中攻击者常常能间接获得"解密结果":
- 服务器解密后返回"格式错误" padding oracle(第 7 章)
- 解密成功和失败的响应时间不同
- 解密后的内容被显示在页面上
- 解密失败会写日志,日志能被观察
- ⭐ 只满足 IND-CPA 的方案在这些场景下会被打穿
🔑 现代标准:能用 IND-CCA 就别用 IND-CPA。 而达到 IND-CCA 的实用方法就是 —— 认证加密(AEAD)。
AEAD 的思路很直接: 密文带一个认证标签,验证不通过就【直接拒绝,根本不解密】 → 攻击者的"解密预言机"变成了一个只会说"无效"的东西 → 拿不到任何信息 ⭐🔗 第 11 章讲怎么正确地构造它。
📉 五、"可忽略"到底有多小
对照
negl(n):比【任何】多项式的倒数都小
直觉:1/2ⁿ、1/2^(n/2) 是可忽略的
1/n¹⁰⁰⁰ 【不是】—— 它只是"很小"
为什么标准要定得这么严:
因果链
💡 实际参数:128-bit 安全意味着攻击者需要约 2¹²⁸ 次操作。 作为对照:宇宙自大爆炸以来的秒数约 2⁵⁹,全球算力一年约 2⁹⁰ 次运算。
🧭 六、这一章该带走的方法论
操作步骤
- ⭐ 判断"一个方案安全吗"的正确流程:
- 它声称达到什么安全目标?(机密性/完整性/ · )
- 在什么攻击模型下?(CPA / CCA)
- 归约到什么假设?("破它 ⟹ 分解大整数")
- 假设本身可信吗?(研究了多少年、有没有量子威胁)
- ❌ 错误的流程:"我想不出怎么破它" —— 这什么都不算
🔑 可证明安全(Provable Security)的真实含义: 它不证明"这个方案安全",它证明"这个方案的安全性归约到某个数学难题"。 如果那个难题被解决了(比如量子计算机解决了因子分解),方案照样完蛋。
"可证明安全"是把信任从"这个方案"转移到"这个数学问题" —— 而后者被全世界研究了几十年,比前者可信得多。
🔗 和站内其他章的关系
| 相关的地方 | 和这一章的关系 |
|---|---|
| 第 7 章 ECB 不安全 | 确定性 ⟹ 违反 IND-CPA ⭐ |
| 第 7 章 CBC 要随机 IV | 提供随机化,达到 IND-CPA |
| 第 5 章 nonce 铁律 | nonce 重复 ⟹ 退化成确定性 |
| 第 7 章 padding oracle | CCA 攻击的真实形态 |
| 第 4 章 PRG 的不可区分性 | 同一个定义模板 ⭐ |
| 第 14 章 教科书 RSA 不安全 | 确定性,同一个原因 |
| 数学原理第 9 章 PAC | 有意思的对照:那里也是"承认做不到完美,改要求高概率近似" |
✅ 检查点
- "攻击者不能恢复明文"这个定义错在哪?给一个反例。
- 不可区分性的思路翻转是什么?它为什么能覆盖"任何信息"?
- 描述 IND-CPA 游戏的五个步骤。
- 为什么确定性加密永远不满足 IND-CPA?这解释了哪四个设计规则?
- 为什么 IND-CPA 的定义要求 m₀ 和 m₁ 等长?有什么真实后果?
- IND-CCA 比 IND-CPA 强在哪?为什么现实中需要它?
- AEAD 是怎么达到 IND-CCA 的?
- 为什么 1/n¹⁰⁰⁰ 不算"可忽略"?
- "可证明安全"到底证明了什么?
👀 答案
- 错在只禁止了一件具体的事。反例:一个方案泄露明文的前一半但后一半完美隐藏,它满足"不能恢复完整明文"却显然不安全。
- 从"攻击者学不到任何信息"(不可穷举)翻转成 "攻击者分辨不出密文对应 m₀ 还是 m₁"(m₀、m₁ 由他自己挑)。能覆盖是因为:若他能算出关于明文的任何性质 P,他就挑一个满足 P、一个不满足 P 的消息,立刻就能分辨。反过来分辨不出就说明什么都算不出来。
- ①随意查询加密预言机 ②提交等长的 m₀, m₁ ③挑战者抛硬币选 b,返回 Enc(m_b) ④继续查询加密 ⑤输出猜测 b'。要求 Pr[b'=b] ≤ 1/2 + negl。
- 因为攻击者可以先问"加密 m₀"拿到 c₀,再提交 (m₀,m₁) 拿到 c,比较是否相等即 100% 判对*。解释了:ECB 不安全、CBC 要 IV、CTR 要 nonce、教科书 RSA 不安全——全是同一个原因。
- 因为加密无法隐藏消息长度,这是承认而非疏忽。后果:语音加密的包长度泄露说话内容、HTTPS 下页面大小暴露你访问了哪个页面、加密搜索的结果数量泄露查询。要隐藏必须额外填充。
- IND-CCA 的攻击者还能解密他挑的密文(挑战密文除外)。需要它是因为现实中攻击者常能间接获得解密结果:padding oracle、响应时间差异、解密内容被显示、失败会写日志。
- 密文带认证标签,验证不通过就直接拒绝、根本不解密——攻击者的解密预言机变成一个只会说"无效"的东西,拿不到任何信息。
- 因为攻击者重复 n¹⁰⁰⁰ 次就能成功,而n¹⁰⁰⁰ 仍是多项式次,对攻击者可行。可忽略要求比任何多项式的倒数都小。
- 它不证明"方案安全",它证明"方案的安全性归约到某个数学难题"。是把信任从"这个方案"转移到"这个被研究几十年的数学问题"上。难题被解决(如量子破解因子分解),方案照样完蛋。
🛑 可以停在这里
⚡ 走神救援
先记住这几件事
- 安全定义先写明攻击者能做什么,再规定它不应获得什么优势。
- 不可区分游戏把模糊的保密直觉变成可讨论的目标。
- 安全证明依赖假设与模型,不能替代随机数、密钥和实现检查。
下一节 👉 09-哈希函数.md