MD5加密演算法原理及實現

2021-08-27 08:46:16 字數 3294 閱讀 4609

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

6 void rol(unsigned int &s, unsigned short cx); //32位數迴圈左移實現函式

7 void ltob(unsigned int &i); //b\l互轉,接受uint型別

8 unsigned int* md5(const char* mstr); //介面函式,並執行資料填充,計算md5時呼叫此函式

9 10 #endif

#md5.cpp

1 #include "md5.h"

2 3 /*4組計算函式*/

4 inline unsigned int f(unsigned int x, unsigned int y, unsigned int z)

5 8 inline unsigned int g(unsigned int x, unsigned int y, unsigned int z)

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 29

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

31 void ltob(unsigned int &i)

32 40 return;

41 }

42 43 /*

44 md5迴圈計算函式,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 */

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

48 ,

53 ,

54 ,

55

56 };//迴圈左移-位數表

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

59 ,

60 ,

61

62 };//資料座標表

63 const unsigned int *pm = static_cast(m);//轉換型別為32位的uint

64 tacc = ((label - 1) * 16) + 1; //根據第幾輪迴圈初始化t表累加器

65 clac clacarr[4] = ; //定義並初始化計算函式指標陣列

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

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

69

81 return;

82 }

83 84 /*介面函式,並執行資料填充*/

85 unsigned int* md5(const char* mstr)

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

106 for (unsigned int bcount = 0; bcount < loopnumber; ++bcount) //分組大迴圈開始

107

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

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; //清除記憶體並返回

125 return lgroup;

126 }

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

#main.cpp

1 #include 2 #include 3 #include 4 #include "md5.h"

5 6 int 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在訊息後...