鑒於近幾日學習密碼學生日碰撞用得太多,故整理一下證明,加深一下理解。
問題:假設有$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$串的長度。