生日碰撞的证明

鉴于近几日学习密码学生日碰撞用得太多,故整理一下证明,加深一下理解。

问题:假设有$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$串的长度。

posted @ 2017-10-18 16:31  Elpsywk  阅读(1769)  评论(0编辑  收藏  举报