百科解釋
目錄·MD5簡介·算法的應用·算法描述·具體的一個MD5實現(xiàn)·一些破解MD5的網站 MD5簡介MD5的全稱是Message-digest Algorithm 5(信息-摘要算法),在90年代初由MIT Laboratory for Computer Science和RSA Data Security Inc,的Ronald.L.Rivest開發(fā)出來,經MD2、MD3和MD4發(fā)展而來。它的作用是讓大容量信息在用數(shù)字簽名軟件簽署私人密鑰前被"壓縮"成一種保密的格式(就是把一個任意長度的字節(jié)串變換成一定長的大整數(shù))。不管是MD2、MD4還是MD5,它們都需要獲得一個隨機長度的信息并產生一個128位的信息摘要。雖然這些算法的結構或多或少有些相似,但MD2的設計與MD4和MD5完全不同,那是因為MD2是為8位機器做過設計優(yōu)化的,而MD4和MD5卻是面向32位的電腦。這三個算法的描述和c語言源代碼在Internet RFC 1321中有詳細的描述(http://www.ietf.org/rfc/rfc1321.txt),這是一份最權威的文檔,由Ronald.L.Rivest在1992年8月向IETF提交。 Rivest在1989年開發(fā)出MD2算法。在這個算法中,首先對信息進行數(shù)據(jù)補位,使信息的字節(jié)長度是16的倍數(shù)。然后,以一個16位的檢驗和追加到信息末尾。并且根據(jù)這個新產生的信息計算出散列值。后來,Rogier和Chauvaud發(fā)現(xiàn)如果忽略了檢驗和將產生MD2沖突。MD2算法的加密后結果是唯一的--即沒有重復。 為了加強算法的安全性,Rivest在1990年又開發(fā)出MD4算法。MD4算法同樣需要填補信息以確保信息的字節(jié)長度加上448后能被512整除(信息字節(jié)長度mod 512 = 448)。然后,一個以64位二進制表示的信息的最初長度被添加進來。信息被處理成512位damg?rd/merkle迭代結構的區(qū)塊,而且每個區(qū)塊要通過三個不同步驟的處理。Den boer和Bosselaers以及其他人很快的發(fā)現(xiàn)了攻擊MD4版本中第一步和第三步的漏洞。Dobbertin向大家演示了如何利用一部普通的個人電腦在幾分鐘內找到MD4完整版本中的沖突(這個沖突實際上是一種漏洞,它將導致對不同的內容進行加密卻可能得到相同的加密后結果)。毫無疑問,MD4就此被淘汰掉了。 盡管MD4算法在安全上有個這么大的漏洞,但它對在其后才被開發(fā)出來的好幾種信息安全加密算法的出現(xiàn)卻有著不可忽視的引導作用。除了MD5以外,其中比較有名的還有sha-1、RIPEMD以及Haval等。 一年以后,即1991年,Rivest開發(fā)出技術上更為趨近成熟的md5算法。它在MD4的基礎上增加了"安全-帶子"(safety-belts)的概念。雖然MD5比MD4稍微慢一些,但卻更為安全。這個算法很明顯的由四個和MD4設計有少許不同的步驟組成。在MD5算法中,信息-摘要的大小和填充的必要條件與MD5完全相同。Den boer和Bosselaers曾發(fā)現(xiàn)MD5算法中的假沖突(pseudo-collisions),但除此之外就沒有其他被發(fā)現(xiàn)的加密后結果了。 Van oorschot和Wiener曾經考慮過一個在散列中暴力搜尋沖突的函數(shù)(brute-force hash function),而且他們猜測一個被設計專門用來搜索MD5沖突的機器(這臺機器在1994年的制造成本大約是一百萬美元)可以平均每24天就找到一個沖突。但單從1991年到2001年這10年間,竟沒有出現(xiàn)替代MD5算法的MD6或被叫做其他什么名字的新算法這一點,我們就可以看出這個瑕疵并沒有太多的影響MD5的安全性。上面所有這些都不足以成為MD5的在實際應用中的問題。并且,由于MD5算法的使用不需要支付任何版權費用的,所以在一般的情況下(非絕密應用領域。但即便是應用在絕密領域內,MD5也不失為一種非常優(yōu)秀的中間技術),MD5怎么都應該算得上是非常安全的了。 2004年8月17日的美國加州圣巴巴拉的國際密碼學會議(Crypto’2004)上,來自中國山東大學的王小云教授做了破譯MD5、HAVAL-128、 MD4和RIPEMD算法的報告,公布了MD系列算法的破解結果。宣告了固若金湯的世界通行密碼標準MD5的堡壘轟然倒塌,引發(fā)了密碼學界的軒然大波。 MD5破解工程權威網站http://www.md5crk.com/ 是為了公開征集專門針對MD5的攻擊而設立的,網站于2004年8月17日宣布:“中國研究人員發(fā)現(xiàn)了完整MD5算法的碰撞;Wang, Feng, Lai與Yu公布了MD5、MD4、HAVAL-128、RIPEMD-128幾個 Hash函數(shù)的碰撞。這是近年來密碼學領域最具實質性的研究進展。使用他們的技術,在數(shù)個小時內就可以找到MD5碰撞!捎谶@個里程碑式的發(fā)現(xiàn),MD5CRK項目將在隨后48小時內結束”。 MD5用的是哈希函數(shù),在計算機網絡中應用較多的不可逆加密算法有RSA公司發(fā)明的MD5算法和由美國國家技術標準研究所建議的安全散列算法SHA. 算法的應用 MD5的典型應用是對一段信息(Message)產生信息摘要(Message-Digest),以防止被篡改。比如,在UNIX下有很多軟件在下載的時候都有一個文件名相同,文件擴展名為.md5的文件,在這個文件中通常只有一行文本,大致結構如: MD5 (tanajiya.tar.gz) = 0ca175b9c0f726a831d895e269332461 這就是tanajiya.tar.gz文件的數(shù)字簽名。MD5將整個文件當作一個大文本信息,通過其不可逆的字符串變換算法,產生了這個唯一的MD5信息摘要。為了讓讀者朋友對MD5的應用有個直觀的認識,筆者以一個比方和一個實例來簡要描述一下其工作過程: 大家都知道,地球上任何人都有自己獨一無二的指紋,這常常成為公安機關鑒別罪犯身份最值得信賴的方法;與之類似,MD5就可以為任何文件(不管其大小、格式、數(shù)量)產生一個同樣獨一無二的“數(shù)字指紋”,如果任何人對文件做了任何改動,其MD5值也就是對應的“數(shù)字指紋”都會發(fā)生變化。 我們常常在某些軟件下載站點的某軟件信息中看到其MD5值,它的作用就在于我們可以在下載該軟件后,對下載回來的文件用專門的軟件(如Windows MD5 Check等)做一次MD5校驗,以確保我們獲得的文件與該站點提供的文件為同一文件。利用MD5算法來進行文件校驗的方案被大量應用到軟件下載站、論壇數(shù)據(jù)庫、系統(tǒng)文件安全等方面。 MD5的典型應用是對一段Message(字節(jié)串)產生fingerprint(指紋),以防止被“篡改”。舉個例子,你將一段話寫在一個叫 readme.txt文件中,并對這個readme.txt產生一個MD5的值并記錄在案,然后你可以傳播這個文件給別人,別人如果修改了文件中的任何內容,你對這個文件重新計算MD5時就會發(fā)現(xiàn)(兩個MD5值不相同)。如果再有一個第三方的認證機構,用MD5還可以防止文件作者的“抵賴”,這就是所謂的數(shù)字簽名應用。 所以,要遇到了md5密碼的問題,比較好的辦法是:你可以用這個系統(tǒng)中的md5()函數(shù)重新設一個密碼,如admin,把生成的一串密碼覆蓋原來的就行了。 MD5還廣泛用于操作系統(tǒng)的登陸認證上,如Unix、各類BSD系統(tǒng)登錄密碼、數(shù)字簽名等諸多方。如在UNIX系統(tǒng)中用戶的密碼是以MD5(或其它類似的算法)經Hash運算后存儲在文件系統(tǒng)中。當用戶登錄的時候,系統(tǒng)把用戶輸入的密碼進行MD5 Hash運算,然后再去和保存在文件系統(tǒng)中的MD5值進行比較,進而確定輸入的密碼是否正確。通過這樣的步驟,系統(tǒng)在并不知道用戶密碼的明碼的情況下就可以確定用戶登錄系統(tǒng)的合法性。這可以避免用戶的密碼被具有系統(tǒng)管理員權限的用戶知道。MD5將任意長度的“字節(jié)串”映射為一個128bit的大整數(shù),并且是通過該128bit反推原始字符串是困難的,換句話說就是,即使你看到源程序和算法描述,也無法將一個MD5的值變換回原始的字符串,從數(shù)學原理上說,是因為原始的字符串有無窮多個,這有點象不存在反函數(shù)的數(shù)學函數(shù)。所以,要遇到了md5密碼的問題,比較好的辦法是:你可以用這個系統(tǒng)中的md5()函數(shù)重新設一個密碼,如admin,把生成的一串密碼的Hash值覆蓋原來的Hash值就行了。 正是因為這個原因,現(xiàn)在被黑客使用最多的一種破譯密碼的方法就是一種被稱為"跑字典"的方法。有兩種方法得到字典,一種是日常搜集的用做密碼的字符串表,另一種是用排列組合方法生成的,先用MD5程序計算出這些字典項的MD5值,然后再用目標的MD5值在這個字典中檢索。我們假設密碼的最大長度為8位字節(jié)(8 Bytes),同時密碼只能是字母和數(shù)字,共26+26+10=62個字符,排列組合出的字典的項數(shù)則是P(62,1)+P(62,2)….+P(62,8),那也已經是一個很天文的數(shù)字了,存儲這個字典就需要TB級的磁盤陣列,而且這種方法還有一個前提,就是能獲得目標賬戶的密碼MD5值的情況下才可以。這種加密技術被廣泛的應用于UNIX系統(tǒng)中,這也是為什么UNIX系統(tǒng)比一般操作系統(tǒng)更為堅固一個重要原因。 算法描述 對MD5算法簡要的敘述可以為:MD5以512位分組來處理輸入的信息,且每一分組又被劃分為16個32位子分組,經過了一系列的處理后,算法的輸出由四個32位分組組成,將這四個32位分組級聯(lián)后將生成一個128位散列值。 在MD5算法中,首先需要對信息進行填充,使其字節(jié)長度對512求余的結果等于448。因此,信息的字節(jié)長度(Bits Length)將被擴展至N*512+448,即N*64+56個字節(jié)(Bytes),N為一個正整數(shù)。填充的方法如下,在信息的后面填充一個1和無數(shù)個0,直到滿足上面的條件時才停止用0對信息的填充。然后,在在這個結果后面附加一個以64位二進制表示的填充前信息長度。經過這兩步的處理,現(xiàn)在的信息字節(jié)長度=N*512+448+64=(N+1)*512,即長度恰好是512的整數(shù)倍。這樣做的原因是為滿足后面處理中對信息長度的要求。 MD5中有四個32位被稱作鏈接變量(Chaining Variable)的整數(shù)參數(shù),他們分別為:A=0x01234567,B=0x89abcdef,C=0xfedcba98,D=0x76543210。 當設置好這四個鏈接變量后,就開始進入算法的四輪循環(huán)運算。循環(huán)的次數(shù)是信息中512位信息分組的數(shù)目。 將上面四個鏈接變量復制到另外四個變量中:A到a,B到b,C到c,D到d。 主循環(huán)有四輪(MD4只有三輪),每輪循環(huán)都很相似。第一輪進行16次操作。每次操作對a、b、c和d中的其中三個作一次非線性函數(shù)運算,然后將所得結果加上第四個變量,文本的一個子分組和一個常數(shù)。再將所得結果向右環(huán)移一個不定的數(shù),并加上a、b、c或d中之一。最后用該結果取代a、b、c或d中之一。 以一下是每次操作中用到的四個非線性函數(shù)(每輪一個)。 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)) (&是與,|是或,~是非,^是異或) 這四個函數(shù)的說明:如果X、Y和Z的對應位是獨立和均勻的,那么結果的每一位也應是獨立和均勻的。 F是一個逐位運算的函數(shù)。即,如果X,那么Y,否則Z。函數(shù)H是逐位奇偶操作符。 具體的一個MD5實現(xiàn)=============================頭文件Security.h=============================================== /* 使用方法: char Md5Buffer[33]; CSecurity Security; Security.MD5("a string",Md5Buffer); 執(zhí)行完成之后Md5Buffer中即存儲了由"a string"計算得到的MD5值 */ // 下列 ifdef 塊是創(chuàng)建使從 DLL 導出更簡單的 // 宏的標準方法。此 DLL 中的所有文件都是用命令行上定義的 SECURITY_EXPORTS // 符號編譯的。在使用此 DLL 的 // 任何其他項目上不應定義此符號。這樣,源文件中包含此文件的任何其他項目都會將 // SECURITY_API 函數(shù)視為是從此 DLL 導入的,而此 DLL 則將用此宏定義的 // 符號視為是被導出的。 //在使用該類的地方包含本文件即可 #ifdef SECURITY_EXPORTS #define SECURITY_API __declspec(dllexport) #else #define SECURITY_API __declspec(dllimport) #endif /* POINTER defines a generic pointer type */ typedef unsigned char *POINTER; /* UINT2 defines a two byte word */ typedef unsigned short int UINT2; /* UINT4 defines a four byte word */ typedef unsigned long int UINT4; #define PROTO_LIST(list) list /* MD5 context. */ typedef struct _MD5_CTX { UINT4 state[4]; /* state (ABCD) */ UINT4 count[2]; /* number of bits, modulo 2^64 (lsb first) */ unsigned char buffer[64]; /* input buffer */ } MD5_CTX; static unsigned char PADDING[64]= { 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; /* Constants for MD5Transform routine. */ #define S11 7 #define S12 12 #define S13 17 #define S14 22 #define S21 5 #define S22 9 #define S23 14 #define S24 20 #define S31 4 #define S32 11 #define S33 16 #define S34 23 #define S41 6 #define S42 10 #define S43 15 #define S44 21 /* F, G, H and I are basic MD5 functions. */ #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))) /* ROTATE_LEFT rotates x left n bits. */ #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n)))) /* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4. Rotation is separate from addition to prevent recomputation. */ #define FF(a, b, c, d, x, s, ac) { (a) += F ((b), (c), (d)) + (x) + (UINT4)(ac);(a) = ROTATE_LEFT ((a), (s)); (a) += (b); } #define GG(a, b, c, d, x, s, ac) { (a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); (a) = ROTATE_LEFT ((a), (s)); (a) += (b); } #define HH(a, b, c, d, x, s, ac) { (a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); (a) = ROTATE_LEFT ((a), (s)); (a) += (b); } #define II(a, b, c, d, x, s, ac) { (a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); (a) = ROTATE_LEFT ((a), (s)); (a) += (b); } #define TEST_BLOCK_LEN 1000 #define TEST_BLOCK_COUNT 1000 // 此類是從 Security.dll 導出的 class SECURITY_API CSecurity { public: CSecurity(void); void CSecurity::MD5( const char *string ,char *lpMD5StringBuffer ) ; private: void MD5Transform PROTO_LIST ((UINT4 [4], unsigned char [64])); void MD5_memcpy PROTO_LIST ((POINTER, POINTER, size_t)); void MD5_memset PROTO_LIST ((POINTER, int, size_t)); void MD5Init PROTO_LIST ((MD5_CTX *)); void MD5Update PROTO_LIST ((MD5_CTX *, unsigned char *, size_t)); void MD5Final PROTO_LIST ((unsigned char [16], MD5_CTX *)); void MDTimeTrial PROTO_LIST ((void)); void StringAddOne PROTO_LIST ((char *)); void Encode PROTO_LIST ((unsigned char *, UINT4 *, size_t)); void Decode PROTO_LIST ((UINT4 *, unsigned char *, size_t)); }; ===============================Security.cpp==================================================== // Security.cpp : 定義 DLL 應用程序的入口點。 // #include "stdafx.h" #include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> #include<ctype.h> #include "Security.h" BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } // 這是已導出類的構造函數(shù)。 // 有關類定義的信息,請參閱 Security.h CSecurity::CSecurity() { return; } /* MD5 initialization. Begins an MD5 operation, writing a new context. */ void CSecurity::MD5Init( MD5_CTX *context ) { context->count[0] = context->count[1] = 0; /* Load magic initialization constants. */ context->state[0] = 0x67452301; context->state[1] = 0xefcdab89; context->state[2] = 0x98badcfe; context->state[3] = 0x10325476; } /* MD5 block update operation. Continues an MD5 message-digest operation, processing another message block, and updating the context. */ void CSecurity::MD5Update( MD5_CTX *context, /* context */ unsigned char *input, /* input block */ size_t inputLen /* length of input block */ ) { size_t i, index, partLen; /* Compute number of bytes mod 64 */ index = (size_t)((context->count[0] >> 3) & 0x3F); /* Update number of bits */ if ((context->count[0] += ((UINT4)inputLen << 3)) < ((UINT4)inputLen << 3)) context->count[1]++; context->count[1] += ((UINT4)inputLen >> 29); partLen = 64 - index; /* Transform as many times as possible. */ if (inputLen >= partLen) { MD5_memcpy ((POINTER)&context->buffer[index], (POINTER)input, partLen); MD5Transform (context->state, context->buffer); for (i = partLen; i + 63 < inputLen; i += 64) MD5Transform (context->state, &input); index = 0; } else i = 0; /* Buffer remaining input */ MD5_memcpy ((POINTER)&context->buffer[index], (POINTER)&input, inputLen-i); } /* MD5 finalization. Ends an MD5 message-digest operation, writing the the message digest and zeroizing the context. */ void CSecurity::MD5Final( unsigned char digest[16], /* message digest */ MD5_CTX *context /* context */ ) { unsigned char bits[8]; size_t index, padLen; /* Save number of bits */ Encode (bits, context->count, 8); /* Pad out to 56 mod 64. */ index = (size_t)((context->count[0] >> 3) & 0x3f); padLen = (index < 56) ? (56 - index) : (120 - index); MD5Update (context, PADDING, padLen); /* Append length (before padding) */ MD5Update (context, bits, 8); /* Store state in digest */ Encode (digest, context->state, 16); /* Zeroize sensitive information. */ MD5_memset ((POINTER)context, 0, sizeof (*context)); } /* MD5 basic transformation. Transforms state based on block. */ void CSecurity::MD5Transform( UINT4 state[4], unsigned char block[64] ) { UINT4 a = state[0], b = state[1], c = state[2], d = state[3], x[16]; Decode (x, block, 64); /* Round 1 */ FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */ FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */ FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */ FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */ FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */ FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */ FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */ FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */ FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */ FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */ FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */ FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */ FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */ FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */ FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */ FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */ /* Round 2 */ GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */ GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */ GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */ GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */ GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */ GG (d, a, b, c, x[10], S22, 0x2441453); /* 22 */ GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */ GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */ GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */ GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */ GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */ GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */ GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */ GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */ GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */ GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */ /* Round 3 */ HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */ HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */ HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */ HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */ HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */ HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */ HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */ HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */ HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */ HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */ HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */ HH (b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */ HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */ HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */ HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */ HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */ /* Round 4 */ II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */ II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */ II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */ II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */ II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */ II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */ II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */ II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */ II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */ II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */ II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */ II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */ II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */ II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */ II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */ II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */ state[0] += a; state[1] += b; state[2] += c; state[3] += d; /* Zeroize sensitive information. */ MD5_memset ((POINTER)x, 0, sizeof (x)); } /* Encodes input (UINT4) into output (unsigned char). Assumes len is a multiple of 4. */ void CSecurity::Encode( unsigned char *output, UINT4 *input, size_t len ) { size_t i, j; for (i = 0, j = 0; j < len; i++, j += 4) { output[j] = (unsigned char)(input & 0xff); output[j+1] = (unsigned char)((input >> 8) & 0xff); output[j+2] = (unsigned char)((input >> 16) & 0xff); output[j+3] = (unsigned char)((input >> 24) & 0xff); } } /* Decodes input (unsigned char) into output (UINT4). Assumes len is a multiple of 4. */ void CSecurity::Decode( UINT4 *output, unsigned char *input, size_t len ) { size_t i, j; for (i = 0, j = 0; j < len; i++, j += 4) output = ((UINT4)input[j]) | (((UINT4)input[j+1]) << 8) | (((UINT4)input[j+2]) << 16) | (((UINT4)input[j+3]) << 24); } /* Note: Replace "for loop" with standard memcpy if possible. */ void CSecurity::MD5_memcpy( POINTER output, POINTER input, size_t len ) { size_t i; for (i = 0; i < len; i++) output = input; } /* Note: Replace "for loop" with standard memset if possible. */ void CSecurity::MD5_memset( POINTER output, int value, size_t len ) { size_t i; for (i = 0; i < len; i++) ((char *)output) = (char)value; } /* Digests a string and prints the result. */ void CSecurity::MD5( const char *string ,char *lpMD5StringBuffer ) { MD5_CTX context; unsigned char digest[16]; /*char output1[33]; */ static char output[33]={""}; /*size_t*/size_t len = strlen (string); int i; MD5Init( &context); MD5Update( &context, (unsigned char*)string, len ); MD5Final( digest, &context ); for (i = 0; i < 16; i++) { sprintf(&(lpMD5StringBuffer[2*i]),"%02x",(unsigned char)digest); sprintf(&(lpMD5StringBuffer[2*i+1]),"%02x",(unsigned char)(digest<<4)); } for(i=0;i<32;i++) { output=lpMD5StringBuffer; } } /* get the string add one. */ void CSecurity::StringAddOne( char * orstring ) { size_t len; size_t i,n; len = strlen(orstring); n = len - 1; for(i = n; i >= 0; i--) { if(orstring==&#39;&#39;9&#39;&#39;) { orstring = &#39;&#39;A&#39;&#39;; break; } else if(orstring==&#39;&#39;Z&#39;&#39;) { orstring=&#39;&#39;a&#39;&#39;; break; } else if(orstring==&#39;&#39;z&#39;&#39;) { orstring=&#39;&#39;0&#39;&#39;; continue; } else orstring += 1; break; } } =============================stdafx.h===================================== // stdafx.h : 標準系統(tǒng)包含文件的包含文件, // 或是常用但不常更改的項目特定的包含文件 // #pragma once //導出 #define SECURITY_EXPORTS #define WIN32_LEAN_AND_MEAN // 從 Windows 頭中排除極少使用的資料 // Windows 頭文件: #include <windows.h> // TODO: 在此處引用程序要求的附加頭文件 ============================stdafx.cpp======================================== // stdafx.cpp : 只包括標準包含文件的源文件 // Security.pch 將成為預編譯頭 // stdafx.obj 將包含預編譯類型信息 #include "stdafx.h" // TODO: 在 STDAFX.H 中 //引用任何所需的附加頭文件,而不是在此文件中引用 ===================================================================== 以上程序使用命令:@cl /GD /LD Security.cpp stdafx.cpp 編譯即可 一些破解MD5的網站[onclick="userLogin(&#39;&#39;http://baike.baidu.com/edit/id=7636&dl=5&#39;&#39;);return false;">編輯本段]http://www.md5.com.cn (一億以上數(shù)據(jù)) http://www.cmd5.com http://www.xmd5.com 和http://www.xmd5.org 是一個網站(這三個網站都是國人做的)。 http://md5.mmkey.com http://www.md5lookup.com/ (對數(shù)字破解比較好) http://md5.rednoize.com (對字母破解比較好) http://nz.md5.crysm.net (從1到4位數(shù)字)- 好像關了 http://us.md5.crysm.net (美英字典的破解收集和IP地址) http://gdataonline.com (估計是基礎字典的破解) http://www.hashchecker.com (這個倒是說得很厲害,但是在實際中,很多次我在這里都找不到) http://passcracking.ru http://www.milw0rm.com/md5 http://plain-text.info (這個是我比較喜歡一個.也請你提交一些已破解的MD5) http://www.securitystats.com/tools/hashcrack.php (多種破解.我試過...沒有一次破解出來.非常沒用) http://www.schwett.com/md5/ - (破解挪威人(Norwegian)字典) http://passcrack.spb.ru/ http://shm.pl/md5/ http://www.und0it.com/ http://www.neeao.com/md5/ http://md5.benramsey.com/ http://www.md5decrypt.com/ http://md5.khrone.pl/ http://www.csthis.com/md5/index.php http://www.md5decrypter.com/ http://www.md5encryption.com/ http://www.md5database.net/ http://md5.xpzone.de/ http://md5.geeks.li/ http://www.hashreverse.com/ http://www.cmd5.com/english.aspx http://www.md5.altervista.org/ http://md5.overclock.ch/biz/index.php?p=md5crack&l=en http://alimamed.pp.ru/md5/ (如果你看不懂俄文,我告訴你,把你的MD5放到第2個格子) http://md5crack.it-helpnet.de/index.php?op=add (德國的....) http://cijfer.hua.fi/ (Projects->md5 reverse lookup) http://shm.hard-core.pl/md5/ http://www.thepanicroom.org/index.php?view=cracker http://rainbowtables.net/services/results.php (我試過破過幾次在這里) http://rainbowcrack.com/ (需要捐獻) http://www.securitydb.org/cracker/ http://passwordsecuritycenter.com/index.php?main_page=product_info&cPath=3&products_id=7 這個是證明他們的破解商品的質量..好讓你來買這個破解程序...但是...只要能破解到即可.你又不一定要買.. http://0ptix.co.nr/md5 lm: http://sys9five.ath.cx:8080/hak5rtables/ http://lasecwww.epfl.ch/~oechslin/projects/ophcrack/ lm + ntlm: http://plain-text.info http://www.securitystats.com/tools/hashcrack.php http://rainbowtables.net/services/results.php http://rainbowcrack.com/ http://passwordsecuritycenter.com/index.php?main_page=product_info&cPath=3&products_id=7 md4: http://www.securitystats.com/tools/hashcrack.php http://rainbowtables.net/services/results.php http://rainbowcrack.com/ sha1: http://www.securitystats.com/tools/hashcrack.php http://passcrack.spb.ru/ http://www.hashreverse.com/ http://rainbowtables.net/services/results.php http://rainbowcrack.com/ http://www.md5encryption.com/ http://passcracking.ru http://www.shalookup.com/ 密碼學領域重大發(fā)現(xiàn): 山東大學王小云教授成功破解MD5 2004年8月17日的美國加州圣巴巴拉,正在召開的國際密碼學會議(Crypto’2004)安排了三場關于雜湊函數(shù)的特別報告。在國際著名密碼學家Eli Biham和Antoine Joux相繼做了對SHA-1的分析與給出SHA-0的一個碰撞之后,來自山東大學的王小云教授做了破譯MD5、HAVAL-128、 MD4和RIPEMD算法的報告。在會場上,當她公布了MD系列算法的破解結果之后,報告被激動的掌聲打斷。王小云教授的報告轟動了全場,得到了與會專家的贊嘆。報告結束時,與會者長時間熱烈鼓掌,部分學者起立鼓掌致敬,這在密碼學會議上是少見的盛況。王小云教授的報告緣何引起如此大的反響?因為她的研究成果作為密碼學領域的重大發(fā)現(xiàn)宣告了固若金湯的世界通行密碼標準MD5的堡壘轟然倒塌,引發(fā)了密碼學界的軒然大波。會議總結報告這樣寫道:“我們該怎么辦?MD5被重創(chuàng)了;它即將從應用中淘汰。SHA-1仍然活著,但也見到了它的末日。現(xiàn)在就得開始更換SHA-1了。” 關鍵詞:碰撞=漏洞=別人可以偽造和冒用數(shù)字簽名。 Hash函數(shù)與數(shù)字簽名(數(shù)字手。 HASH函數(shù),又稱雜湊函數(shù),是在信息安全領域有廣泛和重要應用的密碼算法,它有一種類似于指紋的應用。在網絡安全協(xié)議中,雜湊函數(shù)用來處理電子簽名,將冗長的簽名文件壓縮為一段獨特的數(shù)字信息,像指紋鑒別身份一樣保證原來數(shù)字簽名文件的合法性和安全性。在前面提到的SHA-1和MD5都是目前最常用的雜湊函數(shù)。經過這些算法的處理,原始信息即使只更動一個字母,對應的壓縮信息也會變?yōu)榻厝徊煌摹爸讣y”,這就保證了經過處理信息的唯一性。為電子商務等提供了數(shù)字認證的可能性。 安全的雜湊函數(shù)在設計時必須滿足兩個要求:其一是尋找兩個輸入得到相同的輸出值在計算上是不可行的,這就是我們通常所說的抗碰撞的;其二是找一個輸入,能得到給定的輸出在計算上是不可行的,即不可從結果推導出它的初始狀態(tài),F(xiàn)在使用的重要計算機安全協(xié)議,如SSL,PGP都用雜湊函數(shù)來進行簽名,一旦找到兩個文件可以產生相同的壓縮值,就可以偽造簽名,給網絡安全領域帶來巨大隱患。 MD5就是這樣一個在國內外有著廣泛的應用的雜湊函數(shù)算法,它曾一度被認為是非常安全的。然而,王小云教授發(fā)現(xiàn),可以很快的找到MD5的“碰撞”,就是兩個文件可以產生相同的“指紋”。這意味著,當你在網絡上使用電子簽名簽署一份合同后,還可能找到另外一份具有相同簽名但內容迥異的合同,這樣兩份合同的真?zhèn)涡员銦o從辨別。王小云教授的研究成果證實了利用MD5算法的碰撞可以嚴重威脅信息系統(tǒng)安全,這一發(fā)現(xiàn)使目前電子簽名的法律效力和技術體系受到挑戰(zhàn)。因此,業(yè)界專家普林斯頓計算機教授Edward Felten等強烈呼吁信息系統(tǒng)的設計者盡快更換簽名算法,而且他們強調這是一個需要立即解決的問題。 國際講壇 王氏發(fā)現(xiàn)艷驚四座 面對Hash函數(shù)領域取得的重大研究進展,Crypto 2004 會議總主席StorageTek高級研究員Jim Hughes 17 日早晨表示,此消息太重要了,因此他已籌辦該會成立24年來的首次網絡廣播(Webcast )。Hughes在會議上宣布:“會中將提出三份探討雜湊碰撞(hash collisions )重要的研究報告。”其中一份是王小云等幾位中國研究人員的研究發(fā)現(xiàn)。17日晚,王小云教授在會上把他們的研究成果做了宣讀。這篇由王小云、馮登國、來學嘉、于紅波四人共同完成的文章,囊括了對MD5、HAVAL-128、 MD4和RIPEMD四個著名HASH算法的破譯結果。在王小云教授僅公布到他們的第三個驚人成果的時候,會場上已經是掌聲四起,報告不得不一度中斷。報告結束后,所有與會專家對他們的突出工作報以長時的熱烈掌聲,有些學者甚至起立鼓掌以示他們的祝賀和敬佩。當人們掌聲漸息,來學嘉教授又對文章進行了一點頗有趣味的補充說明。由于版本問題,作者在提交會議論文時使用的一組常數(shù)和先行標準不同;在會議發(fā)現(xiàn)這一問題之后,王小云教授立即改變了那個常數(shù),在很短的時間內就完成了新的數(shù)據(jù)分析,這段有驚無險的小插曲倒更加證明了他們論文的信服力,攻擊方法的有效性,反而凸顯了研究工作的成功。 會議結束時,很多專家圍攏到王小云教授身邊,既有簡短的探討,又有由衷的祝賀,褒譽之詞不絕。包含公鑰密碼的主要創(chuàng)始人R. L. Rivest和A. Shamir在內的世界頂級的密碼學專家也上前表示他們的欣喜和祝賀。 國際密碼學專家對王小云教授等人的論文給予高度評價。 MD5的設計者,同時也是國際著名的公鑰加密算法標準RSA的第一設計者R.Rivest在郵件中寫道:“這些結果無疑給人非常深刻的印象,她應當?shù)玫轿易顭崃业淖YR,當然,我并不希望看到MD5就這樣倒下,但人必須尊崇真理! Francois Grieu這樣說:“王小云、馮登國、來學嘉和于紅波的最新成果表明他們已經成功破譯了MD4、MD5、HAVAL-128、RIPEMD-128。并且有望以更低的復雜度完成對SHA-0的攻擊。一些初步的問題已經解決。他們贏得了非常熱烈的掌聲! 另一位專家Greg Rose如此評價:“我剛剛聽了Joux和王小云的報告,王所使用的技術能在任何初始值下用2^40次hash運算找出SHA-0的碰撞。她在報告中對四種HASH函數(shù)都給出了碰撞,她贏得了長時間的起立喝彩,(這在我印象中還是第一次)! 她是當今密碼學界的巾幗英雄!ㄍ跣≡平淌诘墓ぷ鳎┘夹g雖然沒有公開,但結果是無庸質疑的,這種技術確實存在! 我坐在Ron Rivest前面,我聽到他評論道:‘我們不得不做很多的重新思考了。’” 石破天驚 MD5堡壘轟然倒塌 一石擊起千層浪,MD5的破譯引起了密碼學界的激烈反響。專家稱這是密碼學界近年來“最具實質性的研究進展”,各個密碼學相關網站競相報導這一驚人突破。 MD5破解專項網站關閉 MD5破解工程權威網站http://www.md5crk.com/是為了公開征集專門針對MD5的攻擊而設立的,網站于2004年8月17日宣布:“中國研究人員發(fā)現(xiàn)了完整MD5算法的碰撞;Wang, Feng, Lai與Yu公布了MD5、MD4、HAVAL-128、RIPEMD-128幾個 Hash函數(shù)的碰撞。這是近年來密碼學領域最具實質性的研究進展。使用他們的技術,在數(shù)個小時內就可以找到MD5碰撞!捎谶@個里程碑式的發(fā)現(xiàn),MD5CRK項目將在隨后48小時內結束”。 對此, Readyresponse主頁專門轉載了該報道,幾個其它網站也進行了報道。 權威網站相繼發(fā)表評論或者報告這一重大研究成果 經過統(tǒng)計,在論文發(fā)布兩周之內,已經有近400個網站發(fā)布、引用和評論了這一成果。國內的許多新聞網站也以“演算法安全加密功能露出破綻 密碼學界一片嘩然”為題報道了這一密碼學界的重大事件,該消息在各新聞網站上多次轉載。 東方神韻 MD5終結者來自中國 MD5破解工作的主要成員王小云教授是一個瘦弱、矜持的女子,厚厚的鏡片透射出雙眸中數(shù)學的靈光。她于1990年在山東大學師從著名數(shù)學家潘承洞教授攻讀數(shù)論與密碼學專業(yè)博士,在潘先生、于秀源、展?jié)榷辔恢淌诘南ば闹笇,她成功將?shù)論知識應用到密碼學中,取得了很多突出成果,先后獲得863項目資助和國家自然科學基金項目資助,并且獲得部級科技進步獎一項,撰寫論文二十多篇。王小云教授從上世紀90年代末開始進行HASH函數(shù)的研究,她所帶領的于紅波、王美琴、孫秋梅、馮騏等組成的密碼研究小組,同中科院馮登國教授,上海交大來學嘉等知名學者密切協(xié)作,經過長期堅持不懈的努力,找到了破解HASH函數(shù)的關鍵技術,成功的破解了MD5和其它幾個HASH函數(shù)。 近年來她的工作得到了山東大學和數(shù)學院領導的大力支持,特別投資建設了信息安全實驗室。山東大學校長展?jié)淌诟叨戎匾曂跣≡平淌谕怀龅目蒲谐晒?2004年6月山東大學領導聽取王小云教授的工作介紹后,展?jié)iL親自簽發(fā)邀請函邀請國內知名信息安全專家參加2004年7月在威海舉辦的“山東大學信息安全研究學術研討會”,數(shù)學院院長劉建亞教授組織和主持了會議,會上王小云教授公布了MD5等算法的一系列研究成果,專家們對她的研究成果給予了充分的肯定,對其堅持不懈的科研態(tài)度大加贊揚。一位院士說,她的研究水平絕對不比國際上的差。這位院士的結論在時隔一個月之后的國際密碼會上得到了驗證,國外專家如此強烈的反響表明,我們的工作可以說不但不比國際上的差,而且是在破解HASH函數(shù)方面已領先一步。加拿大CertainKey公司早前宣布將給予發(fā)現(xiàn) MD5算法第一個碰撞人員一定的獎勵,CertainKey的初衷是利用并行計算機通過生日攻擊來尋找碰撞,而王小云教授等的攻擊相對生日攻擊需要更少的計算時間。 數(shù)字認證 你的未來不是夢 由于MD5的破譯,引發(fā)了關于MD5 產品是否還能夠使用的大辯論。在麻省理工大學Jeffrey I. Schiller教授主持的個人論壇上,許多密碼學家在標題為“Bad day at the hash function factory”的辯論中發(fā)表了具有價值的意見。這次國際密碼學會議的總主席Jimes Hughes發(fā)表評論說“我相信這(破解MD5)是真的,并且如果碰撞存在,HMAC也就不再是安全的了,…… 我認為我們應該拋開MD5了。” Hughes建議,程序設計人員最好開始舍棄MD5。他說:“既然現(xiàn)在這種算法的弱點已暴露出來,在有效的攻擊發(fā)動之前,現(xiàn)在是撤離的時機。” 同樣,在普林斯頓大學教授Edwards Felton的個人網站上,也有類似的評論。他說:“留給我們的是什么呢?MD5已經受了重傷;它的應用就要淘汰。SHA-1仍然活著,但也不會很長,必須立即更換SHA-1,但是選用什么樣的算法,這需要在密碼研究人員達到共識。” 密碼學家Markku-Juhani稱“這是HASH函數(shù)分析領域激動人心的時刻! 而著名計算機公司SUN的LINUX專家Val Henson則說:“以前我們說"SHA-1可以放心用,其他的不是不安全就是未知", 現(xiàn)在我們只能這么總結了:"SHA-1不安全,其他的都完了"。 針對王小云教授等破譯的以MD5為代表的Hash函數(shù)算法的報告,美國國家技術與標準局(NIST)于2004年8月24日發(fā)表專門評論,評論的主要內容為:“在最近的國際密碼學會議(Crypto 2004)上,研究人員宣布他們發(fā)現(xiàn)了破解數(shù)種HASH算法的方法,其中包括MD4,MD5,HAVAL-128,RIPEMD還有 SHA-0。分析表明,于1994年替代SHA-0成為聯(lián)邦信息處理標準的SHA-1的減弱條件的變種算法能夠被破解;但完整的SHA-1并沒有被破解,也沒有找到SHA-1的碰撞。研究結果說明SHA-1的安全性暫時沒有問題,但隨著技術的發(fā)展,技術與標準局計劃在2010年之前逐步淘汰SHA-1,換用其他更長更安全的算法(如SHA-224、SHA-256、SHA-384和SHA-512)來替代。” 2004年8月28日,十屆全國人大常委會第十一次會議表決通過了電子簽名法。這部法律規(guī)定,可靠的電子簽名與手寫簽名或者蓋章具有同等的法律效力。電子簽名法的通過,標志著我國首部“真正意義上的信息化法律”已正式誕生,將于2005年4月1日起施行。專家認為,這部法律將對我國電子商務、電子政務的發(fā)展起到極其重要的促進作用。王小云教授的發(fā)現(xiàn)無異于發(fā)現(xiàn)了信息化天空的一個驚人黑洞。我們期待著王小云教授和她的團隊能夠成就“女媧補天”的壯舉,為人類的信息化之路保駕護航。
移動通信網 | 通信人才網 | 更新日志 | 團隊博客 | 免責聲明 | 關于詞典 | 幫助