原文:
本文由@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是多對一的,所以肯定會出現變換後的值是一樣的情況,這種情況叫做衝突,或者叫碰撞。為了保證安全性,定義了兩種,一種叫無弱碰撞,一種叫無強碰撞。
無弱碰撞是
1
2
3
4
已知函式m和一段資料h
找到乙個h'
使得m(h)=m(h')
是難的
無強碰撞是
1
2
3
4
已知m
找到一對h和h'
使得m(h)=m(h')
是難的
很明顯滿足無強碰撞比滿足無弱碰撞更難,真的嗎?好吧,就不說明顯了,為什麼說無強碰撞更難呢,換句話說為什麼找到強碰撞更簡單呢,恩,這就涉及到生日悖論了,或者叫生日攻擊了。
來想想以前的概率吧,假設一年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),不過有兩點需要注意,乙個是他其實還是一種尋找強碰撞,另乙個就是他的複雜度比王小雲的直接構造高的多,然後這裡有**,然後利用這個搞了個**2023年美國**結果的東西,為啥叫**呢,因為可以這樣
因為我說我知道**結果,但是必須事後公布,為了保證我沒有說謊,我先給出一段md5的值,之後給出我的結果,只要結果和md5相同不就是我**成功了嗎這個東西是基於我很難構造兩個東西使得他們的md5相同的基礎上的,不過有了上面的演算法,這個事情的複雜度大大降低,使得變為了可能。
本文由@isnowfy
shadow檔案的MD5密碼破解
root 1 abcde luligrjwcdszq2reox7bg 15933 0 99999 7 hint 密碼長度不超過6 root 1 abcde luligrjwcdszq2reox7bg 15933 0 99999 7 這是在linux下的shadow檔案中,用來存放使用者的賬戶和密碼,...
MD5 概念和用途
md5概念 md5是message digest algorithm 5 資訊 摘要演算法 的縮寫,被廣泛用於加密和解密技術上,它可以說是檔案的 數字指紋 任何乙個檔案,無論是可執行程式 影象檔案 臨時檔案或者其他任何型別的檔案,也不管它體積多大,都有且只有乙個獨一無二的md5資訊值,並且如果這個檔...
MD5 概念和用途
md5概念 md5是message digest algorithm 5 資訊 摘要演算法 的縮寫,被廣泛用於加密和解密技術上,它可以說是檔案的 數字指紋 任何乙個檔案,無論是可執行程式 影象檔案 臨時檔案或者其他任何型別的檔案,也不管它體積多大,都有且只有乙個獨一無二的md5資訊值,並且如果這個檔...