加密演算法之MD5演算法

2022-08-14 03:48:11 字數 4038 閱讀 2627

在一些初始化處理後,md5以512位分組來處理輸入文字,每一分組又劃分為16個32位子分組。演算法的輸出由四個32位分組組成,將它們級聯形成乙個128位雜湊值。 

首先填充訊息使其長度恰好為乙個比512位的倍數僅小64位的數。填充方法是附乙個1在訊息後面,後接所要求的多個0,然後在其後附上64位的訊息長度(填充前)。這兩步的作用是使訊息長度恰好是512位的整數倍(演算法的其餘部分要求如此),同時確保不同的訊息在填充後不相同。 

四個32位變數初始化為: 

a=0×01234567 

b=0×89abcdef 

c=0xfedcba98 

d=0×76543210 

它們稱為鏈結變數(chaining variable) 

接著進行演算法的主迴圈,迴圈的次數是訊息中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),<<< s表示迴圈左移s位,則四種操作為: 

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) 

這四輪(64步)是: 

第一輪 

ff(a,b,c,d,m0,7,0xd76aa478) 

ff(d,a,b,c,m1,12,0xe8c7b756) 

ff(c,d,a,b,m2,17,0×242070db) 

ff(b,c,d,a,m3,22,0xc1bdceee) 

ff(a,b,c,d,m4,7,0xf57c0faf) 

ff(d,a,b,c,m5,12,0×4787c62a) 

ff(c,d,a,b,m6,17,0xa8304613) 

ff(b,c,d,a,m7,22,0xfd469501) 

ff(a,b,c,d,m8,7,0×698098d8) 

ff(d,a,b,c,m9,12,0×8b44f7af) 

ff(c,d,a,b,m10,17,0xffff5bb1) 

ff(b,c,d,a,m11,22,0×895cd7be) 

ff(a,b,c,d,m12,7,0×6b901122) 

ff(d,a,b,c,m13,12,0xfd987193) 

ff(c,d,a,b,m14,17,0xa679438e) 

ff(b,c,d,a,m15,22,0×49b40821) 

第二輪 

gg(a,b,c,d,m1,5,0xf61e2562) 

gg(d,a,b,c,m6,9,0xc040b340) 

gg(c,d,a,b,m11,14,0×265e5a51) 

gg(b,c,d,a,m0,20,0xe9b6c7aa) 

gg(a,b,c,d,m5,5,0xd62f105d) 

gg(d,a,b,c,m10,9,0×02441453) 

gg(c,d,a,b,m15,14,0xd8a1e681) 

gg(b,c,d,a,m4,20,0xe7d3fbc8) 

gg(a,b,c,d,m9,5,0×21e1cde6) 

gg(d,a,b,c,m14,9,0xc33707d6) 

gg(c,d,a,b,m3,14,0xf4d50d87) 

gg(b,c,d,a,m8,20,0×455a14ed) 

gg(a,b,c,d,m13,5,0xa9e3e905) 

gg(d,a,b,c,m2,9,0xfcefa3f8) 

gg(c,d,a,b,m7,14,0×676f02d9) 

gg(b,c,d,a,m12,20,0×8d2a4c8a) 

第三輪 

hh(a,b,c,d,m5,4,0xfffa3942) 

hh(d,a,b,c,m8,11,0×8771f681) 

hh(c,d,a,b,m11,16,0×6d9d6122) 

hh(b,c,d,a,m14,23,0xfde5380c) 

hh(a,b,c,d,m1,4,0xa4beea44) 

hh(d,a,b,c,m4,11,0×4bdecfa9) 

hh(c,d,a,b,m7,16,0xf6bb4b60) 

hh(b,c,d,a,m10,23,0xbebfbc70) 

hh(a,b,c,d,m13,4,0×289b7ec6) 

hh(d,a,b,c,m0,11,0xeaa127fa) 

hh(c,d,a,b,m3,16,0xd4ef3085) 

hh(b,c,d,a,m6,23,0×04881d05) 

hh(a,b,c,d,m9,4,0xd9d4d039) 

hh(d,a,b,c,m12,11,0xe6db99e5) 

hh(c,d,a,b,m15,16,0×1fa27cf8) 

hh(b,c,d,a,m2,23,0xc4ac5665) 

第四輪 

ii(a,b,c,d,m0,6,0xf4292244) 

ii(d,a,b,c,m7,10,0×432aff97) 

ii(c,d,a,b,m14,15,0xab9423a7) 

ii(b,c,d,a,m5,21,0xfc93a039) 

ii(a,b,c,d,m12,6,0×655b59c3) 

ii(d,a,b,c,m3,10,0×8f0ccc92) 

ii(c,d,a,b,m10,15,0xffeff47d) 

ii(b,c,d,a,m1,21,0×85845dd1) 

ii(a,b,c,d,m8,6,0×6fa87e4f) 

ii(d,a,b,c,m15,10,0xfe2ce6e0) 

ii(c,d,a,b,m6,15,0xa3014314) 

ii(b,c,d,a,m13,21,0×4e0811a1) 

ii(a,b,c,d,m4,6,0xf7537e82) 

ii(d,a,b,c,m11,10,0xbd3af235) 

ii(c,d,a,b,m2,15,0×2ad7d2bb) 

ii(b,c,d,a,m9,21,0xeb86d391) 

常數ti可以如下選擇: 

在第i步中,ti是4294967296*abs(sin(i))的整數部分,i的單位是弧度。 

(2的32次方) 

所有這些完成之後,將a,b,c,d分別加上a,b,c,d。然後用下一分組資料繼續執行演算法,最後的輸出是a,b,c和d的級聯。 

md5的安全性 

md5相對md4所作的改進: 

1.增加了第四輪. 

2.每一步均有唯一的加法常數. 

3.為減弱第二輪中函式g的對稱性從(x&y)|(x&z)|(y&z)變為(x&z)|(y&(~z)) 

4.第一步加上了上一步的結果,這將引起更快的雪崩效應. 

5.改變了第二輪和第三輪中訪問訊息子分組的次序,使其更不相似. 

6.近似優化了每一輪中的迴圈左移位移量以實現更快的雪崩效應.各輪的位移量互不相同.

加密演算法之MD5

md5加密演算法 加密的方式有兩種,一種是客戶端和伺服器端整個通訊通道進行保護加密,如https協議中的 ssl,還有另一種加密是對通訊資料本身進行加密,如 md5,接下來主要針對 md5進行研究。md5加密就是資訊摘要演算法,是一種雜湊函式,可以將乙個字串,或檔案,或壓縮包,執行 md5後,就可以...

加密演算法 MD5演算法

感覺這個演算法很有趣,那麼就暫時先咕咕咕一篇大神別人寫的模板在這裡 或許等以後有空了再了解原理吧,可能最近到更久的一段時間都沒有空 newuser的md5碼是 18092d7d5ad731776372bf39801b5aac 模板 include includeusing namespace std...

md5加密演算法

md5.h ifndef md5h define md5h include include void rol unsigned int s,unsigned short cx 32位數迴圈左移實現函式 void ltob unsigned int i b l互轉,接受uint型別 unsigned ...