MD5算法實現細節--------第一步和第二步

關於MD5在網上看了一些資料,但是發現普遍有一個問題:通篇基本只講個大概流程,對於細節並未提及。但是從實際應用的角度來看,並不需要具體去了解MD5的原理,只需關心如何用代碼將其實現,而其中細節纔是關鍵。至於大概流程,可以參照以下博文,講的比較詳細:

http://blog.csdn.net/forgotaboutgirl/article/details/7258109

以下我將按照以上博文中的MD5的算法過程,說明每一步的具體細節。
第一步
填充:如果輸入信息的長度(bit)對512求餘的結果不等於448,就需要填充使得對512求餘的結果等於448。填充的方法是填充一個1和n個0。填充完後,信息的長度就爲N*512+448(bit);
第二步
記錄信息長度:用64位來存儲填充前信息長度。這64位加在第一步結果的後面,這樣信息長度就變爲N*512+448+64=(N+1)*512位。

實現細節:這裏我將第一步和第二步合起來說是因此,這兩步的目的是一致的,都是爲了將原始數據經過頭尾填充變爲512位的倍數。變爲512的倍數之後,要將其細分爲16組,每組32位。

舉例說明:(這裏只針對原始數據長度小於512的情況,其他情況自行拓展,原理一致)比如你要對字符串”abcdef”求MD5,其轉化爲十六進制數爲:0x61,0x62,0x63,0x64,0x65,0x66,一共有6*8=48bit(10進制數)=0x30(16進制)。
得到原始數據之後,經過填充得到以下數據:
第一步填充:61 62 63 64 65 66 80 00 00 00 …… 00 00 00
第二步填充:30 00 00 00 00 00 00 00
(說明:一二步填充後數據總長512位)
由於使用的是小端模式,填充後的數據,並非像以上那樣存儲在內存中。而是如下圖所示:(說明:填充之後的512位數據分成16組之後,存儲在16個32位的數組中)
因此,在將原始數據放入32位數組中的時候,必須注意採用小端模式,這至關重要。
填充之後的512位數據分成16組之後,存儲在16個32位的數組中

至此,你就將原始數據填充爲了512位,並將其細分爲了16組,這爲之後的第三步和第四步做好了準備。

發佈了22 篇原創文章 · 獲贊 7 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章