MD5加密原理解析及OC版原理實現

2021-09-10 08:34:48 字數 3364 閱讀 1736

md5演算法是hash演算法的一種,叫做訊息摘要演演算法。所謂摘要,從字面意思理解,是指內容的大概。在md5演算法中,這個摘要是指將任意資料對映成乙個128位長的摘要資訊。並且其是不可逆的,即從摘要資訊無法反向推演中原文,在演算過程中,原文的內容也是有丟失的。

因為md5演算法最終生成的是乙個128位長的資料,從原理上說,有2^128種可能,這是乙個非常巨大的資料,約等於3.4乘10的38次方,雖然這個是個天文數字,但是世界上可以進行加密的資料原則上說是無限的,因此是可能存在不同的內容經過md5加密後得到同樣的摘要資訊,但這個碰中的概率非常小。

md5常用在密碼加密中,一般為了保證使用者密碼的安全,在資料庫中儲存的都是使用者的密碼經過md5加密後的值,在客戶端使用者輸入密碼後,也會使用md5進行加密,這樣即使使用者的網路被竊聽,竊聽者依然無法拿到使用者的原始密碼,並且即使使用者資料庫被盜,沒有儲存明文的密碼對使用者來說也多了一層安全保障。

md5簽名技術還常用於防止資訊的篡改。使用md5可以對進行進行簽名,接收者拿到資訊後只要重新計算簽名和原始簽名進行對比,即可知道資料資訊是否中途被篡改了。

md5演算法大致分為4步完成:

這一步是對要加密的資料進行填充和整理,將要加密的二進位制資料對512取模,得到的結果如果不夠448位,則進行補足,補足的方式是第1位填充1,後面全部填充0。

第2步:記錄資料長度

經過第一步整理完成後的資料的位數可以表示為n*512+448,再向其後追加64位用來儲存資料的長度,比如資料的長度為16位元組,則用10000來填充後64位。這一步做完後,資料的位數將變成(n+1)*512。

第3步:以標準的幻數作為輸入

md5的實現需要每512個位元組進行一次處理,後一次處理的輸入為前一次處理的輸出,因此,在迴圈處理開始之前,需要拿4個標準數作為輸入,它們分別是:

unsigned int a=0x67452301,b=0xefcdab89,c=0x98badcfe,d=0x10325476;
第4步:進行n輪迴圈處理,將最後的結果輸出

這一步重要的是每一輪的處理演算法,每一輪處理也要迴圈64次,這64次迴圈被分為4各組,每16次迴圈為一組,每組迴圈使用不同的邏輯處理函式,處理完成後,將輸出作為輸入進入下一輪迴圈。

這裡演示的是每輪迴圈的核心演算法:

首先進行3個函式的宣告:

//將大端位元組序轉換為小端位元組序

void converttolittleendian(unsigned int *data, int len);

//進行迴圈左移函式

void rol(unsigned int *s, unsigned short cx);

//md5加密函式

void md5(nsstring *str);

md5演算法中處理的資料都是小端位元組序的,而使用objective-c處理的nsdata物件的位元組序是大端位元組序,因此我們需要做一下轉換。函式實現如下:

void converttolittleendian(unsigned int *data, int len)

}

在md5中有需要對位元組資料進行迴圈左移的操作,迴圈左移函式實現如下:

void rol(unsigned int *s, unsigned short cx)

下面是md5函式的核心實現:

void md5(nsstring *str)else

} while (data.length<56);

}int length = (int)str.length*8%((int)pow(2, 64));

void * newbytes[64];

memcpy(newbytes, [data bytes], 64);

//大小端轉換

converttolittleendian(newbytes, 64);

nsdata * newdata = [nsdata datawithbytes:newbytes length:data.length];

nsmutablearray * subdata = [nsmutablearray array];

//進行分組

for (int i = 0; i<16; i++)

//初始輸入

unsigned int a=0x67452301,b=0xefcdab89,c=0x98badcfe,d=0x10325476;

unsigned int a=a,b=b,c=c,d=d;

unsigned int s[64] = ;

unsigned int k[64] = ;

//64次迴圈處理

for (int i = 0; i <= 64; i++) else if(i<32) else if(i<48)else

unsigned int * temp = (unsigned int *) [subdata[g] bytes];

unsigned int *tem = malloc(sizeof(unsigned int));

memcpy(tem, temp, 4);

converttolittleendian(tem, 4);

unsigned int res = (a+f+*tem+k[i]);

rol(&res,s[i]);

unsigned int t = res+b;

a = d;

d = c;

c = b;

b = t;

}else

}//大小端轉換

unsigned int * newa = malloc(sizeof(unsigned int));

memcpy(newa, &a, 4);

nslog(@"%0x",*newa);

converttolittleendian(newa, 4);

unsigned int * newb = malloc(sizeof(unsigned int));

memcpy(newb, &b, 4);

converttolittleendian(newb, 4);

unsigned int * newc = malloc(sizeof(unsigned int));

memcpy(newc, &c, 4);

converttolittleendian(newc, 4);

unsigned int * newd = malloc(sizeof(unsigned int));

memcpy(newd, &d, 4);

converttolittleendian(newd, 4);

nslog(@"aaa:%0x %0x %0x %0x ",*newa,*newb,*newc,*newd);

}

MD5加密原理解析及OC版原理實現

md5加密原理解析及oc版原理實現 一 md5演算法基礎概念 md5演算法是hash演算法的一種,叫做訊息摘要演演算法。所謂摘要,從字面意思理解,是指內容的大概。在md5演算法中,這個摘要是指將任意資料對映成乙個128位長的摘要資訊。並且其是不可逆的,即從摘要資訊無法反向推演中原文,在演算過程中,原...

MD5加密原理

簡單字串md5加密1.messagedigest.getinstance md5 digest 需要加密的字元 getbytes 計算出來的結果返回的byte長度始終為16位。2.要記住我們計算出來的md5 32位 最後都都是固定長度32的字串 byte有8位,假如全部都是 11111111 那麼對...

pythonmd5加密原理 MD5加密原理

md5 加密c zz 1.來歷 md5的全稱是 message digest algorithm 5 資訊摘要演算法,在 年代初由 mit laboratory for computer science 和rsa data security inc 的ronald l.rivest 開發出來,經md...