
我們在計算演算法的時候,通常都會使用MD5加密演算法,而一般實作這些操作都以來函式,下面是C/C++MD5演算法的實作代碼,希望能為你帶來幫助,
md5簡介
訊息摘要演算法第五版(英語:Message-Digest Algorithm 5,縮寫為MD5),是當前計算機領域用于確保資訊傳輸完整一致而廣泛使用的散列演算法之一(又譯哈希演算法、摘要演算法等),主流編程語言普遍已有MD5的實作,
將資料 (如一段文字)運算變為另一固定長度值,是散列演算法的基礎原理,MD5的前身有MD2、MD3和MD4,MD5由MD4、MD3、MD2改進而來,主要增強演算法復雜度和不可逆性,
目前,MD5演算法因其普遍、穩定、快速的特點,仍廣泛應用于普通 資料的錯誤檢查領域,例如在一些BitTorrent下載中,軟體將通過計算MD5檢驗下載到的檔案片段的完整性,
MD5已經廣泛使用在為檔案傳輸提供一定的可靠性方面,例如,服務器預先提供一個MD5校驗和,用戶下載完檔案以后, 用MD5演算法計算下載檔案的MD5校驗和,然后通過檢查這兩個校驗和是否一致,就能判斷下載的檔案是否出錯,
MD5是輸入不定長度資訊,輸出固定長度128-bits的演算法,經程序式流程,生成四個32位資料,最后聯合起來成為一個 128-bits散列,基本方式為,求余、取余、調整長度、與鏈接變數進行回圈運算,得出結果,
md5演算法描述
假設輸入資訊(input message)的長度為b(bit),我們想要產生它的報文摘要,在此處b為任意的非負整數:b也可能為0,也不一定為8的整數倍,且可能是任意大的長度,設該資訊的位元流表示如下: M[0] M[1] M[2] ... M[b-1] 計算此資訊的報文摘要需要如下5步:
1.補位
資訊計算前先要進行位補位,設補位后資訊的長度為LEN(bit),則LEN%512 = 448(bit),即資料擴展至 K * 512 + 448(bit),即K * 64+56(byte),K為整數,補位操作始終要執行,即使補位前資訊的長度對512求余的結果是448,具體補位操作:補一個1,然后補0至滿足上述要求,總共最少要補1bit,最多補512bit,
2.尾部加上資訊長度
將輸入資訊的原始長度b(bit)表示成一個64-bit的數字,把它添加到上一步的結果后面(在32位的機器上,這64位將用2個字來表示并且低位在前),當遇到b大于2^64這種極少的情況時,b的高位被截去,僅使用b的低64位,
經過上面兩步,資料就被填補成長度為512(bit)的倍數,也就是說,此時的資料長度是16個字(32byte)的整數倍,此時的資料表示為: M[0 ... N-1] 其中的N是16的倍數,
3.初始化快取區
用一個四個字的緩沖器(A,B,C,D)來計算報文摘要,A,B,C,D分別是32位的暫存器,初始化使用的是十六進制表示的數字,注意低位元組在前: word A: 01 23 45 67 word B: 89 ab cd ef word C: fe dc ba 98 word D: 76 54 32 10
4.轉換
首先定義4個輔助函式,每個函式的輸入是三個32位的字,輸出是一個32位的字: F(X,Y,Z) = XY v not(X) Z G(X,Y,Z) = XZ v Y not(Z) H(X,Y,Z) = X xor Y xor Z I(X,Y,Z) = Y xor (X v not(Z))
FF(a,b,c,d,Mj,s,ti)表示 a = b + ((a + F(b,c,d) + Mj + ti)
下面是MD5演算法的具體的實作
MD5演算法的頭檔案Md5.h:
#ifndef MD5_H #define MD5_H typedef struct { unsigned int count[2]; unsigned int state[4]; unsigned char buffer[64]; }MD5_CTX; #define F(x,y,z) ((x & y) | (~x & z)) #define G(x,y,z) ((x & z) | (y & ~z)) #define H(x,y,z) (x^y^z) #define I(x,y,z) (y ^ (x | ~z)) #define ROTATE_LEFT(x,n) ((x > (32-n))) #define FF(a,b,c,d,x,s,ac) { \ a += F(b, c, d) + x + ac; \ a = ROTATE_LEFT(a, s); \ a += b; \ } #define GG(a,b,c,d,x,s,ac) { \ a += G(b, c, d) + x + ac; \ a = ROTATE_LEFT(a, s); \ a += b; \ } #define HH(a,b,c,d,x,s,ac) { \ a += H(b, c, d) + x + ac; \ a = ROTATE_LEFT(a, s); \ a += b; \ } #define II(a,b,c,d,x,s,ac) { \ a += I(b, c, d) + x + ac; \ a = ROTATE_LEFT(a, s); \ a += b; \ } void MD5Init(MD5_CTX *context); void MD5Update(MD5_CTX *context, unsigned char *input, unsigned int inputlen); void MD5Final(MD5_CTX *context, unsigned char digest[16]); void MD5Transform(unsigned int state[4], unsigned char block[64]); void MD5Encode(unsigned char *output, unsigned int *input, unsigned int len); void MD5Decode(unsigned int *output, unsigned char *input, unsigned int len); #endif MD5演算法的實作檔案Md5.cpp: unsigned char PADDING[] = { 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; //在逆向代碼的時候,需要關注下面的特征值 void MD5Init(MD5_CTX *context) { context->count[0] = 0; context->count[1] = 0; context->state[0] = 0x67452301; context->state[1] = 0xEFCDAB89; context->state[2] = 0x98BADCFE; context->state[3] = 0x10325476; } void MD5Update(MD5_CTX *context, unsigned char *input, unsigned int inputlen) { unsigned int i = 0, index = 0, partlen = 0; index = (context->count[0] >> 3) & 0x3F; partlen = 64 - index; context->count[0] += inputlen count[0] count[1]++; context->count[1] += inputlen >> 29; if (inputlen >= partlen) { memcpy(&context->buffer[index], input, partlen); MD5Transform(context->state, context->buffer); for (i = partlen; i + 64 state, &input[i]); index = 0; } else { i = 0; } memcpy(&context->buffer[index], &input[i], inputlen - i); } void MD5Final(MD5_CTX *context, unsigned char digest[16]) { unsigned int index = 0, padlen = 0; unsigned char bits[8]; index = (context->count[0] >> 3) & 0x3F; padlen = (index count, 8); MD5Update(context, PADDING, padlen); MD5Update(context, bits, 8); MD5Encode(digest, context->state, 16); } void MD5Encode(unsigned char *output, unsigned int *input, unsigned int len) { unsigned int i = 0, j = 0; while (j > 8) & 0xFF; output[j + 2] = (input[i] >> 16) & 0xFF; output[j + 3] = (input[i] >> 24) & 0xFF; i++; j += 4; } } void MD5Decode(unsigned int *output, unsigned char *input, unsigned int len) { unsigned int i = 0, j = 0; while (j MD5演算法的呼叫測驗: int _tmain(int argc, _TCHAR* argv[]) { int i; unsigned char encrypt[] = "admin";//21232f297a57a5a743894a0e4a801fc3 unsigned char decrypt[16]; MD5_CTX md5; MD5Init(&md5); MD5Update(&md5, encrypt, strlen((char *)encrypt)); MD5Final(&md5, decrypt); //Md5加密后的32位結果 printf("加密前:%s\n加密后16位:", encrypt);

另外如果你想更好的提升你的編程能力,學好C語言C++編程!彎道超車,快人一步!筆者這里或許可以幫到你~
分享(原始碼、專案實戰視頻、專案筆記,基礎入門教程)
歡迎轉行和學習編程的伙伴,利用更多的資料學習成長比自己琢磨更快哦!
免費學習書籍:

免費學習資料:
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/261988.html
標籤:其他
