什麼是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...