為什麼說 MD5 是不可逆的?


MD5不可逆的原因是其是一種散列函數,使用的是hash演算法,在計算過程中原文的部分信息是丟失了的,這點 @馮軼侃 同學的答案中有說到

不過有個地方值得指出的是,一個MD5理論上的確是可能對應無數多個原文的,因為MD5是有限多個的而原文可以是無數多個。比如主流使用的MD5將任意長度的「位元組串映射為一個128bit的大整數。也就是一共有2^128種可能,大概是3.4*10^38,這個數字是有限多個的,而但是世界上可以被用來加密的原文則會有無數的可能性。

不過需要注意的一點是,盡量這是一個理論上的有限對無限,不過問題是這個無限在現實生活中並不完全成立,因為一方面現實中原文的長度往往是有限的(以常用的密碼為例,一般人都在20位以內),另一方面目前想要發現兩段原文對應同一個MD5(專業的說這叫雜湊衝撞)值非常困難,因此某種意義上來說,在一定範圍內想構建MD5值與原文的一一對應關係是完全有可能的。所以對於MD5目前最有效的攻擊方式就是彩虹表_百度百科,具體詳情你可以通過鏈接了解。

這一段為了方便大家理解,改個老梗作為栗子吧,【世界上只有一個我,但是但是妞卻是非常非常多的,以一個有限的我對幾乎是無限的妞,所以可能能搞定非常多(100+)的妞,這個理論上的確是通的,可是實際情況下....】

至於怎麼樣算是在計算過程中原文的部分信息丟失,同時還能起到校驗驗證的作用,我舉個栗子

原文:

快點贊啊親

加密規則:

每個字取拼音聲調+筆畫數,最後的結果計算乘積,為了也使得我的結果始終保持在一個限定範圍內,取最後結果取其與2^14=16384的餘數(隨便取的,你們就當我有二進位強迫症吧)

如 快 是7畫,4聲,也就是「特徵值11」,以此類推 點9+3=12 贊16+4=20 啊10+4=14 親9+1=10

最後我發明的不可逆函數值就是

11*12*20*14*10=26400與16384的餘數,也就是10016

如果單單給10016這個數字和加密演算法,你是無論如何不可能推倒出原文是「快點贊啊親」的,不過如果給你「快點贊啊親」你卻很容易驗證答案是否正確。

嗯,既然我都已經把我想說的用原文告訴你們了!嗯,就是這樣


1+6=7,但是給你個7你能知道這是幾跟幾加得的嗎?

如果有人堅持認為MD5演算法是可逆的,請不妨設想一下將MD5演算法應用到文件壓縮方面,那豈不是又出現了一種超級壓縮技術了。。好幾個G大小的文件都能壓縮成一串MD5,反正"可以求逆"也就是解壓縮(如果應用於壓縮技術,演算法就是公開的了,也不用費勁去破解了)。可惜這個顯然是不可能的,哈哈哈哈


下面兩個二進位串

d131dd02c5e6eec4693d9a0698aff95c 2fcab58712467eab4004583eb8fb7f89
55ad340609f4b30283e488832571415a 085125e8f7cdc99fd91dbdf280373c5b
d8823e3156348f5bae6dacd436c919c6 dd53e2b487da03fd02396306d248cda0
e99f33420f577ee8ce54b67080a80d1e c69821bcb6a8839396f9652b6ff72a70

and

d131dd02c5e6eec4693d9a0698aff95c 2fcab50712467eab4004583eb8fb7f89
55ad340609f4b30283e4888325f1415a 085125e8f7cdc99fd91dbd7280373c5b
d8823e3156348f5bae6dacd436c919c6 dd53e23487da03fd02396306d248cda0
e99f33420f577ee8ce54b67080280d1e c69821bcb6a8839396f965ab6ff72a70

有完全相同的 MD5:79054025255fb1a26e4bc422aef54eb4


我以為是在MD5計算的過程中丟失了信息。一個MD5值可以對應多個原文。


如果可逆,那還要寬頻做甚,直接給你個蒼井空.MD5,然後慢慢復(腦)原(補)去。連求種的都沒了啊,手抄A片才是王道

回到正題,hash演算法一般都是拿加密演算法改的,本來就難破,更別說信息量大幅縮減的摘要了


這麼簡單的道理……

md5就是32個十六進位數,其信息量是2的128次方。任意一個長度超過16位元組的字元串,它的變數就已經超過這個值,所以肯定是不可逆的。


數據哈希之後就變成漿糊了,你能把漿糊變成饃饃嗎。


MD5 是一種摘要演算法,就算可以逆運算,也會得到好多版本,你也不知道哪個是可用的...


理論的東西拋開不談, @武傑 的答案說的很好了。打個形象的比喻:

每個人都有不同的指紋(or 虹膜信息 or 掌紋信息),看到這個人,可以得出他的指紋等信息,並且唯一對應,但你只看一個指紋,是不可能看到或讀到這個人的長相或身份等信息。警察根據指紋辦案的過程和網路上所為破解md5的過程是類似的。警察把一部分人的指紋信息(md5值)和身份信息(字元串原文)建個庫都做個對應,以後再遇到指紋(md5值),從庫里查這個人的信息(字元串原文)。


MD5相當於超損壓縮


首先,

不可逆(preimage, one-way): 指的是攻擊者在多項式時間不能從哈希值h(x)中獲得原值x.

防碰撞(collision-resistance): 指的是攻擊者在多項式時間不能找到兩個值x和x"具有相同的哈希值, i.e., h(x)=h(x").

設計不可逆的哈希函數比設計防碰撞的哈希函數容易,

同樣的, 找到哈希函數的碰撞比逆向哈希函數容易。

MD5的運算圖如下:

其中F是一個非線性函數, MD5的不可逆性就是由非線性函數保證的(攻擊者試圖逆向MD5時需要解這個非線性函數F, 但是解這個非線性函數F不能獲得唯一解)。 哈希函數的碰撞是客觀存在的, Xiaoyun Wang的貢獻是大大縮短了發現碰撞的時間。碰撞可以用來偽造原值, i.e., 用x"偽造x。但是跟哈希函數可逆性沒有必然關係。


說白了,就是把東西打碎了融化然後再挑出一部分給你看

能猜到嗎?

哦原來你用彩虹表啊~~~


MD5是不可逆的,但是MD5可以通過有效的碰撞和雜湊進行高效解密。參見王小雲。


王小雲的不是根據密文能得到原文的這種破解吧,他只是能偽造一個跟原文不一樣值使得這個值的MD5值跟原文的MD5值一樣吧,就是MD5碰撞,個人理解,不對勿怪……


我說10 你說2*5 他說8+2


出門左轉找香農


看了那個。我說10是2乘5,他說2+8這個答案表示反對。

hash是單向函數並不是這樣理解,應該理解是我說10,你根本不能推出一種表達式,這才是單向函數。

10=2*5也等於5+5 並不能說明md5的不可逆。

不可逆的原因是因為單向函數。

另外如果我們知道兩種式子都可以計算出10,硬要比做哈希函數的話,可以看作是強碰撞性,即使碰撞成功,我們也不能想到或者計算出這兩個特定的式子。

再一次證明不可逆。


MD5作為一種校驗手段而不是加密手段。在內容位元組長度小於MD5值的位元組長度,是可逆的,但存在重複的可能。由於概率較低,且基於加密前內容一般可識讀,所以你懂的為毛有那麼多md5解密的網站,但是又有人說md5絕對不可逆


理解很簡單,所有字元串集合A的Size是無窮的,所有MD5的集合B的Size是2^128(因為MD5是128位的),從一個無限集合A映射到有限集合B,那必然存在A的一個無窮子集A1,使得A1的所有元素(字元串)在B中映射到同一個元素,即存在無窮多個字元串,它們的MD5值相同。

假設你用一種方法,找到了一組映射,這組映射中包含所有B中的元素,那麼當隨意給定一個MD5值的時候,你可以通過這組映射找到是哪個字元串生成的,這個時候你是不是說MD5可以逆轉了呢?還不是,因為你不知道是不是還有其他字元串的MD5也是這個值。

上面的方法已經在實際生活中使用,就是MD5暴力破解庫(當然,這個庫遠遠沒有覆蓋所有的MD5,而是網路上各種常用密碼的MD5庫)


一串幾百上千位的字元就能代表一個視頻,要是可逆,我們都能回到用A、B盤的年代了。

MD5是摘要演算法,用小學語文課的說法是通俗文章大意。


推薦閱讀:

有哪些用 Python 語言講演算法和數據結構的書?
計算機演算法領域有哪些書籍像《演算法導論》一樣經典?
md5會有重複的可能嗎?
平滑的戰爭迷霧效果是如何實現的?
為什麼說平均情況下,插入排序比選擇排序快?

TAG:演算法 | 加密 | 密碼 | MD5 | 哈希函數 |