CSDN一篇報道說中國數學家王小雲等在Crypto 2004上提出一種能成功攻破MD5的演算法,GIGIX和王兄都在BLOG裡引用了相關的報道。
MD5是一種摘要演算法,所以理論上是不可能從簽名取得原文(見下面說明)。認為要從MD5的結果中取得原文才算破解,本身就是對摘要演算法的誤解。它通常應用於數位簽章中,用於標識原文的原始性--即在簽名後未作任何的修改。如果可以用不同的原文可以產生相同的簽名,這也就意味著簽名可能失效,就已經可以證明這種摘要演算法的不安全。
RL提供的王小雲的報告我看了一下,因為我不是做這方面的,所以對MD5演算法本身的實現,以及文中所引用的之前別人的理論都並不瞭解,所以不是很明白。在這份報告中,介紹MD5破解的部分只有一頁半,並未細說具體的演算法,但在末尾附了兩對1024位原文的碰撞例子,較之96年別人提出的512位碰撞有了很大的進步,並且計算量據說在一個小時左右。
這些都是進步,如果把這說成是吹噓就未免有點妄自菲薄了。
王小雲的發現證明了有方法可以產生碰撞,但正如GIGIX那邊一位匿名兄所說,這隻是非特定碰撞,而要偽造簽名則必須能產生特定碰撞。所以說MD5並未被完全攻破,但也已經是一個重大的突破了。
因為我手頭沒有像《應用密碼學》這樣的介紹具體密碼演算法的書,只有一本盧開澄的《電腦密碼學》,主要是從數學的角度介紹了幾類密碼演算法的原理及其適用領域。不過因為密碼學是基於較為高深的數學理論,比如數論、群論、有限域等,但俺的數學不行,所以具體理論也說不出個一二三四來,只能泛泛地說個五六七八。^O^
首先要說的是為什麼需要使用密碼?因為我們通常的通訊環境是不安全的。
那什麼是不安全的通訊環境呢?不安全至少表現在兩個方面:一是通訊的內容可能被竊取;二是通訊的內容可能被篡改。
通常的密碼使用就是為這解決這兩方面的問題。
而如果有方法使某種密碼的作用失效,就可以說這種密碼被破解了。
當然不安全還有一些其它的方面,那些問題通常除了要求輸入密碼以外,還需要用一些特別的協議,很少碰到,這裡就不提了。
常用的密碼有很多種類,其中最常用的是這三種:
1、對稱密碼
2、非對稱密碼
3、摘要
對稱密碼的特點是:加密與解密用相同的密鑰,甚至可能用相同的演算法。比如從最簡單的異或,到常用的DES、BLOWFISH、IDEA等。它們通常的用途是這樣的:
發送方將源文(M)用密鑰(K)加密:E=ENC(M,K)
然後將E通過不安全網路傳給接收方,接收方用相同的密鑰(K)解密:M=DEC(E,K)
只要演算法足夠好,並且保管好密鑰(K),就可以保證這種通訊是安全的,因為別人即使知道了密文(E)和演算法ENC/DEC,也無法知道明文(M)。
對於這種密碼來說,如果有方法可以從密文(E)和演算法ENC/DEC中導到密鑰(K)或明文(M),則意味這種密碼被破解。比如簡單異或演算法就可以用統計分析法簡單地破解掉。但即使是現在被認為不夠安全的DES演算法(已經有近三十年歷史了),也需要有大量的明文/密文對(2的數十次方對),並需要大量的計算時間才能求得其密鑰(K)。
非對稱密碼是因為這樣的原因:因為在對稱密碼中,通訊雙方需要約定一個共同的密鑰(K),如果這個約定過程也不安全,就可能出現密鑰的泄露,而對於對稱演算法來說,密鑰一旦泄露,之後的通訊過程也就不攻自破了。
通常的非對稱密碼就是所謂的公開金鑰密碼演算法,比如現在最常用的RSA(由R. L. Rivest和A. Shamir等人基於大數的因數分解極為困難的原理而建立),或是最近更為時髦的“橢圓曲線”,因為我的數學水平太差,具體演算法也說不清楚,只知道大致是這樣的:
顧名思義,它所用的演算法特點在於加密與解密用的密鑰是不一樣的。做法大致如下:
發送方自己產生一對密鑰:私密金鑰(KA)和公開金鑰(KPA)
接收方也產生一對密鑰:(KB)和(KPB)
其中(KPA)和(KPB)是公開的
發送方用演算法:E=ENC(ENC(M,KA),KPB)
進行兩次加密,接收方用演算法:M=DEC(DEC(E,KB),KPA)
進行兩次解密,即可得到原文。
而其中雙方都不需要知道對方的私密金鑰,這就避免了約定密鑰導致的不安全。
非對稱密碼的演算法本身又決定了用私密金鑰加密的內容必須用公開金鑰才能解,反之亦然,並且演算法還保證僅知道公開金鑰和密文無法匯出私密金鑰,由此決定了通訊的安全。
當然,如果有方法可以從公開金鑰匯出私密金鑰來,則這種演算法即告被破解。但至少目前RSA還是安全的,因為從現在的數學理論上可以證明RSA的演算法是一類NPC(NP完備)類問題,只要密鑰足夠長(RSA要求至少是10的100次方以上,實際使用時更要大得多),以現在最先進的電腦來算,其時間成本也是不可能達到的。
摘要演算法則與上面兩種完全不同,前面兩種密碼是用於防止資訊被竊取,而摘要演算法的目標是用於證明原文的完整性,也就是說用於防止資訊被篡改。通常也被稱為:HASH演算法、雜湊演算法、簽名演算法。它的特點是:從不定長的原文中產生一個固定長度(如MD5是128位)的結果,稱為“簽名”(S),這個簽名必須對原文非常敏感,即原文即使是有少量的變化,也會導致這個簽名面目全非。比如傳統的CRC或是現在要說的MD5、SHA等都是這類演算法。
摘要演算法的用途通常是這樣的:
比如使用者密碼驗證:如Linux或一些論壇用的方法,使用者佈建密碼時,服務端只記錄這個密碼的MD5,而不記錄密碼本身,以後驗證使用者身份時,只需要將使用者輸入的密碼再次做一下MD5後,與記錄的MD5作一個比較即可驗證其密碼的合法性。
比如發布檔案的完整性驗證:比如發布一個程式,為了防止別人在你的程式裡插入病毒或木馬,你可以在發布這個程式的同時,公開這個程式檔案的MD5碼,這樣別人只需要在任何地方下載這個程式後做一次MD5,然後跟公開的這個MD5作一個比較就知道這個程式是否被第三方修改過。
一個安全的摘要演算法在設計時必須滿足兩個要求:其一是尋找兩個輸入得到相同的輸出值在計算上是不可行的,這就是我們通常所說的抗碰撞的;其二是找一個輸出,能得到給定的輸入在計算上是不可行的,即不可從結果推匯出它的初始狀態。
反之,如果某種摘要演算法不能同時滿足上面兩個條件,則它就是不安全的。其實主要還是前一個條件,因為從理論上很容易證明後面一個條件基本上都是可以滿足的:
摘要演算法對任意長的原文產生定長的簽名,按照香農的資訊理論,當原文的長度超過一定的程度的時候,簽名中就無法記錄原文中的所有資訊,這意味著存在著資訊的丟失,所以我說理論上不可能從簽名中恢複原文。
為什麼說理論上呢?就是說當這種摘要演算法被完全攻破時,也就是說可以從簽名恢複出任意原文,注意:是任意原文,因為所有的摘要演算法的特點就是存在著一個無窮大的碰撞原文的集合。而真正的原文只是其中一份。對應這個無窮大的集合來說,這就是一個無窮小,便是我曾經說過的:
可能性為零,不表示不可能。
解釋得具體一點是這樣:假設原文含有資訊量(I),而簽名的長度有限(如MD5的128位),則它的資訊量只有(i),因為通常 i < I (除非原文非常短),所以可以這麼說:I=i+i'。因為I沒有限制,而i有限制,則 i' 也是一個沒有限制的量。當進行摘要演算法後,i' 資訊就丟失了。
反過來,如果現在這種摘要演算法被攻破了,可以從 i 反推回去,但因為 i' 資訊已經丟失,意味著 i + I' (其中 I' 為任意資訊)都可能是 I (碰撞)。但 I' 是一個無窮集合,並且 i' 屬於 I'。這說明:理論上可以從 I' 中找到 i' 從而恢複出原文 I ,但是可能性為零(1/∞=0)。
但要做到前面一點就不容易了。因為絕對無碰撞的演算法不可能是一個摘要演算法,而只能是一個無損壓縮演算法。它必須包含原文的所有資訊,也就意味著它一但被攻破,可以唯一地恢複出原文。並且它的結果肯定是不定長的,因為它需要包含原文的所有資訊,當然會根據原文的長度而變。僅這兩點就決定了,它不可能是一個好的簽名演算法。
最主要的一點是:摘要演算法的用途決定了,它只要能找到碰撞就足以讓它失效,並不需要找到原文。
以前面的兩個例子來說:
比如Linux的使用者安全機制,只要得到使用者密碼檔案(其中記錄了密碼的MD5),然後隨便產生一個碰撞的原文(不一定要跟原密碼相同),就可以用這個密碼登入了。
但後面的程式發布的例子就要難得多,因為它必須能產生特定的碰撞,即在程式中插入病毒或木馬後再填充一些資料使之產生與原來相同的MD5。
不過我昨天仔細想了一下,以MD5為例,要產生特定的碰撞應該還是不太可能的,因為MD5的128位資訊量已經有點大了,如果要產生特定碰撞,需要填充的資料可能非常之大,導致偽造的原文比真實的原文大得多,可能達到若干個數量級的差別,這樣的偽造就已經失去意義了。
王小雲的成果已經完全使Linux用的那種基於MD5的身分識別驗證技術失效了,雖然從技術上說它被完全攻破,還為時尚早,但從法律角度上說,已經“動搖了差不多整個數位簽章界的根基”(令狐語,全文如下)。
我所謂的“動搖根基”云云,是從法律失效的角度說的,而不是從純技術角度說的。
舉個昨天我舉的例子來說明一下。比如昨天我說的,假如有兩個人的指紋完全相同,而且我可以很快的找出這兩個人,那麼,在法律角度來說,我們就不能把指紋作為一個有效證據。雖然這兩個同指紋的人並沒有互相冒充的意思。
同樣的,現在刻意去偽造檔案併產生相同的MD5碼還做不到,但是,現在可以在短時間內找到兩份相同的檔案,他們的MD5碼相同,那麼,MD5作為數位簽章的“法律意義”便失去了。而數位簽章是用來幹嗎的?就是讓一個電子文檔具有法律意義的。所以,我說,這個發現是動搖了數位簽章的根基。
補充:
其實我們更應該從積極的角度來看待這個事件。
大家都學過馬哲,矛盾從來都是在對立中發展的,並且將呈現出螺旋上升的態勢。比如Shamir等人攻破了MH的背包公開金鑰,但他也和別人一起提出了更好的RSA公開金鑰。比如DES開始不安全以後,更多更強的加密手段也一一湧現。
所以說,王小雲等人發現了當前所用的HASH演算法存在的問題,同時也必將協助未來的新的HASH演算法設計者考慮到這方面的問題,使得新的HASH演算法具有更好的安全性。
所以說,MD5被破解也未必就是壞事。
還是老子說得對:福兮禍所依,禍兮福所伏
BTW:畢竟不是專業幹這個的,可能有些地方不對,還請大家斧正一下。^O^