(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) 概率构成生日碰撞