密碼學系列之:生日攻擊

flydean發表於2021-06-09

密碼學系列之:生日攻擊

簡介

生日攻擊其實是一個概率論的問題,也就是說一個看起來很難發生的事情,事實上它發生的概率卻很大。這種主觀上和事實上的概率差距,讓隨機攻擊成功的機率變的更高,這樣的攻擊就叫做生日攻擊。

生日問題的由來

生日問題也叫做生日悖論,它是這樣這樣描述的。

假如隨機選擇n個人,那麼這個n個人中有兩個人的生日相同的概率是多少。如果要想概率是100%,那麼只需要選擇367個人就夠了。因為只有366個生日日期(包括2月29日)。

如果想要概率達到99.9% ,那麼只需要70個人就夠了。50%的概率只需要23個人。

對於現在的幼兒園小朋友來說,一個班上差不多有30人,那麼將會有大於50%的機率,班上有兩個人的生日是一樣的。

聽起來是不是很神奇?跟我們第一映像中的基數是不是要少很多。

我們看一張概率圖:

在實際應用中,可以應用生日問題中的概率模型,從而減少碰撞攻擊的複雜度,或者來評估一個hash函式中可能出現碰撞攻擊的機率。

怎麼計算呢?

假如P(A) 是生日相同的概率,那麼P(A) = 1 - P(A) ,其中P(A)是生日不同的概率。

一個人生日不同的概率是365/365,兩個人生日不同的概率就是365/365 * 364/365 ,依次類推。

我們可以得到23個人生日不同的概率大概就是 0.492703。

也就是說23個人中有兩個人生日相同的概率可以大於50%。

再看一張表來個更加直觀的描述:

生日問題的衍生

生日問題的取值範圍是在一年的365天之內,也就是說生日只可能有365種可能性。

我們將這個問題擴充套件一下到一般的情況,假設有一個函式f,它的輸出範圍是H,那麼我們的攻擊就是找到兩個不同的x,y,讓f(x)=f(y)。

這時候,我們可以稱x和y發生了碰撞。

根據概率論的公式,我們想要達到50%的機率,那麼需要嘗試的次數是:

如果以bits位來表示可能計算出的結果的話,我們可以參考下面的概率表:

生日攻擊的應用

生日攻擊一般應用在數字簽名中。一般來說為了對機密訊息進行簽名,因為加密的限制,如果訊息很大的情況下,不可能對所有的訊息進行簽名,通常會對訊息計算hash值,然後對這個hash值進行簽名。

比如有人想做一個欺詐性的合同,那麼會在原合同的基礎上進行修改,不斷的進行嘗試,從而找到一個修改後的合同,讓合同和之前合同的hash是一樣的,從而導致兩者的簽名也是一樣的。

怎麼抵禦這種攻擊呢?根據我們生日攻擊的公式,當然是將簽名方案使用的雜湊函式的輸出長度選擇得足夠大,以使生日攻擊在計算上變得不可行。

本文已收錄於 http://www.flydean.com/birthday-attack/

最通俗的解讀,最深刻的乾貨,最簡潔的教程,眾多你不知道的小技巧等你來發現!

歡迎關注我的公眾號:「程式那些事」,懂技術,更懂你!

相關文章