生日碰撞的证明
鉴于近几日学习密码学生日碰撞用得太多,故整理一下证明,加深一下理解。
问题:假设有$m$个人,一年有$N$天($m < N$),用$P(m,N)$表示这$m$个人中至少有两个人生日相同的概率。
证明:
$\begin{array}{l}
\overline {P(m,N)} = 1 - P(m,N) = \frac{{{{(N)}_m}}}{{{N^m}}} = \frac{{N(N - 1)...(N - m + 1)}}{{{N^m}}}\\
= \frac{N}{N}(1 - \frac{1}{N})(1 - \frac{2}{N})...(1 - \frac{{m - 1}}{N})\\
\ge 1 - \frac{{1 + 2 + 3 + ...(m - 1)}}{N} = 1 - \frac{{m(m - 1)}}{{2N}}
\end{array}$
所以有,$P(m,N) \le \frac{{m(m - 1)}}{{2N}}$
又因为:$\frac{N}{N}(1 - \frac{1}{N})(1 - \frac{2}{N})...(1 - \frac{{m - 1}}{N}) = \prod\limits_{i = 1}^{m - 1} {(1 - \frac{i}{N}) \le \prod\limits_{i = 1}^{m - 1} {{e^{ - \frac{i}{N}}}} } $
所以有,$P(m,N) \ge \prod\limits_{i = 1}^{m - 1} {{e^{ - \frac{i}{N}}}} = 1 - {e^{\frac{{ - m(m - 1)}}{{2N}}}}$
此时,我们令$\varepsilon $为最小的概率, 则有$\varepsilon = 1 - {e^{\frac{{ - m(m - 1)}}{{2N}}}}$
变换可得,$2N\ln (1 - \varepsilon ) = - m(m - 1)$
即$m \approx \sqrt {2N\ln \frac{1}{{1 - \varepsilon }}} $
当$\varepsilon = \frac{1}{2}$时,$m \approx 1.1774\sqrt N $
当$N = 365$,$m = 23$
也就是说,大约$\sqrt N$ 个球投入$N$个篮子里,就可保证$1$个篮子里出现两个球(发生碰撞)的概率为$\frac{1}{2}$
生日攻击:
1、简介:
生日攻击是利用概率论中的生日问题,找到冲突的$Hash$值,伪造报文,使身份验证算法失效。
2、场景说明:
$A$要对一个合同文件进行签名,然后把合同文件和签名一起发送给接收者。
签名的方法:计算文件的$Hash$值($m$位),然后使用$A$的私钥对这个$Hash$值进行加密。
接收者使用$A$的公钥进行解密,然后比较$Hash$值,这样他就能确认: 接收到的合同文件是$A$发送的,并且合同文件未被修改过。
攻击者$B$想要伪造一份假合同文件,然后发送给接收者,并使接收者仍然相信: 接收到的合同文件是$A$发送的,并且合同文件未被修改过。
3、攻击方法:
B先准备 ${2^{\frac{m}{2}}}$个有效合同文件(集合X),每个文件包含与原合同文件相同的意思。
B再准备 ${2^{\frac{m}{2}}}$个伪造合同文件(集合Y),每个文件也都是希望的伪造合同的意思。
然后比较集合X和集合Y,找到Hash值相同的两个文件,分别是有效合同和伪造合同。
B成功的概率会大于$0.5$,如果没有找到匹配的文件,就准备更多的有效文件和伪造文件,直到找到一对匹配的文件。
> 注:如果使用$64$位$Hash$值,那么只需要${2^{32}}$个不同文件,这无法防住现代计算机系统。
B把找到的有效合同文件提供A,A看了一下,没什么问题,就做了签名,然后发送给接收者。
在接收者收到消息之前,B截获了这个消息,然后使用伪造合同替换有效合同,再把伪造合同和原签名一起发送给接收者。
因为伪造合同与有效合同的$Hash$值相同,所以它们产生相同的签名。
这样,即使B不知道A的私钥,他也能成功!
4、防范方法:
- 使用安全的hash算法
- 加盐
- 改动文件
5、总结:
-生日攻击可以使碰撞攻击($x$和$y$都不确定)的复杂度降到$O({2^{\frac{n}{2}}})$的复杂度
-生日攻击仅与$hash$长度有关,所以为了抵御生日攻击,必须加大$hash$串的长度。