MD5和MD5破解的一些事

發表於2013-04-22

本文由@isnowfy 的投稿於伯樂線上,也歡迎其他朋友投稿。提示:投稿時記得留下微博賬號哦。

看到網上一些對於MD5的介紹,還有對於當初王小云所做的破解有很多的誤解,或者說不理解,然後覺得對於這些事情只要說明白,還是比較好理解的說。

首先MD5其實就是一種hash,或者叫雜湊函式,有的地方叫雜湊函式,都是一個東西,其實它就是一種對映,而平常最常見的就是說MD5是不可逆的,為什麼不可逆呢?有人就說就是像有些函式沒有反函式那樣了,其實還是有點抽象,考慮MD5是多對一的對映,也就是說很多不同的經過MD5變換之後可能會是相同的,那麼既然多對一,自然是不可逆啦,你怎麼會知道他到底是由哪個變換過來的呢。在密碼學的應用裡,說是單向函式,或者說單向變換,一種是這種多對一不可逆,還有一種是說逆工程會非常困難,舉個例子吧,假設f(x)=x^6-x-1,然後你知道f(1)=-1,在知道x=1和f的情況下計算f(1)是很簡單的,而知道f(x)=-1和f去求x卻是很困難的,這裡就不展開說了,大家有個大體的認識就可以了。

MD5

剛才說過了由於MD5是多對一的,所以肯定會出現變換後的值是一樣的情況,這種情況叫做衝突,或者叫碰撞。為了保證安全性,定義了兩種,一種叫無弱碰撞,一種叫無強碰撞。

無弱碰撞是

無強碰撞是

很明顯滿足無強碰撞比滿足無弱碰撞更難,真的嗎?好吧,就不說明顯了,為什麼說無強碰撞更難呢,換句話說為什麼找到強碰撞更簡單呢,恩,這就涉及到生日悖論了,或者叫生日攻擊了。

來想想以前的概率吧,假設一年365天,那麼,至少有多少人使得有兩人是同樣生日的概率會超過1/2呢,直覺上應該是365/2個人吧,其實答案是23,少的誇張是吧,不然不會叫做悖論了啊,如何計算呢,其實我們是在求一個最小的n,使得1-(1-1/365)*(1-2/365)*…(1-(n-1)*365)>=1/2,隨便寫個程式驗證下就知道是23了,什麼你不知道這個式子怎麼得來的,考慮第二個人不要和第一個人生日衝突的概率是(1-1/365)然後第三個人不和前兩個人生日相同的概率是(1-2/365)後面就知道了吧。然後這個人數其實是O(sqrt(365))。那麼回到前面的問題,假設對映空間,就是說最後能夠得到的值的個數是m,那麼弱碰撞的複雜度是O(m),而強碰撞呢是O(sqrt(m)),所以說找到強碰撞更簡單,也就是說滿足無強碰撞更難!

王小云的貢獻呢就是找到了比生日攻擊複雜度低得多演算法來快速找到一對強碰撞,弱碰撞嗎依舊是不行的。這裡有她的論文,有興趣的可以看一下。那麼也就是說通過密文找到明文依舊是不可能的,並且弱碰撞依舊是很難的。

不過後來又有外國的nb人受到了王小云的啟發,得到了一種很快的演算法能夠在已知字首x1,x2的情況下構造一對字尾y1,y2使得M(x1y1)=M(x2y2),不過有兩點需要注意,一個是他其實還是一種尋找強碰撞,另一個就是他的複雜度比王小云的直接構造高的多,然後這裡有論文,然後利用這個搞了個預測2008年美國大選結果的東西,為啥叫預測呢,因為可以這樣

因為我說我知道大選結果,但是必須事後公佈,為了保證我沒有說謊,我先給出一段MD5的值,之後給出我的結果,只要結果和MD5相同不就是我預測成功了嗎

這個東西是基於我很難構造兩個東西使得他們的MD5相同的基礎上的,不過有了上面的演算法,這個事情的複雜度大大降低,使得變為了可能。

那麼這些破解對於我們有什麼影響呢,首先需要認識到MD5有什麼用,現在很多網站都用MD5來驗證檔案的完整性,但是你從非官方的地方下載了檔案發現MD5相同,那麼你依然不能掉以輕心,因為可能是通過上述演算法而在程式里加入了某段病毒程式碼,但是MD5還是相同的而已,所以下檔案還是從官方地址下吧,還一個就是經常在數字簽名裡使用了,至於不知道數字簽名的這裡先不說了,然後這個可以偽造數字簽名啥的,不過傳說現在貌似沒誰用MD5來弄數字簽名了,也不必太過擔心了,基本就是這樣子了。

 

本文由@isnowfy 的投稿於伯樂線上,也歡迎其他朋友投稿。提示:投稿時記得留下微博賬號哦。

【如需轉載,請標註並保留原文連結、譯文連結和譯者/作者等資訊,謝謝合作!】