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的情況。