1. 程式人生 > >關於MD5破解這件事

關於MD5破解這件事

前 幾天在論壇上看到有人在討論MD5的破解,很多人對MD5的理解讓我大跌眼鏡:有人認為MD5是一種加密演算法,有人認為由於無法從MD5 hash回覆出明文,因此對其破解的研究毫無意義,甚至因此置疑王小云教授的成果毫無意義,真是讓人遺憾。 因此今天決定說說MD5的破解,算是義務普及。有關MD5的描述請參考Wikipedia/MD5,這裡就不多廢話了。
一般來說,對一個HASH演算法的攻擊可分三個級別:
1,Preimage attack(原像攻擊?):給定h,找到明文M,使得h=hash(M),如果一個HASH演算法     被人找出preimage attack,那這種演算法也就完蛋了;
2,Second preimage attack(次原像攻擊?):給定明文M1,找到另一明文M2(不等於M1),     使得hash(M1)=hash(M2);
3,collision attack(碰撞攻擊):找到M1和M2,使得hash(M1)=hash(M2)。 關於MD5,王小云教授的成果是實現了在可計算時間內實現找到collision。目前的進展是,基於王曉雲教授論文的改進演算法,有人可以做到 用筆記本在幾小時之內找到collision。這意味著什麼?有很多人認為collision毫無意義,因為在實際應用中M1和M2無法任意指定。其實這 是隻知其一不知其二。和其他流行的HASH演算法一樣,MD5有一個眾所周知的弱點,叫做length extension,可用數學語言描述如下:
    若,MD5(M1) = MD5(M2)
    則,MD5(M1||M') = MD5(M2||M')
    其中||代表串連線。 目前的collision搜尋演算法可以任意指定初始hash狀態,這意味著可任意構造字首。另外length extension意味著可以任意構造字尾。因此基於任意collision,我們可以構造出兩個MD5 hash相同的串,使得:
    MD5(preamble+R1+suffix) = MD5(preamble+R2+suffix),
    其中,MD5(preamble+R1) = MD5(preamble+R2) 如何利用collision attack?一個例子是利用隨機collision構造兩個不同功能的應用程式,並保持他們的 MD5相等。我們知道Windows上的應用程式用的是PE格式。PE程式一般由以下幾部分構成:
    PE header,PE檔案頭
    .text section,程式碼段
    .data section,資料段
    other sections (.reloc, .rdata, .tls, etc) 構造過程如下:
1,編寫應用程式,在其中實現你想要的兩種不同功能。 2,手工調整PE檔案,使得其layout如下:
    PE header
    Reserved block1
    .text section
    Reserved block2
    .data section
    Other sections 3,以PE header為preamble,搜尋隨機collision,使得:
    X1 = PE header || R1;
    X2 = PE header || R2;
    MD5(X1) = MD5(X2) 4,將R1內容填入reserved block2,然後將R1和R2內容分別添入reserved block1處,得到兩個應用程式檔案,其layout如下:
  檔案1                 檔案2
  PE header            PE header
  R1                      R2
  .text section        .text section
  R1                      R1
  .data section       .data section
  other sections      other sections 5,在應用程式的開始程式碼處,拿Reserved block2處的內容和Reserved block1處的內容比較,如果相等後面的流程實現功能一,如果不相等實現功能二。這樣就實現了任意功能的兩個程式,並保持他們的MD5相同。 6,這其中,
    Preamble = PE header
    MD5(PE header || R1) = MD5(PE header || R2)
    Common suffix = .text section || R1 || .data section || other sections 可以設想,如果功能一是很吸引人的某種正常用途,功能二實現某種木馬,會帶來什麼後果。
目前正在上演的圍繞著名遊戲Diablo的外掛攻防大戰中,就有可能用到這種攻擊,因為Diablo中最著名的外掛Maphack就以MD5為數字簽名,檢查伺服器端傳送過來的外掛檢測程式碼特徵。 另外,
http://www.cits.rub.de/MD5Collisions/
上也給出了一個示例,裡面演示瞭如何利用碰撞騙得老闆的數字簽名,並拿簽名用在別的用途。其做法簡單描述如下:
1,選擇一種高階文件語言(比如postscript);
2,基於postscript的要求構造preamble,在此基礎上尋找MD5隨機collision:
    X1 = preamble; put(R1);
    X2 = preamble; put(R2);
    MD5(X1) = MD5(X2)
3,給X1和X2新增相同字尾S,顯然:
    MD5(X1||S) = MD5(X2||S)
4,準備兩份文字T1和T2,T1是正常文字(用來騙取簽名),T2是其他用途文字。
5,最後形成兩份postscript文件:
    Y1 = preamble; put(R1); put(R1); if(=) then T1 else T2
    Y2 = preamble; put(R2); put(R2); if(=) then T1 else T2
這樣,開啟Y1時,看到的是文字T1;開啟Y2時,看到的是文字T2。而Y1和Y2的MD5 HASH是相同的。 總之,就目前而言,“MD5 is definitely not practically collision-free”。雖然只是collision attack,但在攻擊者能控制並任意構造明文時,這種攻擊就是實際可行的。王小云教授成果的意義在於找到了一種實際可行的collision搜尋演算法, 當然她的工作也是建立在其他人的基礎上的。