從小學(xué)到中學(xué)再到大學(xué),在班上,我就沒有遇到一個與我同一天出生的人。想來這類事情發(fā)生的概率應(yīng)該很低吧?接下來,我們從數(shù)學(xué)的角度來計算兩人同一天生日的概率。 問題:假設(shè)有n個人參加一個集會,且每個人的生日均是相互獨(dú)立的;那這n個人的生日全不同的概率p是多少?
解析:假設(shè)一年為365日,且這n個人的生日是均勻分布的。記第一個人的生日為r1,要使第二個人與第一個人生日不同,則第二個人只能選擇365天中除掉r1剩下的,同理,要使第三個人與前兩個人生日不同,他只能從剩下的363天中選擇……以此類推,n個人的生日全不同的概率p為:
P=(1-1/365)×(1-2/365)×……×[1-(n-1)/365]
借助計算機(jī)可以計算出,當(dāng)n=23時,p≈0.5,即在一個屋子里只需要23個人,找到兩個或兩個以上相同生日的人的概率就有50%。而當(dāng)n=70時,p≈0.99。這樣的結(jié)果與我們的直覺不符,所以稱之為生日悖論。
生日悖論在密碼學(xué)中有著廣泛的應(yīng)用。為了保證信息傳輸?shù)谋C苄?、?shù)據(jù)交換的完整性,我們采用數(shù)字簽名技術(shù)確保安全。形象地說:A要給B發(fā)送一段報文。A發(fā)送時用哈希函數(shù)從報文中生成報文摘要,再用密鑰對摘要進(jìn)行加密。加密后的摘要將作為報文的數(shù)字簽名和報文一起發(fā)送給B。B用同樣的方法對報文進(jìn)行加工,若得到的摘要與A發(fā)送的相同,則B得到的報文在A發(fā)送的期間沒有被改動過。
我們將生日悖論拓展開來:在該計算過程中,我們是將人(輸入)轉(zhuǎn)換成生日(輸出)。也就是說,我們將千萬種不同的人映射成365種人。在密碼學(xué)中,哈希算法就是將一個大的集合(輸入)映射到小的集合(哈希值),必然會造成多個輸入映射到一個哈希值上,這就是哈希碰撞。根據(jù)生日悖論,如果哈希值的位數(shù)過短,很容易可以找到一組(兩個)哈希值相同的輸入,這就是一種最常用的生日攻擊的應(yīng)用。
如果產(chǎn)生每個哈希值的可能性是相同的,根據(jù)生日悖論,n位的哈希值預(yù)計產(chǎn)生一次碰撞需要2^(n/2)次嘗試。如果找到哈希碰撞,那么兩個報文可以產(chǎn)生相同的報文摘要。這意味著,當(dāng)你在網(wǎng)絡(luò)上使用電子簽名簽署一份合同后,還可能存在另外一份具有相同簽名但內(nèi)容迥異的合同。在神不知鬼不覺的情況下,你們的信息就被掉包了。