md5演算法及附帶C語言內聯函數實現

演算法描述

MD5以512位元分組來處理輸入的資訊,且每一分組又被劃分為16個32位子分組,經過了一系列的處理後,演算法的輸出由四個32位分組組成,將這四個32位分組級聯後將生成一個128位散列值。

在MD5演算法中,首先需要對資訊進行填充,使其位長對512求餘的結果等於448。因此,資訊的位元長(Bits Length)將被擴展至N*512+448,即N*64+56個位元組(Bytes),N為一個正整數。填充的方法如下,在資訊的後面填充一個1和無數個0,直到滿足上面的條件時才停止用0對資訊的填充。然後,在這個結果後面附加一個以64位元二進位表示的填充前資訊長度。經過這兩步的處理,現在的資訊的位元長=N*512+448+64=(N+1)*512,即長度恰好是512的整數倍。這樣做的原因是為滿足後面處理中對資訊長度的要求。

MD5中有四個32位元被稱作連結變數(Chaining Variable)的整數參數,他們分別為:A=0x67452301UL,B=0xEFCDAB89UL,C=0x98BADCFEUL,D=0x10325476UL。
當設置好這四個連結變數後,就開始進入演算法的四輪迴圈運算。迴圈的次數是資訊中512位元資訊分組的數目。
將上面四個連結變數複製到另外四個變數中:A到a,B到b,C到c,D到d。
主迴圈有四輪(MD4只有三輪),每輪迴圈都很相似。第一輪進行16次操作。每次操作對a、b、c和d中的其中三個作一次非線性函數運算,然後將所得結果加上第四個變數,文本的一個子分組和一個常數。再將所得結果向右環移一個不定的數,並加上a、b、c或d中之一。最後用該結果取代a、b、c或d中之一。
以一下是每次操作中用到的四個非線性函數(每輪一個)。
F(X,Y,Z) =(X&Y)|((~X)&Z)
G(X,Y,Z) =(X&Z)|(Y&(~Z))
H(X,Y,Z) =X^Y^Z
I(X,Y,Z)=Y^(X|(~Z))
(&是與,|是或,~是非,^是異或)
這四個函數的說明:如果X、Y和Z的對應位是獨立和均勻的,那麼結果的每一位也應是獨立和均勻的。

F是一個逐位元運算的函數。即,如果X,那麼Y,否則Z。函數H是逐位元奇偶操作符。
假設Mj表示消息的第j個子分組(從0到15),<<
FF(a, b, c, d, Mj, s, ti)表示 a = b + ((a + F(b, c, d) + Mj + ti) << s)
GG(a, b, c, d, Mj, s, ti)表示 a = b + ((a + G(b, c, d) + Mj + ti) << s)
HH(a, b, c, d, Mj, s, ti)表示 a = b + ((a + H(b, c, d) + Mj + ti) << s)
II(a, b, c, d, Mj, s, ti)表示 a = b + ((a + I(b, c, d) + Mj + ti) << s)

後面隨帶的附件為md5的C語言實現,可以直接用實際工作中,也可修改CHAIN_A到CHAIN_D的值,夠成自己獨一無二的md5演算法。

你可以用以下幾個MD5演算法對照所實現的演算法是否正確
MD5 ("") = d41d8cd98f00b204e9800998ecf8427e
MD5 ("a") = 0cc175b9c0f1b6a831c399e269772661
MD5 ("abc") = 900150983cd24fb0d6963f7d28e17f72
MD5 ("message digest") = f96b697d7cb7938d525a2f31aaf161d0
MD5 ("abcdefghijklmnopqrstuvwxyz") = c3fcd3d76192e4007dfb496cca67e13b
MD5 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz") =
f29939a25efabaef3b87e2cbfe641315

(此篇文章為網路轉載,如有冒犯,請來信告知,當即刻移除!)