MD5加密演算法原理及實現

2021-07-25 22:48:44 字數 3330 閱讀 2654

**:

md5訊息摘要演算法,屬hash演算法一類。md5演算法對輸入任意長度的訊息進行執行,產生乙個128位的訊息摘要。

以下所描述的訊息長度、填充資料都以位(bit)為單位,位元組序為小端位元組。

演算法原理

1、資料填充

對訊息進行資料填充,使訊息的長度對512取模得448,設訊息長度為x,即滿足x mod 512=448。根據此公式得出需要填充的資料長度。

填充方法:在訊息後面進行填充,填充第一位為1,其餘為0。

2、新增訊息長度

在第一步結果之後再填充上原訊息的長度,可用來進行的儲存長度為64位。如果訊息長度大於264,則只使用其低64位的值,即(訊息長度 對 264取模)。

在此步驟進行完畢後,最終訊息長度就是512的整數倍。

3、資料處理

準備需要用到的資料:

把訊息分以512位為一分組進行處理,每乙個分組進行4輪變換,以上面所說4個常數為起始變數進行計算,重新輸出4個變數,以這4個變數再進行下一分組的運算,如果已經是最後乙個分組,則這4個變數為最後的結果,即md5值。

具體計算的實現較為複雜,建議查閱相關書籍,下面給出在c++上的實現**。

**實現

#md5.h

1

#ifndef md5h

2#define md5h

3 #include 4 #include 5

6void rol(unsigned int &s, unsigned short cx); //

32位數迴圈左移實現函式

7void ltob(unsigned int &i); //

b\l互轉,接受uint型別

8 unsigned int* md5(const

char* mstr); //

介面函式,並執行資料填充,計算md5時呼叫此函式910

#endif

#md5.cpp

1 #include "

md5.h"2

3/*4組計算函式

*/4 inline unsigned int f(unsigned int x, unsigned int y, unsigned intz)5

8 inline unsigned int g(unsigned int x, unsigned int y, unsigned intz)9

12 inline unsigned int h(unsigned int x, unsigned int y, unsigned int

z)13

16 inline unsigned int i(unsigned int x, unsigned int y, unsigned int

z)17

20/*

4組計算函式結束

*/21

22/*

32位數迴圈左移實現函式

*/23

void rol(unsigned int &s, unsigned short

cx)24

2930

/*b\l互轉,接收uint型別

*/31

void ltob(unsigned int &i)

3240

return;41

}4243/*

44md5迴圈計算函式,label=第幾輪迴圈(1<=label<=4),lgroup陣列=4個種子副本,m=資料(16組32位數指標)

45種子陣列排列方式: --a--d--c--b--,即 lgroup[0]=a; lgroup[1]=d; lgroup[2]=c; lgroup[3]=b;

46*/

47void accloop(unsigned short label, unsigned int *lgroup, void *m)48,

53 ,

54 ,

55

56 };//

迴圈左移-位數表

57const unsigned short mn[4][16] =,

59 ,

60 ,

61

62 };//

資料座標表

63const unsigned int *pm = static_castint*>(m);//

轉換型別為32位的uint

64 tacc = ((label - 1) * 16) + 1; //

根據第幾輪迴圈初始化t表累加器

65 clac clacarr[4] = ; //

定義並初始化計算函式指標陣列

6667

/*一輪迴圈開始(16組->16次)

*/68

for (short i = 0; i < 16; ++i)

6981

return;82

}8384/*

介面函式,並執行資料填充

*/85 unsigned int* md5(const

char*mstr)

86; //

種子副本陣列,並作為返回值返回

106for (unsigned int bcount = 0; bcount < loopnumber; ++bcount) //

分組大迴圈開始

107113

/*資料相加作為下一輪的種子或者最終輸出

*/114 a = (lgroup[0] +=a);

115 b = (lgroup[3] +=b);

116 c = (lgroup[2] +=c);

117 d = (lgroup[1] +=d);

118}

119/*

轉換記憶體中的布局後才能正常顯示

*/120 ltob(lgroup[0

]);121 ltob(lgroup[1

]);122 ltob(lgroup[2

]);123 ltob(lgroup[3

]);124 delete md5buff; //

清除記憶體並返回

125return

lgroup;

126 }

再給出呼叫例項(以win32控制台應用程式為例):

#main.cpp

1 #include 2 #include 

3 #include 4 #include "

md5.h"5

6int main(int argc, char **argv)

7

MD5加密演算法原理及實現

md5訊息摘要演算法,屬hash演算法一類。md5演算法對輸入任意長度的訊息進行執行,產生乙個128位的訊息摘要。以下所描述的訊息長度 填充資料都以位 bit 為單位,位元組序為小端位元組。演算法原理 1 資料填充 對訊息進行資料填充,使訊息的長度對512取模得448,設訊息長度為x,即滿足x mo...

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 ...

MD5加密演算法

md5訊息摘要演算法 message digest algorithm 它對輸入的任意長度的訊息進行運算,產生乙個128位的訊息摘要。演算法原理 資料填充 填充訊息使其長度與448模512同餘 長度 448 mod 512 即時訊息長度本身已經滿足了上述長度要求也需要填充。填充方法 附乙個1在訊息後...