生日悖论与哈希安全性

一、生日悖论的基本结论

  • 经典结论:在一个 23 人的班级里,至少有两人同一天生日的概率大于 50%。
  • 悖论之处:365 天对应 365 种生日,看起来 23 人远小于 365,人们直觉上认为概率应该很小。但事实上,概率已经超过一半。

二、为什么会这样?直观理解

  1. 错误直觉 你可能会认为这是在问“某个人和我同生日”的概率,那大约是 1/365,非常低。

  2. 正确理解 实际上我们关心的是“任意两人”生日是否相同。

    • 23 人之间可以形成的配对数是

      \[C(23,2) = \frac{23 \times 22}{2} = 253\]
    • 每一对就是一个潜在的碰撞机会。配对数量随着人数平方级增长,远比直觉的线性增长快得多。

  3. 配对效应 随着人数增加,可能的配对数迅速上升:

人数 配对数 至少两人同生日的概率
10 45 12%
23 253 50.7%
30 435 70.6%
50 1225 97%
60 1770 99.4%

三、数学推导

为了算“至少两人相同”的概率,更容易的方法是算反面事件——“所有人生日都不同”的概率:

\[P(\text{全不同}) = \frac{365}{365} \times \frac{364}{365} \times \frac{363}{365} \times \dots \times \frac{343}{365}\]

23 个人时:

\[P(\text{全不同}) \approx 0.4927\]

所以:

\[P(\text{至少一对相同}) = 1 - 0.4927 \approx 0.5073 \quad (50.7\%)\]

四、推广到一般情况:为什么是约 √N

设有一个随机函数,它的输出空间大小为 $N$(比如一年 365 天,或者哈希函数输出空间 $2^n$)。

  • 取 $k$ 个输入值,配对数大约为 $k^2/2$。
  • 每对发生碰撞的概率是 $1/N$。
  • 所有配对无碰撞的概率近似为:

    \[P(\text{无碰撞}) \approx \left(1 - \frac{1}{N}\right)^{k^2/2} \approx e^{-k^2/(2N)}\]

要使碰撞概率达到 50%,即 $P(\text{无碰撞}) \approx 0.5$,解得:

\[k \approx \sqrt{2N \ln 2} \approx 1.177 \sqrt{N}\]

结论:碰撞出现的“临界样本量”与 $\sqrt{N}$ 成正比。


五、哈希函数中的应用:生日攻击

  1. 哈希函数的性质

    • 固定长度输出(如 128 位、256 位)。
    • 重要的安全性指标之一是“抗碰撞性”:难以找到两个不同输入,输出却相同。
  2. 两种攻击方式

    • 原像攻击:给定一个哈希值,找到一个输入使其对应。需要大约 $2^n$ 次尝试。
    • 生日攻击:寻找任意一对输入碰撞。只需要大约 $\sqrt{2^n} = 2^{n/2}$ 次尝试。
  3. 具体数字

哈希长度 n 输出空间 $2^n$ 原像攻击复杂度 生日攻击复杂度
64 位 $2^{64}$ $2^{64}$ $2^{32}$(约 43 亿)
128 位 $2^{128}$ $2^{128}$ $2^{64}$(约 1.8×10¹⁹)
256 位 $2^{256}$ $2^{256}$ $2^{128}$(约 3.4×10³⁸)

解读

  • MD5(128 位)理论复杂度是 $2^{128}$,但生日攻击只需 $2^{64}$,已被攻破。
  • SHA-256(256 位)即使遭遇生日攻击也需要 $2^{128}$,仍然安全。
  1. 设计启示

    • 哈希函数的抗碰撞强度 ≈ 输出长度的一半。
    • 想要 128 位安全强度,必须至少使用 256 位哈希。

六、总结

  • 生日悖论揭示了:在大样本空间中,重复出现的概率远比直觉要高。
  • 关键原因是:样本量 $k$ 与潜在配对数 $k^2/2$ 的平方关系。
  • 在密码学中,这直接影响哈希函数的设计。一个 $n$ 位哈希,其抗碰撞强度只有 $n/2$ 位。
  • 这也是为什么 MD5、SHA-1 等已过时,而 SHA-256、SHA-3 等才符合现代安全标准。