哈希函数与生日攻击

(1.) 哈希函数概念

哈希函数 (H) 公开,将任意长度消息 (M) 映射成固定长度的值 (H(M)),这说明的是哈希函数的压缩性

除此之外,哈希函数还需要满足安全性

  • 单向性 给定 (H(M)),计算 (M) 计算不可行
  • 抗弱碰撞 给定 (M),找到 (M') 使得 (H(M') = H(M)) 计算不可行
  • 抗强碰撞 找到两个消息 (M, M') 满足 (H(M) = H(M')) 计算不可行

(2.) 哈希函数的应用

(2.1) 数字签名

哈希函数用于压缩消息得到摘要 ((digest))

发送方用自己的私钥加密消息和摘要,一同发给接收方

接收方拿到消息后,用发送方的公钥解密消息和摘要,并用相同的 (hash) 函数(例如 (MD5))对消息进行压缩,检查两个摘要是否一致,如果一致,证明未被篡改过

(2.2) 口令认证

数据库存储的是用户密码被散列后的值,用户登录时输入密码,数据库检查输入密码的散列值存储的散列值是否一致

(3.) 攻击哈希函数——生日攻击

考虑一个哈希函数 (f: D ightarrow left{0, 1 ight}^{n}),哈希空间为 (2^n),只需要 (O(2^{frac{n}{2}})) 级别的哈希值便能构成碰撞

(3.1) 问题背景

给定 (n) 个人,一年有 (m) 天,为了使得至少有两人生日相同的概率大于等于 (epsilon),计算 (n) 的大小

(3.2) 推导

(P(n, m)) 表示至少两个人生日相同的概率,则

[egin{aligned} P(n, m) & = 1 - frac{A_{n}^{m}}{m^n}\ & = 1 - frac{1cdot 2cdots (m - n + 1)}{m^n}\ & = 1 - (1 - frac{1}{m})(1 - frac{2}{m})cdots (1 - frac{n - 1}{m}) end{aligned} ]

[1 - P(n, m) = (1 - frac{1}{m})(1 - frac{2}{m})cdots (1 - frac{n - 1}{m}) ]

根据 (1 + xleq e^x),有 (1 - frac{i}{m}leq e^{-frac{i}{m}}),所以

[1 - P(n, m)leq prod_{i = 1}^{n - 1}e^{-frac{i}{m}} = e^{-frac{n(n - 1)}{2m}} ]

[1 - e^{-frac{n(n - 1)}{2m}}leq P(n, m) ]

若要使 (P(n, m)geq epsilon),只需要

[1 - e^{-frac{n(n - 1)}{2m}}geq epsilon ]

对上式变换,取对数得到

[ln(1 - epsilon)geq -frac{ncdot (n - 1)}{2m} ]

[n^2 - n + 2mcdot ln(1 - epsilon)geq 0 ]

由于 (0 < epsilon < 1),所以一元二次不等式的判别式 (Delta = 1 - 8mcdot ln(1 - epsilon) > 0),所以方程组有解,具体为

[ngeq frac{1 + sqrt{1 - 8mcdot ln(1 - epsilon)}}{2}approx sqrt{2mcdot lnfrac{1}{1 - epsilon}} ]

具体的,若考虑 (epsilon = 50\%, m = 365),那么只需要 (ngeq 1.177sqrt{365}approx 23),便可以以 (0.5) 概率构成生日碰撞

原文地址:https://www.cnblogs.com/ChenyangXu/p/14169170.html