MD5的自己的理解

2021-09-23 01:22:12 字數 2279 閱讀 2691

什麼是md5演算法呢?我理解的是,md5演算法將任意長度的資料(最終都會轉化為字串),轉換成乙個固定大小(32位或者是16位)的加密資料。

而且這些加密後的資料是不可逆的,也就是說,你拿到加密後的資料後,想通過逆運算來獲取原來的資料是不可能的。

那怎麼辦呢,只有通過拿到和原來一樣的資料將他也轉化為md5碼,並與之比較才知道原資料是什麼。

這有什麼用呢?我猜是這樣的,假設背景是兩軍交戰,指揮部要和前方進行通訊,但是又怕傳送內容被敵方截獲,所以雙方約定乙個密碼本,然後將要傳送的內容經過多個md5值加密,然後另一方通過密碼本和md5碼進行核對,來確定傳送的內容。(如果不懂請看電影《風聲》)

好了廢話了這麼多我來說下md5演算法的實現吧。我的md5演算法如下

#include#include #include #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 rl(x, y) (((x) << (y)) | ((x) >> (32 - (y))))  //x向左迴圈移y位

#define pp(x) (x<<24)|((x<<8)&0xff0000)|((x>>8)&0xff00)|(x>>24)  //將x高低位互換,例如pp(aabbccdd)=ddccbbaa

#define ff(a, b, c, d, x, s, ac) a = b + (rl((a + f(b,c,d) + x + ac),s))

#define gg(a, b, c, d, x, s, ac) a = b + (rl((a + g(b,c,d) + x + ac),s))

#define hh(a, b, c, d, x, s, ac) a = b + (rl((a + h(b,c,d) + x + ac),s))

#define ii(a, b, c, d, x, s, ac) a = b + (rl((a + i(b,c,d) + x + ac),s))

unsigned a,b,c,d,a,b,c,d,i,len,flen[2],x[16];   //i臨時變數,len檔案長,flen[2]為64位二進位制表示的檔案初始長度

char filename[200];   //檔名

file *fp;

void md5()

void ge***5(char *name, char* out)

//以二進位制開啟檔案

fseek(fp, 0, seek_end); //檔案指標轉到檔案末尾

if((len=ftell(fp))==-1) //ftell函式返回long,最大為2gb,超出返回-1

rewind(fp); //檔案指標復位到檔案頭

a=0x67452301,b=0xefcdab89,c=0x98badcfe,d=0x10325476; //初始化鏈結變數

flen[1]=len/0x20000000; //flen單位是bit

flen[0]=(len%0x20000000)*8;

memset(x,0,64); //初始化x陣列為0

fread(&x,4,16,fp); //以4位元組為一組,讀取16組資料

for(i=0;i55) md5(),memset(x,0,64);

memcpy(x+14,flen,8); //檔案末尾加入原檔案的bit長度

md5();

fclose(fp);

sprintf(out,"%08x%08x%08x%08x",pp(a),pp(b),pp(c),pp(d)); //高低位逆反輸出到字串out中

}

以上**相當於提供了乙個基於檔案的md5演算法的api,只要輸入檔名就可以獲取到相應的md5碼了。

輸出的md5碼,在第二個引數out中。

md5碼的值只與檔案中的資料有關(儲存的字串)而與檔案的名字,檔案的日期無關,一開始不懂的時候,我還很丟臉的問了知乎。結果當然是慘不忍睹

,詳情請看

好了,我先寫到這裡,我還去研究下另外一種實現方法,我感覺他比這個強大,這位同學寫的我就先mark了。好了睡了。。。

php 變數的md5加密,PHP中的MD5加密

php中的md5加密 2005 02 17 enet ciweek 綜述 密碼學是研究編制密碼 我們簡稱為加密 encode 和破譯密碼 我們稱之為解密 decode 的技術科學。研究密碼變化的客觀規律,應用於編制密碼以保守通訊秘密的,稱為編碼學 應用於破譯密碼以獲取通訊情報的,稱為破譯學,總稱密碼...

Shiro密碼的MD5加密 MD5鹽值加密

用md5加密演算法後,前台使用者輸入的字串如何使用md5加密,需要做的是將當前的realm 的credentialsmatcher屬性,替換為md5credentialsmatcher 由於md5credentialsmatcher已經過期了,推薦使用hashedcredentialsmatcher...

計算檔案的md5

本地配置檔案,或要做熱更的檔案,通過計算檔案md5與儲存在伺服器端的值做對比,如果不一致則說明本地檔案過舊,或者被非法修改過。算檔案md5方法為 讀取檔案為二進位製流,算出md5值轉為字串。using system using system.collections.generic using sys...