MD5加密演算法(C 版)

2021-09-10 13:14:39 字數 3421 閱讀 1777

此演算法使用c++寫成。更多詳細內容可參考github專案

①填充字串函式:在長度為k bits的原始訊息尾部填充長度為p bits的標識(1000…00),其中1 <= p <= 512(即至少需要填充乙個bit),使得填充後的訊息位數為 k+p ≡ 448(mod 512)。注意,當k ≡ 448(mod 512)時,填充的位元組數 p = 512 bit。填充得到上述訊息後,在尾部附加k值的低64位,最後得到乙個長度為 k+p+64 ≡ 0(mod 512)的訊息。

②字串分塊函式:將填充好的字串分割成l個長度為512bit的分組

③迴圈壓縮函式:對每個512-bit分組進行64輪迭代運算

(1)對分組(a,b,c,d)中的a進行迭代運算

公式為:a <= b + ((a + g(b,c,d) + x[k] + t[i])) << s[i]

其中:· a,b,c,d代表md5緩衝區當前的數值

· g為輪函式,1-16輪迭代使用f函式,17-32輪迭代使用g函式,33-48輪迭 代使用h函式,49-64輪迭代使用i函式

· x[k]代表當前處理訊息分組的第k個32位字,x[k]由第n輪迭代對應的順序表決定

· t[i]代表t表的第i項的值,t[i] = int(2^32 * |sin(i)|)

· s[i]對應第i輪的左迴圈移位的s值

(2)對分組(a,b,c,d)作迴圈輪換

公式為:(b,c,d,a)<=(a,b,c,d)

④md5編碼函式:用於呼叫前面的功能函式進行md5編碼

(1)輸入待加密的明文本串

(2)對明文本串進行填充

(3)對填充後的明文本串進行分塊(yq)

(4)使用預設的初始值初始化md5緩衝區間(iv)

(5)對各個分塊字串利用公式hmd5(cvi-1, yi)進行迴圈壓縮,運算結果作為下一塊的輸入(cvi)

當所有的分塊迭代完成後,輸出結果cvl,l表示最後乙個分塊的序號

1. 64輪迭代

2. 單次迭代的計算步驟

3. 4輪迴圈所使用的生成函式

md5// f函式

unsigned

intf

(unsigned

int b,

unsigned

int c,

unsigned

int d)

// g函式

unsigned

intg

(unsigned

int b,

unsigned

int c,

unsigned

int d)

// h函式

unsigned

inth

(unsigned

int b,

unsigned

int c,

unsigned

int d)

// i函式

unsigned

inti

(unsigned

int b,

unsigned

int c,

unsigned

int d)

// 移位操作函式

unsigned

intshift

(unsigned

int a,

unsigned

int n)

// 編碼函式

string encode

(string src)

iteratefunc

(num,16)

;}return

format

(tempa)

+format

(tempb)

+format

(tempc)

+format

(tempd);}

// 迴圈壓縮

void

iteratefunc

(unsigned

int* x,

int size =16)

else

if(i <32)

else

if(i <48)

else

rec = d;

d = c;

c = b;

b = b +

shift

(a + g + x[k]

+ t[i]

, s[i]);

a = rec;

} tempa +

= a;

tempb +

= b;

tempc +

= c;

tempd +

= d;

}// 填充字串

vector<

unsigned

int>

padding

(string src)

// 補充1000...000

rec[src.

length()

>>2]

|=0x80

<<

((src.

length()

%4)*

8);// 填充原文長度

rec[rec.

size()

-2]= src.

length()

<<3;

return rec;

}// 整理輸出

string format

(unsigned

int num)

res +

= tmp;

}return res;}}

;int

main()

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

加密演算法 MD5

一 簡介 md5的全稱是message digest algorithm 5 資訊摘要演算法 在90年代初由mit laboratory for computer science和rsa data security inc的ronald l.rivest開發出來,經md2 md3和md4發展而來。訊...