MD5加密演算法

2022-06-27 06:51:11 字數 3755 閱讀 5092

**:

全稱:message-digest algorithm 5 

翻譯過來就是:資訊 摘要 演算法 5

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

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

1.特點

(1)長度固定:不管多長的字串,加密後長度都是一樣長 

作用:方便平時資訊的統計和管理

(2)易計算:字串和檔案加密的過程是容易的. 

作用: 開發者很容易理解和做出加密工具

(3)細微性:乙個檔案,不管多大,小到幾k,大到幾g,你只要改變裡面某個字元,那麼都會導致md5值改變. 

(4)不可逆性:你明明知道密文和加密方式,你卻無法反向計算出原密碼. 

作用:大大提高了資料的安全性

2.撞庫破解

這是概率極低的破解方法,原理就是:

(1)建立乙個大型的資料庫,把日常的各個語句,通過md5加密成為密文,不斷的積累大量的句子,放在乙個龐大的資料庫裡.

(2)比如乙個人拿到了別人的密文,想去查詢真實的密碼,就需要那這個密文去到提供這個資料庫的公司**去查詢.

3.md5加鹽

比如我的銀行密碼是」12345」

(1)得到的md5是:827ccb0eea8a706c4c34a16891f84e7b

(2)乙個人擷取到這個密文,那麼通過撞庫肯定容易撞出12345.

(3)我們要做的就是加鹽,銀行密碼還是」12345」,然後我把銀行密碼加上我特定的字串才計算md5 

所以密碼還是那個密碼,但是變成求」12345密碼加密987」的md5值,然後再得到md5,那麼這個md5起碼可以確認那個資料庫不會有.

4.演算法原理

(1)資料填充

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

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

(2)新增訊息長度

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

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

(3)資料處理

準備需要用到的資料:

4個常數: a = 0x67452301, b = 0x0efcdab89, c = 0x98badcfe, d = 0x10325476;

4個函式:f(x,y,z)=(x & y) | ((~x) & z); g(x,y,z)=(x & z) | (y & (~z));  h(x,y,z)=x ^ y ^ z; i(x,y,z)=y ^ (x | (~z));

把訊息分以512位為一分組進行處理,每乙個分組進行4輪變換,以上面所說4個常數為起始變數進行計算,重新輸出4個變數,以這4個變數再進行下一分組的運算,如果

已經是最後乙個分組,則這4個變數為最後的結果,即md5值。

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

md5.h:

#pragma once#ifndef md5h

#define md5h#include

#include

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

32位數迴圈左移實現函式

void ltob(unsigned int &i); //

b\l互轉,接受uint型別

unsigned int* md5(const

char* mstr); //

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

#endif

md5.cpp:

#pragma once#include 

"md5.h"/*

4組計算函式

*/inline unsigned

int f(unsigned int x, unsigned int y, unsigned intz)

inline unsigned

int g(unsigned int x, unsigned int y, unsigned intz)

inline unsigned

int h(unsigned int x, unsigned int y, unsigned intz)

inline unsigned

int i(unsigned int x, unsigned int y, unsigned intz)

/*4組計算函式結束

*//*

32位數迴圈左移實現函式

*/void rol(unsigned int &s, unsigned short

cx) /*

b\l互轉,接收uint型別

*/void ltob(unsigned int &i)

return

; } /*

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

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

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

,};

//迴圈左移-位數表

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

};//資料座標表

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

轉換型別為32位的uint

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

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

clac clacarr[4] = ; //

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

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

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

return

; } /*

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

*/unsigned

int* md5(const

char*mstr)

; //

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

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

分組大迴圈開始

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

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

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

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

d = (lgroup[1] +=d);}/*

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

*/ltob(lgroup[

0]);

ltob(lgroup[

1]);

ltob(lgroup[

2]);

ltob(lgroup[

3]);

delete md5buff; //

清除記憶體並返回

return

lgroup;

}

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發展而來。訊...