MD5筆記

  MD5是個hash算法,具體的內容我也不想多說,其實我也沒有仔細看到底4輪64次變換是怎麼一回事。可以參考一下百度百科的md5詞條。(http://baike.baidu.com/view/7636.htm?fr=ala0_1),我感覺比中文版的wiki寫得詳細點。另外子清行的《MD5算法實現注意點》這篇文章也很不錯,說實話要學習這個算法真的是要自己寫一遍爲好。真要仔細研究的話,就看rfc1321.txt,這個最權威了。

  當然,我的角度略有不同,我只是要用md5,調試或者靜態分析的時候能看出來md5,所以只要知道個大概就可以了。

  首先,md5算法,有個4個32位的Chaining Variable,一般叫做ABCD,這4個值分別是:

    0x67452301;
    0xefcdab89;
    0x98badcfe;
    0x10325476;

  這幾個數放到內存中其實很整齊,就是01234567 89ABCDEF FEDCBA98 76543210,看到這4個數,基本上就能確定有md5。

  然後md5的輸入是64個bytes一組的,尾部要補8bytes的bits數,數據和8bytes之間補80 00 * n。每一次變換,ABCD都被更新,最後的輸出是16bytes,就是ABCD的值。

  下面說下怎麼用,md5現成的代碼,首先考慮rfc1321.txt後面附帶的代碼,只要依次複製出來就可以,但是必須要用C的編譯器來編譯,用C++編譯通不過,語法比較老。除了這個,就是md5-opt,作者是J. Touch(http://www.isi.edu/atomic2/security/md5-opts.html),性能有了優化,我是在Google Desktop的license頁中看到這個東西的,其實性能問題對於小程序來說關係不大。

  最後說下openssl,這個庫裏面有md5。用code:blocks的朋友建議裝一下該庫的devpak,雖然devpak很久沒有更新了,openssl-devpak的最高版本是0.98e,而openssl目前已經到了1.00a,不過能用就行了。只要#include <openssl/md5.h>,另外還要連上libcrypto.a,注意不是libssl。這種大陸的算法,很多庫裏面都有,這個就不一一說了。

  下面說下用法,一般來說就這麼三個函數:

    MD5Init,MD5Update和MDFinal,

  還有一個變量

    MD5_CTX (md5 context)

  名字可能略有不同,但作用都差不多。

  首先MD5Init用來初始化MD5_CTX,這個初始化一般的操作就2個,一個是ABCD賦初值,另一個是計數清零。

  然後是MD5Update,這個函數的作用就是將要進行MD5的數據寫入buffer,滿64個就變換一次。這個函數往往會調用多次。可以想象一個大文件要進行md5,1k1k的讀入,進行MD5Update,直到文件讀取完畢。

  最後就是MD5Final了,它的工作就是填充80 00和最後的8bytes的bits數,再變換一次,並且輸出最終結果。

 

  上面說的就是大概,我看了下md5-opt和openssl-md5,裏面具體的細節真是相差很多。不過只要是標準的使用md5應該關係不大。我正好碰到的就是不怎麼標準的使用md5、中途亂改md5_ctx的情況。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章