📄 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仍然
// 活着,但也见到了它的末日。现在就得开始更换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人女子团队,其中
// 包括王小云的一名博士生于红波,另一位合作者是来自清华大学的一位女研究
// 人员。“我的8名博士生里面有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 + -