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#md5.cpp2 #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
1 #include "md5.h"再給出呼叫例項(以win32控制台應用程式為例):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 }
#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在訊息後...