資源簡介
md5加密算法 C語言(經過測試驗證完整版)
經過調試驗證,與工具結果一致
MD5信息摘要算法(英語:MD5 Message-Digest Algorithm),一種被廣泛使用的密碼散列函數,可以產生出一個128位(16字節)的散列值(hash value),用于確保信息傳輸完整一致。MD5由美國密碼學家羅納德·李維斯特(Ronald Linn Rivest)設計,于1992年公開,用以取代MD4算法。這套算法的程序在 RFC 1321 標準中被加以規范。1996年后該算法被證實存在弱點,可以被加以破解,對于需要高度安全性的數據,專家一般建議改用其他算法,如SHA-2。2004年,證實MD5算法無法防止碰撞(collision),因此不適用于安全性認證,如SSL公開密鑰認證或是數字簽名等用途。
經過調試驗證,與工具結果一致
MD5信息摘要算法(英語:MD5 Message-Digest Algorithm),一種被廣泛使用的密碼散列函數,可以產生出一個128位(16字節)的散列值(hash value),用于確保信息傳輸完整一致。MD5由美國密碼學家羅納德·李維斯特(Ronald Linn Rivest)設計,于1992年公開,用以取代MD4算法。這套算法的程序在 RFC 1321 標準中被加以規范。1996年后該算法被證實存在弱點,可以被加以破解,對于需要高度安全性的數據,專家一般建議改用其他算法,如SHA-2。2004年,證實MD5算法無法防止碰撞(collision),因此不適用于安全性認證,如SSL公開密鑰認證或是數字簽名等用途。

代碼片段和文件信息
#include?
#include?“md5.h“
?
unsigned?char?PADDING[]={0x80000000000000000
?????????????????????????0000000000000000
?????????????????????????0000000000000000
?????????????????????????0000000000000000};
?????????????????????????
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?*contextunsigned?char?*inputunsigned?int?inputlen)
{
????unsigned?int?i?=?0index?=?0partlen?=?0;
????index?=?(context->count[0]?>>?3)?&?0x3F;
????partlen?=?64?-?index;
????context->count[0]?+=?inputlen?<3;
????if(context->count[0]?(inputlen?<3))
???????context->count[1]++;
????context->count[1]?+=?inputlen?>>?29;
????
????if(inputlen?>=?partlen)
????{
???????memcpy(&context->buffer[index]inputpartlen);
???????MD5Transform(context->statecontext->buffer);
???????for(i?=?partlen;i+64?<=?inputlen;i+=64)
???????????MD5Transform(context->state&input[i]);
???????index?=?0;????????
????}??
????else
????{
????????i?=?0;
????}
????memcpy(&context->buffer[index]&input[i]inputlen-i);
}
void?MD5Final(MD5_CTX?*contextunsigned?char?digest[16])
{
????unsigned?int?index?=?0padlen?=?0;
????unsigned?char?bits[8];
????index?=?(context->count[0]?>>?3)?&?0x3F;
????padlen?=?(index?56)?(56-index):(120-index);
????MD5Encode(bitscontext->count8);
????MD5Update(contextPADDINGpadlen);
????MD5Update(contextbits8);
????MD5Encode(digestcontext->state16);
}
void?MD5Encode(unsigned?char?*outputunsigned?int?*inputunsigned?int?len)
{
????unsigned?int?i?=?0j?=?0;
????while(j?????{
?????????output[j]?=?input[i]?&?0xFF;??
?????????output[j+1]?=?(input[i]?>>?8)?&?0xFF;
?????????output[j+2]?=?(input[i]?>>?16)?&?0xFF;
?????????output[j+3]?=?(input[i]?>>?24)?&?0xFF;
?????????i++;
?????????j+=4;
????}
}
void?MD5Decode(unsigned?int?*outputunsigned?char?*inputunsigned?int?len)
{
?????unsigned?int?i?=?0j?=?0;
?????while(j??????{
???????????output[i]?=?(input[j])?|
???????????????????????(input[j+1]?<8)?|
???????????????????????(input[j+2]?<16)?|
???????????????????????(input[j+3]?<24);
???????????i++;
???????????j+=4;?
?????}
}
void?MD5Transform(unsigned?int?state[4]unsigned?char?block[64])
{
?????unsigned?int?a?=?state[0];
?????unsigned?int?b?=?state[1];
?????unsigned?int?c?=?state[2];
?????unsigned?int?d?=?state[3];
?????unsigned?int?x[64];
?????MD5Decode(xblock64);
?????FF(a?b?c?d?x[?0]?7?0xd76aa478);?/*?1?*/
?FF(d?a?b?c?x[?1]?12?0xe8c7b756);?/*?2?*/
?FF(c?d?a?b?x[?2]?17?0x242070db);?/*?3?*/
?FF(b?c?d?a?x[?3]?22?0xc1bdceee);?/*?4?*/
?FF(a?b?c?d?x[?4]?7?0xf57c0faf);?/*?5?*/
?FF(d?a?b?c?x[?5]?12?0x4787c62a);?/*?6?*/
?FF(c?d?a?b?x[?6]?17?0xa8304613);?/
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????5980??2014-02-23?23:04??src\md5.c
?????文件???????1471??2016-11-15?20:38??src\md5.h
?????文件????????599??2016-11-14?22:40??src\test.c
?????目錄??????????0??2016-11-16?16:16??src
-----------?---------??----------?-----??----
?????????????????8050????????????????????4
- 上一篇:C++五子棋源碼有AI,先手禁手
- 下一篇:c語言實現中綴表達式轉后綴并求值
評論
共有 條評論