?? zmd5.h
字號:
// RFC 1321 MD5 Message-Digest Algorithm April 1992
//
//
// char *argv[];
// {
// int i;
//
// if (argc > 1)
// for (i = 1; i < argc; i++)
// if (argv[i][0] == '-' && argv[i][1] == 's')
// MDString (argv[i] + 2);
// else if (strcmp (argv[i], "-t") == 0)
// MDTimeTrial ();
// else if (strcmp (argv[i], "-x") == 0)
// MDTestSuite ();
// else
// MDFile (argv[i]);
// else
// MDFilter ();
//
// return (0);
// }
//
// /* Digests a string and prints the result.
// */
// static void MDString (string)
// char *string;
// {
// MD_CTX context;
// unsigned char digest[16];
// unsigned int len = strlen (string);
//
// MDInit (&context);
// MDUpdate (&context, string, len);
// MDFinal (digest, &context);
//
// printf ("MD%d (\"%s\") = ", MD, string);
// MDPrint (digest);
// printf ("\n");
// }
//
// /* Measures the time to digest TEST_BLOCK_COUNT TEST_BLOCK_LEN-byte
// blocks.
// */
// static void MDTimeTrial ()
// {
// MD_CTX context;
// time_t endTime, startTime;
// unsigned char block[TEST_BLOCK_LEN], digest[16];
// unsigned int i;
//
// Rivest [Page 18]
//
// RFC 1321 MD5 Message-Digest Algorithm April 1992
//
//
// printf
// ("MD%d time trial. Digesting %d %d-byte blocks ...", MD,
// TEST_BLOCK_LEN, TEST_BLOCK_COUNT);
//
// /* Initialize block */
// for (i = 0; i < TEST_BLOCK_LEN; i++)
// block[i] = (unsigned char)(i & 0xff);
//
// /* Start timer */
// time (&startTime);
//
// /* Digest blocks */
// MDInit (&context);
// for (i = 0; i < TEST_BLOCK_COUNT; i++)
// MDUpdate (&context, block, TEST_BLOCK_LEN);
// MDFinal (digest, &context);
//
// /* Stop timer */
// time (&endTime);
//
// printf (" done\n");
// printf ("Digest = ");
// MDPrint (digest);
// printf ("\nTime = %ld seconds\n", (long)(endTime-startTime));
// printf
// ("Speed = %ld bytes/second\n",
// (long)TEST_BLOCK_LEN * (long)TEST_BLOCK_COUNT/(endTime-startTime));
// }
//
// /* Digests a reference suite of strings and prints the results.
// */
// static void MDTestSuite ()
// {
// printf ("MD%d test suite:\n", MD);
//
// MDString ("");
// MDString ("a");
// MDString ("abc");
// MDString ("message digest");
// MDString ("abcdefghijklmnopqrstuvwxyz");
// MDString
// ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789");
// MDString
// ("1234567890123456789012345678901234567890\
// 1234567890123456789012345678901234567890");
// }
//
// /* Digests a file and prints the result.
//
// Rivest [Page 19]
//
// RFC 1321 MD5 Message-Digest Algorithm April 1992
//
//
// */
// static void MDFile (filename)
// char *filename;
// {
// FILE *file;
// MD_CTX context;
// int len;
// unsigned char buffer[1024], digest[16];
//
// if ((file = fopen (filename, "rb")) == NULL)
// printf ("%s can't be opened\n", filename);
//
// else {
// MDInit (&context);
// while (len = fread (buffer, 1, 1024, file))
// MDUpdate (&context, buffer, len);
// MDFinal (digest, &context);
//
// fclose (file);
//
// printf ("MD%d (%s) = ", MD, filename);
// MDPrint (digest);
// printf ("\n");
// }
// }
//
// /* Digests the standard input and prints the result.
// */
// static void MDFilter ()
// {
// MD_CTX context;
// int len;
// unsigned char buffer[16], digest[16];
//
// MDInit (&context);
// while (len = fread (buffer, 1, 16, stdin))
// MDUpdate (&context, buffer, len);
// MDFinal (digest, &context);
//
// MDPrint (digest);
// printf ("\n");
// }
//
// /* Prints a message digest in hexadecimal.
// */
// static void MDPrint (digest)
// unsigned char digest[16];
// {
//
// Rivest [Page 20]
//
// RFC 1321 MD5 Message-Digest Algorithm April 1992
//
//
// unsigned int i;
//
// for (i = 0; i < 16; i++)
// printf ("%02x", digest[i]);
// }
//
// A.5 Test suite
//
// The MD5 test suite (driver option "-x") should print the following
// results:
//
// MD5 test suite:
// MD5 ("") = d41d8cd98f00b204e9800998ecf8427e
// MD5 ("a") = 0cc175b9c0f1b6a831c399e269772661
// MD5 ("abc") = 900150983cd24fb0d6963f7d28e17f72
// MD5 ("message digest") = f96b697d7cb7938d525a2f31aaf161d0
// MD5 ("abcdefghijklmnopqrstuvwxyz") = c3fcd3d76192e4007dfb496cca67e13b
// MD5 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") =
// d174ab98d277d9f5a5611c2c9f419d9f
// MD5 ("123456789012345678901234567890123456789012345678901234567890123456
// 78901234567890") = 57edf4a22be3c955ac49da2e2107b67a
//
// Security Considerations
//
// The level of security discussed in this memo is considered to be
// sufficient for implementing very high security hybrid digital-
// signature schemes based on MD5 and a public-key cryptosystem.
//
// Author's Address
//
// Ronald L. Rivest
// Massachusetts Institute of Technology
// Laboratory for Computer Science
// NE43-324
// 545 Technology Square
// Cambridge, MA 02139-1986
//
// Phone: (617) 253-5880
// EMail: rivest@theory.lcs.mit.edu
//
// Rivest [Page 21]
//
//
//
//
//
//
//
//
//
//
//
//
// 世界震驚 美國擔心 王小云破解全球兩大密碼算法
//
// 中國取得解碼技術突破 美國稱其密碼系統遭破解
//
// 隨著電子商務的發展,網上銀行、網上合同、電子簽名等的應用越來越廣
// 泛,網絡已經成為我們生活中不可或缺的一部分。電子商務在給我們的工作生
// 活帶來便捷的同時,也存在著安全隱患。一直在國際上廣泛應用的兩大密碼算
// 法MD5、SHA-1,近期宣布被一名中國密碼專家破解。這一消息在國際社會尤其
// 是國際密碼學領域引起極大反響,同時也再次敲響了電子商務安全的警鐘。
//
// 從密碼分析上找出這兩大國際通用密碼漏洞的是一位土生土長的中國專家
// ——山東大學信息安全所所長王小云。
//
// 新聞世界密碼大廈轟然倒塌
//
// 40歲的王小云,畢業于山東大學數學系,師從于著名數學家潘承洞、于秀
// 源教授,是一位外表普通卻充滿自信的中國女性。
//
// 在去年8月之前,國際密碼學界對王小云這個名字并不熟悉。2004年8月,
// 在美國加州圣芭芭拉召開的國際密碼大會上,并沒有被安排發言的王小云教授
// 拿著自己的研究成果找到會議主席,要求進行大會發言。就這樣,王小云在國
// 際會議上首次宣布了她及她的研究小組近年來的研究成果——對MD5、HAVAL-
// 128、MD4和RIPEMD等四個著名密碼算法的破譯結果。
//
// 在公布到第三個成果的時候,會場上已經是掌聲四起,報告不得不一度中
// 斷。報告結束后,所有與會專家對她們的突出工作報以長時間的掌聲。
//
// 王小云的研究成果作為密碼學領域的重大發現宣告了固若金湯的世界通行
// 密碼標準MD5大廈轟然倒塌,引發了密碼學界的軒然大波。這次會議的總結報告
// 這樣寫道:“我們該怎么辦?MD5被重創了,它即將從應用中淘汰。SHA-1仍然
// 活著,但也見到了它的末日?,F在就得開始更換SHA-1了?!?
//
// 事實上,在MD5被王小云為代表的中國專家破譯之后,世界密碼學界仍然認
// 為SHA-1是安全的。今年2月7日,美國國家標準技術研究院發表申明,SHA-1
// 沒有被攻破,并且沒有足夠的理由懷疑它會很快被攻破,開發人員在2010年前
// 應該轉向更為安全的SHA-256和SHA-512算法。而僅僅在一周之后,王小云就
// 宣布了破譯SHA-1的消息。
//
// 因為SHA-1在美國等國家有更加廣泛的應用,密碼被破的消息一出,在國
// 際社會的反響可謂石破天驚。換句話說,王小云的研究成果表明了從理論上講
// 電子簽名可以偽造,必須及時添加限制條件,或者重新選用更為安全的密碼標
// 準,以保證電子商務的安全。
//
// 最近國際密碼學家Lenstra利用王小云提供的MD5碰撞,偽造了符合X.509標
// 準的數字證書,這就說明了MD5的破譯已經不僅僅是理論破譯結果,而是可以導
// 致實際的攻擊,MD5的撤出迫在眉睫。王小云說,目前SHA-1在理論上已經被破
// 譯,離實際應用也為期不遠。
//
// 評論這幾位研究人員太瘋狂了
//
// MD5、SHA-1等國際通用密碼被破譯,在國際密碼學界引發強烈“地震”。
//
// 國際頂級密碼學家Shamir評論道:“這是近幾年密碼學領域最美妙的結果
// ,我相信這將會引起軒然大波,設計新的Hash函數算法極其重要。”
//
// MD5的設計者Rivest評論道,“SHA-1的破譯令人吃驚”,“數字簽名的安
// 全性在降低,這再一次提醒需要替換算法”。
//
// 美國國家標準技術研究院和幾大知名公司也做出積極反應。
//
// 希捷科技(Seagate Technology)的一位安全問題研究總監Mark Willet表
// 示,“現在美國國家標準技術研究院可能需要將更新密碼的日程提前?!?
//
// 此外,微軟、SUN和Atmel等幾家知名公司的專家也發表了他們的應對之策
// 。一位美國律師協會顧問說:“中國的這幾位研究人員太瘋狂了。”
//
// 幕后不可思議的女子解碼團隊
//
// 讓世界震驚的是,絕大多數密碼專家認為固若金湯的兩大密碼算法,最終
//
// 被一位中國女子帶領的女子團隊無情地擊倒,而且這個過程看起來似乎并不是
// 太難,SHA-1的破解只用了兩個多月的時間,很多密碼學界的專家認為“這聽
// 起來簡直有些不可思議”。
//
// 王小云1990年在山東大學師從著名數學家潘承洞教授攻讀數論與密碼學專
// 業博士,在潘承洞、于秀源、展濤等多位名師的指導下,她成功將數論知識應
// 用到密碼學中,并從上世紀90年代末開始進行Hash函數的研究。
//
// 王小云在成功之前一直默默無聞,同行評價她,從不急功近利,沒有新思
// 想新進展的論文她是絕對不主張發表的,平時對一些耽誤研究工作時間的榮譽
// 或應酬也沒有熱情。她不贊同大批量的閱讀文獻,主張抓住幾篇經典的論文仔
// 細研究,吃透論文思想,然后自己獨立思考,尋找突破性的方法,迅速將自己
// 的方法進行實驗。她就是這樣周而復始地在數字王國里進行著鉆研。
//
// 參與破譯密碼SHA-1的研究小組是以王小云為首的一支3人女子團隊,其中
// 包括王小云的一名博士生于紅波,另一位合作者是來自清華大學的一位女研究
// 人員?!拔业?名博士生里面有6個是女性,她們在密碼學領域表現出不凡的才
// 能。很多人覺得密碼學是很玄妙的學問,而我們覺得它非常有趣。因為我們習
// 慣于用數學方式思維,而一旦養成了這種思維方式,數字在我們眼中就變成了
// 美妙的音符,我們的研究就象音樂創作一樣有趣。”王小云說。
//
// 相關鏈接
//
// 國際兩大密碼城堡
//
// MD5、SHA-1是當前國際通行的兩大密碼標準。據了解,MD5由國際著名密
// 碼學家圖靈獎獲得者兼公鑰加密算法RSA的創始人Rivest設計,SHA-1是由美國
// 專門制定密碼算法的標準機構——美國國家標準技術研究院(NIST)與美國國
// 家安全局(NSA)設計。
//
// 兩大算法是目前國際電子簽名及許多其它密碼應用領域的關鍵技術,廣泛
// 應用于金融、證券等電子商務領域。其中,SHA-1早在1994年便為美國政府采
// 納,目前是美國政府廣泛應用的計算機密碼系統。
//
// 王小云介紹說,世界上由于沒有兩個完全相同的指紋,因此手印成為人們
// 身份惟一和安全的標志。在網絡安全協議中,使用Hash函數來處理電子簽名,
// 以便產生理論上獨一無二的“指紋”,形成“數字手印”。按照理想安全要求
// ,經過Hash函數產生的指紋,原始信息即使只改變一位,其產生的“指紋”也
// 會截然不同。如果能找到Hash函數的碰撞,就意味著兩個不同的文件可以產生
// 相同的“指紋”,這樣就可以偽造簽名。
//
// 王小云剪影
//
// 綜合新華社消息,整日埋頭密碼研究的王小云并不是記者想象中的“陳景
// 潤”式的學者,她穿戴得體,看起來穩重而又時尚,鏡片后面的眼睛透露出堅
// 定而又自信的目光。
//
// 公布破解MD5報告前,王小云曾跟丈夫開玩笑說,“我作完這次報告后,你
// 猜我的名字會不會出現在Google(著名搜索引擎)里?”果然,在她公布了破
// 解MD5的報告后,國外的很多網站上有了關于王小云破解MD5的消息,Google里
// 關于王小云的檢索條也多達數千條。
//
// 默默無聞的王小云一鳴驚人,山東大學信息安全實驗室一夜之間成為讓世
// 界注目的科研機構。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -