百科解釋
目錄·MD5簡介·算法的應(yīng)用·算法描述·具體的一個(gè)MD5實(shí)現(xiàn)·一些破解MD5的網(wǎng)站 MD5簡介MD5的全稱是Message-digest Algorithm 5(信息-摘要算法),在90年代初由MIT Laboratory for Computer Science和RSA Data Security Inc,的Ronald.L.Rivest開發(fā)出來,經(jīng)MD2、MD3和MD4發(fā)展而來。它的作用是讓大容量信息在用數(shù)字簽名軟件簽署私人密鑰前被"壓縮"成一種保密的格式(就是把一個(gè)任意長度的字節(jié)串變換成一定長的大整數(shù))。不管是MD2、MD4還是MD5,它們都需要獲得一個(gè)隨機(jī)長度的信息并產(chǎn)生一個(gè)128位的信息摘要。雖然這些算法的結(jié)構(gòu)或多或少有些相似,但MD2的設(shè)計(jì)與MD4和MD5完全不同,那是因?yàn)镸D2是為8位機(jī)器做過設(shè)計(jì)優(yōu)化的,而MD4和MD5卻是面向32位的電腦。這三個(gè)算法的描述和c語言源代碼在Internet RFC 1321中有詳細(xì)的描述(http://www.ietf.org/rfc/rfc1321.txt),這是一份最權(quán)威的文檔,由Ronald.L.Rivest在1992年8月向IETF提交。 Rivest在1989年開發(fā)出MD2算法。在這個(gè)算法中,首先對(duì)信息進(jìn)行數(shù)據(jù)補(bǔ)位,使信息的字節(jié)長度是16的倍數(shù)。然后,以一個(gè)16位的檢驗(yàn)和追加到信息末尾。并且根據(jù)這個(gè)新產(chǎn)生的信息計(jì)算出散列值。后來,Rogier和Chauvaud發(fā)現(xiàn)如果忽略了檢驗(yàn)和將產(chǎn)生MD2沖突。MD2算法的加密后結(jié)果是唯一的--即沒有重復(fù)。 為了加強(qiáng)算法的安全性,Rivest在1990年又開發(fā)出MD4算法。MD4算法同樣需要填補(bǔ)信息以確保信息的字節(jié)長度加上448后能被512整除(信息字節(jié)長度mod 512 = 448)。然后,一個(gè)以64位二進(jìn)制表示的信息的最初長度被添加進(jìn)來。信息被處理成512位damg?rd/merkle迭代結(jié)構(gòu)的區(qū)塊,而且每個(gè)區(qū)塊要通過三個(gè)不同步驟的處理。Den boer和Bosselaers以及其他人很快的發(fā)現(xiàn)了攻擊MD4版本中第一步和第三步的漏洞。Dobbertin向大家演示了如何利用一部普通的個(gè)人電腦在幾分鐘內(nèi)找到MD4完整版本中的沖突(這個(gè)沖突實(shí)際上是一種漏洞,它將導(dǎo)致對(duì)不同的內(nèi)容進(jìn)行加密卻可能得到相同的加密后結(jié)果)。毫無疑問,MD4就此被淘汰掉了。 盡管MD4算法在安全上有個(gè)這么大的漏洞,但它對(duì)在其后才被開發(fā)出來的好幾種信息安全加密算法的出現(xiàn)卻有著不可忽視的引導(dǎo)作用。除了MD5以外,其中比較有名的還有sha-1、RIPEMD以及Haval等。 一年以后,即1991年,Rivest開發(fā)出技術(shù)上更為趨近成熟的md5算法。它在MD4的基礎(chǔ)上增加了"安全-帶子"(safety-belts)的概念。雖然MD5比MD4稍微慢一些,但卻更為安全。這個(gè)算法很明顯的由四個(gè)和MD4設(shè)計(jì)有少許不同的步驟組成。在MD5算法中,信息-摘要的大小和填充的必要條件與MD5完全相同。Den boer和Bosselaers曾發(fā)現(xiàn)MD5算法中的假?zèng)_突(pseudo-collisions),但除此之外就沒有其他被發(fā)現(xiàn)的加密后結(jié)果了。 Van oorschot和Wiener曾經(jīng)考慮過一個(gè)在散列中暴力搜尋沖突的函數(shù)(brute-force hash function),而且他們猜測一個(gè)被設(shè)計(jì)專門用來搜索MD5沖突的機(jī)器(這臺(tái)機(jī)器在1994年的制造成本大約是一百萬美元)可以平均每24天就找到一個(gè)沖突。但單從1991年到2001年這10年間,竟沒有出現(xiàn)替代MD5算法的MD6或被叫做其他什么名字的新算法這一點(diǎn),我們就可以看出這個(gè)瑕疵并沒有太多的影響MD5的安全性。上面所有這些都不足以成為MD5的在實(shí)際應(yīng)用中的問題。并且,由于MD5算法的使用不需要支付任何版權(quán)費(fèi)用的,所以在一般的情況下(非絕密應(yīng)用領(lǐng)域。但即便是應(yīng)用在絕密領(lǐng)域內(nèi),MD5也不失為一種非常優(yōu)秀的中間技術(shù)),MD5怎么都應(yīng)該算得上是非常安全的了。 2004年8月17日的美國加州圣巴巴拉的國際密碼學(xué)會(huì)議(Crypto’2004)上,來自中國山東大學(xué)的王小云教授做了破譯MD5、HAVAL-128、 MD4和RIPEMD算法的報(bào)告,公布了MD系列算法的破解結(jié)果。宣告了固若金湯的世界通行密碼標(biāo)準(zhǔn)MD5的堡壘轟然倒塌,引發(fā)了密碼學(xué)界的軒然大波。 MD5破解工程權(quán)威網(wǎng)站http://www.md5crk.com/ 是為了公開征集專門針對(duì)MD5的攻擊而設(shè)立的,網(wǎng)站于2004年8月17日宣布:“中國研究人員發(fā)現(xiàn)了完整MD5算法的碰撞;Wang, Feng, Lai與Yu公布了MD5、MD4、HAVAL-128、RIPEMD-128幾個(gè) Hash函數(shù)的碰撞。這是近年來密碼學(xué)領(lǐng)域最具實(shí)質(zhì)性的研究進(jìn)展。使用他們的技術(shù),在數(shù)個(gè)小時(shí)內(nèi)就可以找到MD5碰撞。……由于這個(gè)里程碑式的發(fā)現(xiàn),MD5CRK項(xiàng)目將在隨后48小時(shí)內(nèi)結(jié)束”。 MD5用的是哈希函數(shù),在計(jì)算機(jī)網(wǎng)絡(luò)中應(yīng)用較多的不可逆加密算法有RSA公司發(fā)明的MD5算法和由美國國家技術(shù)標(biāo)準(zhǔn)研究所建議的安全散列算法SHA. 算法的應(yīng)用 MD5的典型應(yīng)用是對(duì)一段信息(Message)產(chǎn)生信息摘要(Message-Digest),以防止被篡改。比如,在UNIX下有很多軟件在下載的時(shí)候都有一個(gè)文件名相同,文件擴(kuò)展名為.md5的文件,在這個(gè)文件中通常只有一行文本,大致結(jié)構(gòu)如: MD5 (tanajiya.tar.gz) = 0ca175b9c0f726a831d895e269332461 這就是tanajiya.tar.gz文件的數(shù)字簽名。MD5將整個(gè)文件當(dāng)作一個(gè)大文本信息,通過其不可逆的字符串變換算法,產(chǎn)生了這個(gè)唯一的MD5信息摘要。為了讓讀者朋友對(duì)MD5的應(yīng)用有個(gè)直觀的認(rèn)識(shí),筆者以一個(gè)比方和一個(gè)實(shí)例來簡要描述一下其工作過程: 大家都知道,地球上任何人都有自己獨(dú)一無二的指紋,這常常成為公安機(jī)關(guān)鑒別罪犯身份最值得信賴的方法;與之類似,MD5就可以為任何文件(不管其大小、格式、數(shù)量)產(chǎn)生一個(gè)同樣獨(dú)一無二的“數(shù)字指紋”,如果任何人對(duì)文件做了任何改動(dòng),其MD5值也就是對(duì)應(yīng)的“數(shù)字指紋”都會(huì)發(fā)生變化。 我們常常在某些軟件下載站點(diǎn)的某軟件信息中看到其MD5值,它的作用就在于我們可以在下載該軟件后,對(duì)下載回來的文件用專門的軟件(如Windows MD5 Check等)做一次MD5校驗(yàn),以確保我們獲得的文件與該站點(diǎn)提供的文件為同一文件。利用MD5算法來進(jìn)行文件校驗(yàn)的方案被大量應(yīng)用到軟件下載站、論壇數(shù)據(jù)庫、系統(tǒng)文件安全等方面。 MD5的典型應(yīng)用是對(duì)一段Message(字節(jié)串)產(chǎn)生fingerprint(指紋),以防止被“篡改”。舉個(gè)例子,你將一段話寫在一個(gè)叫 readme.txt文件中,并對(duì)這個(gè)readme.txt產(chǎn)生一個(gè)MD5的值并記錄在案,然后你可以傳播這個(gè)文件給別人,別人如果修改了文件中的任何內(nèi)容,你對(duì)這個(gè)文件重新計(jì)算MD5時(shí)就會(huì)發(fā)現(xiàn)(兩個(gè)MD5值不相同)。如果再有一個(gè)第三方的認(rèn)證機(jī)構(gòu),用MD5還可以防止文件作者的“抵賴”,這就是所謂的數(shù)字簽名應(yīng)用。 所以,要遇到了md5密碼的問題,比較好的辦法是:你可以用這個(gè)系統(tǒng)中的md5()函數(shù)重新設(shè)一個(gè)密碼,如admin,把生成的一串密碼覆蓋原來的就行了。 MD5還廣泛用于操作系統(tǒng)的登陸認(rèn)證上,如Unix、各類BSD系統(tǒng)登錄密碼、數(shù)字簽名等諸多方。如在UNIX系統(tǒng)中用戶的密碼是以MD5(或其它類似的算法)經(jīng)Hash運(yùn)算后存儲(chǔ)在文件系統(tǒng)中。當(dāng)用戶登錄的時(shí)候,系統(tǒng)把用戶輸入的密碼進(jìn)行MD5 Hash運(yùn)算,然后再去和保存在文件系統(tǒng)中的MD5值進(jìn)行比較,進(jìn)而確定輸入的密碼是否正確。通過這樣的步驟,系統(tǒng)在并不知道用戶密碼的明碼的情況下就可以確定用戶登錄系統(tǒng)的合法性。這可以避免用戶的密碼被具有系統(tǒng)管理員權(quán)限的用戶知道。MD5將任意長度的“字節(jié)串”映射為一個(gè)128bit的大整數(shù),并且是通過該128bit反推原始字符串是困難的,換句話說就是,即使你看到源程序和算法描述,也無法將一個(gè)MD5的值變換回原始的字符串,從數(shù)學(xué)原理上說,是因?yàn)樵嫉淖址袩o窮多個(gè),這有點(diǎn)象不存在反函數(shù)的數(shù)學(xué)函數(shù)。所以,要遇到了md5密碼的問題,比較好的辦法是:你可以用這個(gè)系統(tǒng)中的md5()函數(shù)重新設(shè)一個(gè)密碼,如admin,把生成的一串密碼的Hash值覆蓋原來的Hash值就行了。 正是因?yàn)檫@個(gè)原因,現(xiàn)在被黑客使用最多的一種破譯密碼的方法就是一種被稱為"跑字典"的方法。有兩種方法得到字典,一種是日常搜集的用做密碼的字符串表,另一種是用排列組合方法生成的,先用MD5程序計(jì)算出這些字典項(xiàng)的MD5值,然后再用目標(biāo)的MD5值在這個(gè)字典中檢索。我們假設(shè)密碼的最大長度為8位字節(jié)(8 Bytes),同時(shí)密碼只能是字母和數(shù)字,共26+26+10=62個(gè)字符,排列組合出的字典的項(xiàng)數(shù)則是P(62,1)+P(62,2)….+P(62,8),那也已經(jīng)是一個(gè)很天文的數(shù)字了,存儲(chǔ)這個(gè)字典就需要TB級(jí)的磁盤陣列,而且這種方法還有一個(gè)前提,就是能獲得目標(biāo)賬戶的密碼MD5值的情況下才可以。這種加密技術(shù)被廣泛的應(yīng)用于UNIX系統(tǒng)中,這也是為什么UNIX系統(tǒng)比一般操作系統(tǒng)更為堅(jiān)固一個(gè)重要原因。 算法描述 對(duì)MD5算法簡要的敘述可以為:MD5以512位分組來處理輸入的信息,且每一分組又被劃分為16個(gè)32位子分組,經(jīng)過了一系列的處理后,算法的輸出由四個(gè)32位分組組成,將這四個(gè)32位分組級(jí)聯(lián)后將生成一個(gè)128位散列值。 在MD5算法中,首先需要對(duì)信息進(jìn)行填充,使其字節(jié)長度對(duì)512求余的結(jié)果等于448。因此,信息的字節(jié)長度(Bits Length)將被擴(kuò)展至N*512+448,即N*64+56個(gè)字節(jié)(Bytes),N為一個(gè)正整數(shù)。填充的方法如下,在信息的后面填充一個(gè)1和無數(shù)個(gè)0,直到滿足上面的條件時(shí)才停止用0對(duì)信息的填充。然后,在在這個(gè)結(jié)果后面附加一個(gè)以64位二進(jìn)制表示的填充前信息長度。經(jīng)過這兩步的處理,現(xiàn)在的信息字節(jié)長度=N*512+448+64=(N+1)*512,即長度恰好是512的整數(shù)倍。這樣做的原因是為滿足后面處理中對(duì)信息長度的要求。 MD5中有四個(gè)32位被稱作鏈接變量(Chaining Variable)的整數(shù)參數(shù),他們分別為:A=0x01234567,B=0x89abcdef,C=0xfedcba98,D=0x76543210。 當(dāng)設(shè)置好這四個(gè)鏈接變量后,就開始進(jìn)入算法的四輪循環(huán)運(yùn)算。循環(huán)的次數(shù)是信息中512位信息分組的數(shù)目。 將上面四個(gè)鏈接變量復(fù)制到另外四個(gè)變量中:A到a,B到b,C到c,D到d。 主循環(huán)有四輪(MD4只有三輪),每輪循環(huán)都很相似。第一輪進(jìn)行16次操作。每次操作對(duì)a、b、c和d中的其中三個(gè)作一次非線性函數(shù)運(yùn)算,然后將所得結(jié)果加上第四個(gè)變量,文本的一個(gè)子分組和一個(gè)常數(shù)。再將所得結(jié)果向右環(huán)移一個(gè)不定的數(shù),并加上a、b、c或d中之一。最后用該結(jié)果取代a、b、c或d中之一。 以一下是每次操作中用到的四個(gè)非線性函數(shù)(每輪一個(gè))。 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)) 。&是與,|是或,~是非,^是異或) 這四個(gè)函數(shù)的說明:如果X、Y和Z的對(duì)應(yīng)位是獨(dú)立和均勻的,那么結(jié)果的每一位也應(yīng)是獨(dú)立和均勻的。 F是一個(gè)逐位運(yùn)算的函數(shù)。即,如果X,那么Y,否則Z。函數(shù)H是逐位奇偶操作符。 具體的一個(gè)MD5實(shí)現(xiàn)=============================頭文件Security.h=============================================== /* 使用方法: char Md5Buffer[33]; CSecurity Security; Security.MD5("a string",Md5Buffer); 執(zhí)行完成之后Md5Buffer中即存儲(chǔ)了由"a string"計(jì)算得到的MD5值 */ // 下列 ifdef 塊是創(chuàng)建使從 DLL 導(dǎo)出更簡單的 // 宏的標(biāo)準(zhǔn)方法。此 DLL 中的所有文件都是用命令行上定義的 SECURITY_EXPORTS // 符號(hào)編譯的。在使用此 DLL 的 // 任何其他項(xiàng)目上不應(yīng)定義此符號(hào)。這樣,源文件中包含此文件的任何其他項(xiàng)目都會(huì)將 // SECURITY_API 函數(shù)視為是從此 DLL 導(dǎo)入的,而此 DLL 則將用此宏定義的 // 符號(hào)視為是被導(dǎo)出的。 //在使用該類的地方包含本文件即可 #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 導(dǎo)出的 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 應(yīng)用程序的入口點(diǎn)。 // #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; } // 這是已導(dǎo)出類的構(gòu)造函數(shù)。 // 有關(guān)類定義的信息,請(qǐng)參閱 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 : 標(biāo)準(zhǔn)系統(tǒng)包含文件的包含文件, // 或是常用但不常更改的項(xiàng)目特定的包含文件 // #pragma once //導(dǎo)出 #define SECURITY_EXPORTS #define WIN32_LEAN_AND_MEAN // 從 Windows 頭中排除極少使用的資料 // Windows 頭文件: #include <windows.h> // TODO: 在此處引用程序要求的附加頭文件 ============================stdafx.cpp======================================== // stdafx.cpp : 只包括標(biāo)準(zhǔn)包含文件的源文件 // Security.pch 將成為預(yù)編譯頭 // stdafx.obj 將包含預(yù)編譯類型信息 #include "stdafx.h" // TODO: 在 STDAFX.H 中 //引用任何所需的附加頭文件,而不是在此文件中引用 ===================================================================== 以上程序使用命令:@cl /GD /LD Security.cpp stdafx.cpp 編譯即可 一些破解MD5的網(wǎng)站[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 是一個(gè)網(wǎng)站(這三個(gè)網(wǎng)站都是國人做的)。 http://md5.mmkey.com http://www.md5lookup.com/ (對(duì)數(shù)字破解比較好) http://md5.rednoize.com (對(duì)字母破解比較好) http://nz.md5.crysm.net (從1到4位數(shù)字)- 好像關(guān)了 http://us.md5.crysm.net (美英字典的破解收集和IP地址) http://gdataonline.com (估計(jì)是基礎(chǔ)字典的破解) http://www.hashchecker.com (這個(gè)倒是說得很厲害,但是在實(shí)際中,很多次我在這里都找不到) http://passcracking.ru http://www.milw0rm.com/md5 http://plain-text.info (這個(gè)是我比較喜歡一個(gè).也請(qǐng)你提交一些已破解的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個(gè)格子) 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/ (需要捐獻(xiàn)) http://www.securitydb.org/cracker/ http://passwordsecuritycenter.com/index.php?main_page=product_info&cPath=3&products_id=7 這個(gè)是證明他們的破解商品的質(zhì)量..好讓你來買這個(gè)破解程序...但是...只要能破解到即可.你又不一定要買.. 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/ 密碼學(xué)領(lǐng)域重大發(fā)現(xiàn): 山東大學(xué)王小云教授成功破解MD5 2004年8月17日的美國加州圣巴巴拉,正在召開的國際密碼學(xué)會(huì)議(Crypto’2004)安排了三場關(guān)于雜湊函數(shù)的特別報(bào)告。在國際著名密碼學(xué)家Eli Biham和Antoine Joux相繼做了對(duì)SHA-1的分析與給出SHA-0的一個(gè)碰撞之后,來自山東大學(xué)的王小云教授做了破譯MD5、HAVAL-128、 MD4和RIPEMD算法的報(bào)告。在會(huì)場上,當(dāng)她公布了MD系列算法的破解結(jié)果之后,報(bào)告被激動(dòng)的掌聲打斷。王小云教授的報(bào)告轟動(dòng)了全場,得到了與會(huì)專家的贊嘆。報(bào)告結(jié)束時(shí),與會(huì)者長時(shí)間熱烈鼓掌,部分學(xué)者起立鼓掌致敬,這在密碼學(xué)會(huì)議上是少見的盛況。王小云教授的報(bào)告緣何引起如此大的反響?因?yàn)樗难芯砍晒鳛槊艽a學(xué)領(lǐng)域的重大發(fā)現(xiàn)宣告了固若金湯的世界通行密碼標(biāo)準(zhǔn)MD5的堡壘轟然倒塌,引發(fā)了密碼學(xué)界的軒然大波。會(huì)議總結(jié)報(bào)告這樣寫道:“我們?cè)撛趺崔k?MD5被重創(chuàng)了;它即將從應(yīng)用中淘汰。SHA-1仍然活著,但也見到了它的末日,F(xiàn)在就得開始更換SHA-1了! 關(guān)鍵詞:碰撞=漏洞=別人可以偽造和冒用數(shù)字簽名。 Hash函數(shù)與數(shù)字簽名(數(shù)字手。 HASH函數(shù),又稱雜湊函數(shù),是在信息安全領(lǐng)域有廣泛和重要應(yīng)用的密碼算法,它有一種類似于指紋的應(yīng)用。在網(wǎng)絡(luò)安全協(xié)議中,雜湊函數(shù)用來處理電子簽名,將冗長的簽名文件壓縮為一段獨(dú)特的數(shù)字信息,像指紋鑒別身份一樣保證原來數(shù)字簽名文件的合法性和安全性。在前面提到的SHA-1和MD5都是目前最常用的雜湊函數(shù)。經(jīng)過這些算法的處理,原始信息即使只更動(dòng)一個(gè)字母,對(duì)應(yīng)的壓縮信息也會(huì)變?yōu)榻厝徊煌摹爸讣y”,這就保證了經(jīng)過處理信息的唯一性。為電子商務(wù)等提供了數(shù)字認(rèn)證的可能性。 安全的雜湊函數(shù)在設(shè)計(jì)時(shí)必須滿足兩個(gè)要求:其一是尋找兩個(gè)輸入得到相同的輸出值在計(jì)算上是不可行的,這就是我們通常所說的抗碰撞的;其二是找一個(gè)輸入,能得到給定的輸出在計(jì)算上是不可行的,即不可從結(jié)果推導(dǎo)出它的初始狀態(tài),F(xiàn)在使用的重要計(jì)算機(jī)安全協(xié)議,如SSL,PGP都用雜湊函數(shù)來進(jìn)行簽名,一旦找到兩個(gè)文件可以產(chǎn)生相同的壓縮值,就可以偽造簽名,給網(wǎng)絡(luò)安全領(lǐng)域帶來巨大隱患。 MD5就是這樣一個(gè)在國內(nèi)外有著廣泛的應(yīng)用的雜湊函數(shù)算法,它曾一度被認(rèn)為是非常安全的。然而,王小云教授發(fā)現(xiàn),可以很快的找到MD5的“碰撞”,就是兩個(gè)文件可以產(chǎn)生相同的“指紋”。這意味著,當(dāng)你在網(wǎng)絡(luò)上使用電子簽名簽署一份合同后,還可能找到另外一份具有相同簽名但內(nèi)容迥異的合同,這樣兩份合同的真?zhèn)涡员銦o從辨別。王小云教授的研究成果證實(shí)了利用MD5算法的碰撞可以嚴(yán)重威脅信息系統(tǒng)安全,這一發(fā)現(xiàn)使目前電子簽名的法律效力和技術(shù)體系受到挑戰(zhàn)。因此,業(yè)界專家普林斯頓計(jì)算機(jī)教授Edward Felten等強(qiáng)烈呼吁信息系統(tǒng)的設(shè)計(jì)者盡快更換簽名算法,而且他們強(qiáng)調(diào)這是一個(gè)需要立即解決的問題。 國際講壇 王氏發(fā)現(xiàn)艷驚四座 面對(duì)Hash函數(shù)領(lǐng)域取得的重大研究進(jìn)展,Crypto 2004 會(huì)議總主席StorageTek高級(jí)研究員Jim Hughes 17 日早晨表示,此消息太重要了,因此他已籌辦該會(huì)成立24年來的首次網(wǎng)絡(luò)廣播(Webcast )。Hughes在會(huì)議上宣布:“會(huì)中將提出三份探討雜湊碰撞(hash collisions )重要的研究報(bào)告!逼渲幸环菔峭跣≡频葞孜恢袊芯咳藛T的研究發(fā)現(xiàn)。17日晚,王小云教授在會(huì)上把他們的研究成果做了宣讀。這篇由王小云、馮登國、來學(xué)嘉、于紅波四人共同完成的文章,囊括了對(duì)MD5、HAVAL-128、 MD4和RIPEMD四個(gè)著名HASH算法的破譯結(jié)果。在王小云教授僅公布到他們的第三個(gè)驚人成果的時(shí)候,會(huì)場上已經(jīng)是掌聲四起,報(bào)告不得不一度中斷。報(bào)告結(jié)束后,所有與會(huì)專家對(duì)他們的突出工作報(bào)以長時(shí)的熱烈掌聲,有些學(xué)者甚至起立鼓掌以示他們的祝賀和敬佩。當(dāng)人們掌聲漸息,來學(xué)嘉教授又對(duì)文章進(jìn)行了一點(diǎn)頗有趣味的補(bǔ)充說明。由于版本問題,作者在提交會(huì)議論文時(shí)使用的一組常數(shù)和先行標(biāo)準(zhǔn)不同;在會(huì)議發(fā)現(xiàn)這一問題之后,王小云教授立即改變了那個(gè)常數(shù),在很短的時(shí)間內(nèi)就完成了新的數(shù)據(jù)分析,這段有驚無險(xiǎn)的小插曲倒更加證明了他們論文的信服力,攻擊方法的有效性,反而凸顯了研究工作的成功。 會(huì)議結(jié)束時(shí),很多專家圍攏到王小云教授身邊,既有簡短的探討,又有由衷的祝賀,褒譽(yù)之詞不絕。包含公鑰密碼的主要?jiǎng)?chuàng)始人R. L. Rivest和A. Shamir在內(nèi)的世界頂級(jí)的密碼學(xué)專家也上前表示他們的欣喜和祝賀。 國際密碼學(xué)專家對(duì)王小云教授等人的論文給予高度評(píng)價(jià)。 MD5的設(shè)計(jì)者,同時(shí)也是國際著名的公鑰加密算法標(biāo)準(zhǔn)RSA的第一設(shè)計(jì)者R.Rivest在郵件中寫道:“這些結(jié)果無疑給人非常深刻的印象,她應(yīng)當(dāng)?shù)玫轿易顭崃业淖YR,當(dāng)然,我并不希望看到MD5就這樣倒下,但人必須尊崇真理。” Francois Grieu這樣說:“王小云、馮登國、來學(xué)嘉和于紅波的最新成果表明他們已經(jīng)成功破譯了MD4、MD5、HAVAL-128、RIPEMD-128。并且有望以更低的復(fù)雜度完成對(duì)SHA-0的攻擊。一些初步的問題已經(jīng)解決。他們贏得了非常熱烈的掌聲! 另一位專家Greg Rose如此評(píng)價(jià):“我剛剛聽了Joux和王小云的報(bào)告,王所使用的技術(shù)能在任何初始值下用2^40次hash運(yùn)算找出SHA-0的碰撞。她在報(bào)告中對(duì)四種HASH函數(shù)都給出了碰撞,她贏得了長時(shí)間的起立喝彩,(這在我印象中還是第一次)! 她是當(dāng)今密碼學(xué)界的巾幗英雄。……(王小云教授的工作)技術(shù)雖然沒有公開,但結(jié)果是無庸質(zhì)疑的,這種技術(shù)確實(shí)存在! 我坐在Ron Rivest前面,我聽到他評(píng)論道:‘我們不得不做很多的重新思考了。’” 石破天驚 MD5堡壘轟然倒塌 一石擊起千層浪,MD5的破譯引起了密碼學(xué)界的激烈反響。專家稱這是密碼學(xué)界近年來“最具實(shí)質(zhì)性的研究進(jìn)展”,各個(gè)密碼學(xué)相關(guān)網(wǎng)站競相報(bào)導(dǎo)這一驚人突破。 MD5破解專項(xiàng)網(wǎng)站關(guān)閉 MD5破解工程權(quán)威網(wǎng)站http://www.md5crk.com/是為了公開征集專門針對(duì)MD5的攻擊而設(shè)立的,網(wǎng)站于2004年8月17日宣布:“中國研究人員發(fā)現(xiàn)了完整MD5算法的碰撞;Wang, Feng, Lai與Yu公布了MD5、MD4、HAVAL-128、RIPEMD-128幾個(gè) Hash函數(shù)的碰撞。這是近年來密碼學(xué)領(lǐng)域最具實(shí)質(zhì)性的研究進(jìn)展。使用他們的技術(shù),在數(shù)個(gè)小時(shí)內(nèi)就可以找到MD5碰撞!捎谶@個(gè)里程碑式的發(fā)現(xiàn),MD5CRK項(xiàng)目將在隨后48小時(shí)內(nèi)結(jié)束”。 對(duì)此, Readyresponse主頁專門轉(zhuǎn)載了該報(bào)道,幾個(gè)其它網(wǎng)站也進(jìn)行了報(bào)道。 權(quán)威網(wǎng)站相繼發(fā)表評(píng)論或者報(bào)告這一重大研究成果 經(jīng)過統(tǒng)計(jì),在論文發(fā)布兩周之內(nèi),已經(jīng)有近400個(gè)網(wǎng)站發(fā)布、引用和評(píng)論了這一成果。國內(nèi)的許多新聞網(wǎng)站也以“演算法安全加密功能露出破綻 密碼學(xué)界一片嘩然”為題報(bào)道了這一密碼學(xué)界的重大事件,該消息在各新聞網(wǎng)站上多次轉(zhuǎn)載。 東方神韻 MD5終結(jié)者來自中國 MD5破解工作的主要成員王小云教授是一個(gè)瘦弱、矜持的女子,厚厚的鏡片透射出雙眸中數(shù)學(xué)的靈光。她于1990年在山東大學(xué)師從著名數(shù)學(xué)家潘承洞教授攻讀數(shù)論與密碼學(xué)專業(yè)博士,在潘先生、于秀源、展?jié)榷辔恢淌诘南ば闹笇?dǎo)下,她成功將數(shù)論知識(shí)應(yīng)用到密碼學(xué)中,取得了很多突出成果,先后獲得863項(xiàng)目資助和國家自然科學(xué)基金項(xiàng)目資助,并且獲得部級(jí)科技進(jìn)步獎(jiǎng)一項(xiàng),撰寫論文二十多篇。王小云教授從上世紀(jì)90年代末開始進(jìn)行HASH函數(shù)的研究,她所帶領(lǐng)的于紅波、王美琴、孫秋梅、馮騏等組成的密碼研究小組,同中科院馮登國教授,上海交大來學(xué)嘉等知名學(xué)者密切協(xié)作,經(jīng)過長期堅(jiān)持不懈的努力,找到了破解HASH函數(shù)的關(guān)鍵技術(shù),成功的破解了MD5和其它幾個(gè)HASH函數(shù)。 近年來她的工作得到了山東大學(xué)和數(shù)學(xué)院領(lǐng)導(dǎo)的大力支持,特別投資建設(shè)了信息安全實(shí)驗(yàn)室。山東大學(xué)校長展?jié)淌诟叨戎匾曂跣≡平淌谕怀龅目蒲谐晒?2004年6月山東大學(xué)領(lǐng)導(dǎo)聽取王小云教授的工作介紹后,展?jié)iL親自簽發(fā)邀請(qǐng)函邀請(qǐng)國內(nèi)知名信息安全專家參加2004年7月在威海舉辦的“山東大學(xué)信息安全研究學(xué)術(shù)研討會(huì)”,數(shù)學(xué)院院長劉建亞教授組織和主持了會(huì)議,會(huì)上王小云教授公布了MD5等算法的一系列研究成果,專家們對(duì)她的研究成果給予了充分的肯定,對(duì)其堅(jiān)持不懈的科研態(tài)度大加贊揚(yáng)。一位院士說,她的研究水平絕對(duì)不比國際上的差。這位院士的結(jié)論在時(shí)隔一個(gè)月之后的國際密碼會(huì)上得到了驗(yàn)證,國外專家如此強(qiáng)烈的反響表明,我們的工作可以說不但不比國際上的差,而且是在破解HASH函數(shù)方面已領(lǐng)先一步。加拿大CertainKey公司早前宣布將給予發(fā)現(xiàn) MD5算法第一個(gè)碰撞人員一定的獎(jiǎng)勵(lì),CertainKey的初衷是利用并行計(jì)算機(jī)通過生日攻擊來尋找碰撞,而王小云教授等的攻擊相對(duì)生日攻擊需要更少的計(jì)算時(shí)間。 數(shù)字認(rèn)證 你的未來不是夢 由于MD5的破譯,引發(fā)了關(guān)于MD5 產(chǎn)品是否還能夠使用的大辯論。在麻省理工大學(xué)Jeffrey I. Schiller教授主持的個(gè)人論壇上,許多密碼學(xué)家在標(biāo)題為“Bad day at the hash function factory”的辯論中發(fā)表了具有價(jià)值的意見。這次國際密碼學(xué)會(huì)議的總主席Jimes Hughes發(fā)表評(píng)論說“我相信這(破解MD5)是真的,并且如果碰撞存在,HMAC也就不再是安全的了,…… 我認(rèn)為我們應(yīng)該拋開MD5了。” Hughes建議,程序設(shè)計(jì)人員最好開始舍棄MD5。他說:“既然現(xiàn)在這種算法的弱點(diǎn)已暴露出來,在有效的攻擊發(fā)動(dòng)之前,現(xiàn)在是撤離的時(shí)機(jī)。” 同樣,在普林斯頓大學(xué)教授Edwards Felton的個(gè)人網(wǎng)站上,也有類似的評(píng)論。他說:“留給我們的是什么呢?MD5已經(jīng)受了重傷;它的應(yīng)用就要淘汰。SHA-1仍然活著,但也不會(huì)很長,必須立即更換SHA-1,但是選用什么樣的算法,這需要在密碼研究人員達(dá)到共識(shí)! 密碼學(xué)家Markku-Juhani稱“這是HASH函數(shù)分析領(lǐng)域激動(dòng)人心的時(shí)刻。” 而著名計(jì)算機(jī)公司SUN的LINUX專家Val Henson則說:“以前我們說"SHA-1可以放心用,其他的不是不安全就是未知", 現(xiàn)在我們只能這么總結(jié)了:"SHA-1不安全,其他的都完了"。 針對(duì)王小云教授等破譯的以MD5為代表的Hash函數(shù)算法的報(bào)告,美國國家技術(shù)與標(biāo)準(zhǔn)局(NIST)于2004年8月24日發(fā)表專門評(píng)論,評(píng)論的主要內(nèi)容為:“在最近的國際密碼學(xué)會(huì)議(Crypto 2004)上,研究人員宣布他們發(fā)現(xiàn)了破解數(shù)種HASH算法的方法,其中包括MD4,MD5,HAVAL-128,RIPEMD還有 SHA-0。分析表明,于1994年替代SHA-0成為聯(lián)邦信息處理標(biāo)準(zhǔn)的SHA-1的減弱條件的變種算法能夠被破解;但完整的SHA-1并沒有被破解,也沒有找到SHA-1的碰撞。研究結(jié)果說明SHA-1的安全性暫時(shí)沒有問題,但隨著技術(shù)的發(fā)展,技術(shù)與標(biāo)準(zhǔn)局計(jì)劃在2010年之前逐步淘汰SHA-1,換用其他更長更安全的算法(如SHA-224、SHA-256、SHA-384和SHA-512)來替代! 2004年8月28日,十屆全國人大常委會(huì)第十一次會(huì)議表決通過了電子簽名法。這部法律規(guī)定,可靠的電子簽名與手寫簽名或者蓋章具有同等的法律效力。電子簽名法的通過,標(biāo)志著我國首部“真正意義上的信息化法律”已正式誕生,將于2005年4月1日起施行。專家認(rèn)為,這部法律將對(duì)我國電子商務(wù)、電子政務(wù)的發(fā)展起到極其重要的促進(jìn)作用。王小云教授的發(fā)現(xiàn)無異于發(fā)現(xiàn)了信息化天空的一個(gè)驚人黑洞。我們期待著王小云教授和她的團(tuán)隊(duì)能夠成就“女媧補(bǔ)天”的壯舉,為人類的信息化之路保駕護(hù)航。
移動(dòng)通信網(wǎng) | 通信人才網(wǎng) | 更新日志 | 團(tuán)隊(duì)博客 | 免責(zé)聲明 | 關(guān)于詞典 | 幫助