Lec 1加密哈希函数与单向性
这是当前课程已收录的第一篇。
Lec 1 加密哈希函数与单向性
关键词:随机预言机模型、单向性、抗碰撞性、生日攻击、性质间的蕴含关系
TL;DR
- 随机预言机把每个新输入映射为独立均匀输出,是分析哈希协议的理想模型;现实中的 SHA-2/SHA-3 只是具体、公开的替代函数。
- 单向性、抗碰撞与目标抗碰撞回答不同攻击问题,彼此不能随意替换;选择性质必须从上层协议真正需要阻止的攻击出发。
- 对 位输出,通用原像搜索约需 次查询,碰撞搜索受生日界限制约需 次,因此碰撞安全位数约为输出长度的一半。
0. 一句话动机
我们需要一个把任意长度输入压缩成定长输出、且"看起来随机"的确定性公开函数,使得:知道输出几乎无法反推输入、且几乎不可能人为制造两个输入撞到同一输出。这一原语支撑了口令存储、文件完整性、数字签名与承诺等几乎所有上层协议。
要求三点:确定性(deterministic)、公开(public,无密钥)、随机外观(random-looking)。
1. 随机预言机直觉
理想化的加密哈希被建模为一个随机预言机(random oracle, RO):
- 对一个新的输入 ,掷 次硬币得到 比特串作为 ,并把 记入一张表;
- 之后再次收到同一 ,先查表,命中则返回已记录的 (保证确定性)。
许多方案是在 RO 模型下被证明安全的。但现实中不存在真正的随机预言机,故实践中用**伪随机(pseudorandom)**的哈希函数(SHA-2/SHA-3 等)来近似。
🔎 直觉:RO 模型是一种"理想气体"假设——把哈希当成对每个新输入独立均匀采样的黑盒,便于证明上层协议安全;落地时再用具体函数替换,这一步替换在理论上有缺口(RO 不可实例化的反例存在),但工程上被广泛接受。
2. 期望性质
记号: 表示比特集合; 表示可忽略函数; 表示均匀随机取值。
定义
性质 1:单向性 / 抗原像 (One-Wayness / Preimage Resistance)
给定随机 ,找到任意 使 在计算上不可行。
定义
性质 2: 抗碰撞 (Collision Resistance, CR)
找到两个不同输入 使 在计算上不可行。
定义
属性 3:目标抗碰撞 / 抗第二原像(Target Collision Resistance, TCR / 2nd-preimage) ::: 给定一个目标输入 ,找到 使 在计算上不可行。
⚠️ 注意 CR 与 TCR 的差别:CR 中攻击者可自由选两个输入;TCR 中第一个输入 是给定的,攻击者只能找第二个去撞它。前者显然更强。
3. 通用攻击
设输出长度为 比特:
- 求碰撞 ≈ :来自生日攻击(birthday attack)——随机抽取约 个输入,由生日悖论高概率出现碰撞。
- 求逆(求原像)≈ :本质是穷举/暴力。
🔎 工程含义:这正是"抗碰撞所需输出长度要比抗原像翻倍"的原因。要抵御 级别的碰撞攻击,输出至少要 比特(故 SHA-256 的碰撞安全约 128 位)。
直觉上:一年有 365 天,你可能觉得需要接近 365 人,才有两个人生日相同。实际上:23 个人中,两人生日相同的概率已经超过 50%,70 个人中,这个概率超过 99%。 原因在于:我们不是寻找“某个人与我同生日”,而是寻找“任意两个人生日相同” 生日攻击是一种利用概率论中“生日悖论”的密码学攻击方法
4. 性质间的蕴含关系(Relations)
定理
关系总览
- 抗碰撞 目标抗碰撞(CR ⟹ TCR),反之不成立。
- 单向性 抗碰撞。
- 抗碰撞 单向性。 :::
直觉上 (1) 显然:能抵御"自由选两个输入撞车",自然也能抵御"给定一个再去撞"。下面给出 (2)(3) 的反例构造,这类"用反例分离两个安全概念"的技巧在本课会反复出现。
反例 A:抗碰撞 单向(CR 不蕴含 OW) 设 抗碰撞。定义
- 它仍抗碰撞:若 ,则尾部 ,根本不存在碰撞。
- 但它完全不单向:输出里直接附带了 ,看一眼就能读出原像。 :::
反例 B:单向 抗碰撞(OW 不蕴含 CR) 设 单向。定义
- 它仍单向:要反推需恢复 ,难度等同求逆 。
- 但碰撞平凡:固定任意 ,随便改 即得碰撞(输出只依赖 )。 :::
🔎 要点:单向性与抗碰撞是正交的两件事——前者关心"能否反推输入",后者关心"能否制造重复输出"。选择上层协议所需的性质时必须对号入座(见下节)。
5. 应用与所需性质(Applications)
| 应用 | 做法 | 所需性质 |
|---|---|---|
| 口令存储(Password Storage) | 存 而非明文口令 | 单向性 |
| 文件完整性(File Integrity) | 安全保存 ,重算比对 | 目标抗碰撞(TCR) |
| 数字签名(Digital Signatures) | 签名其哈希 | 抗碰撞(CR) |
| 承诺(Commitments) | 公布 ( 随机),开启时给出 | 单向 + 抗碰撞 +(保密所需的额外性质) |
要点解释:
- 口令存储:泄露哈希不应泄露口令 → 需单向性。(实践中还需加盐 + 慢哈希防字典/彩虹表。)
- 文件完整性:只要攻击者无法对给定文件伪造同哈希的篡改版 → TCR 足矣。
- 数字签名:签名作用在哈希上,攻击者若能找到 的碰撞即可发动**替换攻击(substitution attack)**用合法签名冒充另一消息 → 需 CR。若假设 公开,则不需要单向性。
- 承诺:随机数 提供隐藏性(hiding),抗碰撞提供绑定性(binding,不可反悔)。
6. 形式化定义(Formal Definitions)
定义 4(可忽略函数 · Negligible function) 可忽略,当且仅当:对任意多项式 ,存在 ,使得对所有 有
直觉:可忽略 = 比任何多项式倒数都更快趋于 0,即"实际上永不发生"。
定义
定义 5(单向函数 · One-Way Function, OWF) 是单向函数,若对任意概率多项式时间(PPT)敌手 ,存在可忽略函数 ,使得对每个安全参数 : 其中 ,,概率取自 与敌手的随机性。
🔎 关于这条定义的三处要点:
- 概率对 的随机选取取期望——防止敌手挑"易解"的输入(不能让敌手自己选 )。
- 敌手不需恢复原始 ;只要输出任意一个原像 (满足 )即算成功。
- 可忽略的成功概率是可达的:敌手随便猜一个 就有微小成功率;即便猜 次再验证,成功概率仍可忽略。故"可忽略"而非"绝对为零"是恰当门槛。
定义
定义 6(抗碰撞函数族 · Collision-Resistant family) 函数族 抗碰撞,若对每个 、每个 PPT 敌手 , 输出满足 的不同 的概率可忽略。概率空间取敌手内部随机性,以及 中可能的随机性( 本身可为确定性)。
⚠️ 为何要"函数族"而非单个函数:对任意固定确定性 ,碰撞 客观存在(鸽笼原理),于是"存在一个直接输出该碰撞的敌手"——只是我们不知道它长什么样。用密钥/索引参数化的函数族配合非一致敌手模型,才能让抗碰撞的形式化定义自洽。
7. 习题(Exercises)
例
习题 1(OWF) 设 单向,定义 。分析 的单向性。 提示: 像一次性掩码,输出对 是满射且均匀——给定 能否轻易找到某个 使 命中?这与"恢复 "是不是一回事?
例
习题 2(CR) 给定抗碰撞的 ,判断 是否抗碰撞。 提示:分情况——碰撞要么发生在内层 (撞出相同中间值),要么发生在外层 。逐层归约到 或 的抗碰撞性。
8. 小结(工程视角)
- 三个核心性质互相独立,按上层需求选择,别用错。
- 输出长度决定安全级别:碰撞安全 ≈ 位,原像安全 ≈ 位。
- 口令场景仅有单向性不够,必须加盐 + 慢哈希(bcrypt / scrypt / Argon2)。
- RO 模型是证明工具,落地用 SHA-2/SHA-3 替代,注意其间存在理论缺口。
我的理解
抗碰撞、单向性和伪随机性回答的是不同问题;把一种性质代替另一种使用,是密码协议常见的设计错误。