理论计算机初步:从hash函数到王小云的MD5破解

密码学是理论计算机的一个很大的方向。之前准备先写密码学概论再提在hash函数破解上做出重大贡献的王小云教授的工作,不过前两天王小云获得求是杰出科学家奖以及100万奖金,在媒体上又掀起了一轮宣传狂潮,但是有些报道极端弱智,错误百出,所以我趁机纠正一下,并介绍密码学的一个组成部分——hash函数,以及王小云在这上面的工作。

王小云的主要工作是关于hash函数的破解工作。她在2005一个密码学会议上宣布破解了SHA-1,震惊了全世界。所以要介绍和理解她的工作,先看一下hash函数具体是怎么回事。

简单的说,hash函数就是把任意长的输入字符串变化成固定长的输出字符串的一种函数。通俗得说,hash函数用来生成信息的摘要。输出字符串的长度称为hash函数的位数

目前应用最为广泛的hash函数是SHA-1MD5,大多是128位和更长。

hash函数在现实生活中应用十分广泛。很多下载网站都提供下载文件的MD5码校验,可以用来判别文件是否完整。另外,比如在WordPress的数据库,所有密码都是保存的MD5码,这样即使数据库的管理员也无法知道用户的原始密码,避免隐私泄露(很多人在不同地方都是用的同一个密码)。

如果两个输入串的hash函数的值一样,则称这两个串是一个碰撞(Collision)。既然是把任意长度的字符串变成固定长度的字符串,所以,必有一个输出串对应无穷多个输入串,碰撞是必然存在的。

一个“优良”的hash函数 f 应当满足以下三个条件:

  • 任意y,找x,使得f(x)=y,非常困难。
  • 给定x1,找x2,使得f(x1)=f(x2),非常困难。
  • 找x1,x2,使得f(x1)=f(x2),非常困难。

上面的“非常困难”的意思是除了枚举外不可能有别的更快的方法。比如第3条,根据生日定理,要想找到这样的x1,x2,理论上需要大约2^(n/2)的枚举次数。

几乎所有的hash函数的破解,都是指的破坏上面的第三条性质,即找到一个碰撞(前两条都能被破坏的hash函数也太弱了点,早就被人抛弃了)。在密码学上还有一个概念是理论破解,指的是提出一个算法,使得可以用低于理论值得枚举次数找到碰撞。

王小云的主要工作是给出了MD5,SHA-0的碰撞,以及SHA-1的理论破解,她证明了160位SHA-1,只需要大约2^69次计算就能找出来,而理论值是2^80次。她的寻找MD5碰撞的方法是极端高效的。传说王小云当时在会议上把碰撞写出来,结果被下面的人验证发现不对,原来她把MD5算法的一个步骤弄错了。但是她立马联系她的当时留在中国的学生,修正算法,并找到一个新的碰撞。这一个是对的。

看到这里,那些认为中国国安局应该将这些结果封存作为秘密武器甚至幻想用这些成果来袭击美国之徒可以停住你们的YY了。这种形式上的破解,在大多数情况下没有实际性的作用。更别提MD5早就被美国人抛弃了。

但是,说这种破解一点实际意义都没有,那就侮辱了广大密码学家的智商,密码学家不会无缘无故的弄出碰撞这么一个概念来。下面简单的介绍一下在特定情况下,怎么利用给定的碰撞来做坏事(翻译自Attacking Hash Functions):

Caesar给实习生Alice叫写了一封推荐信(letter)。同一天,Alice叫Caesar在推荐信上数字签名,并提供了一份推荐信的电子板。Caesar打开文件,发现和原件一模一样。所以他在文件上签了名。

几个月后,Caesar发现他的秘密文件被非法察看。这到底是怎么回事呢?

letter order
(apply MD5 to both documents)
a25f7f0b 29ee0b39 68c86073 8533a4b9

事实上,Alice要求Caesar签名的文件letter已经被Alice做了手脚,准确地说,Alice还准备了另外一个文件order,它们的MD5码完全一致。而Caesar的数字签名还依赖于MD5算法,所以Alice用order文件替换Letter文件之后,Caesar的数字签名依然有效。那封order给Alice提供了察看秘密文件的权限。

具体的实现方法可见Hash Functions and the Blind Passenger Attack。我在这里简单的解释一下(只是大致思路,具体实现方式,需要对文件结构信息有所了解):

letter文件的内容是:

if(x1==x1) show "letter" else show "order"

order文件的内容是:

if(x2==x1) show "letter" else show "order"

其中字符串"letter"和"order"代表两封信实际显示的内容。x1,x2是一个MD5的碰撞。

上面的方法,只供参考和学术用途,实际使用所引起的后果概不负责。

参考:

PS:我跟王小云老师的接触很少,上过俩次她的讨论班而已,亦感觉到王小云老师的严谨和耐心。在去年一个Turing奖获得者的演讲上,王小云提问的时候竟口而出“I ask who”的中式英语,在引起哄笑的同时,我也极端佩服她的勇气。也许只有这样才能做出非常好的工作吧。

PS2: wikipedia在国内可以通过free_door浏览。

  • TCS:One-Time Password 一次性密码及其应用 题外话:此篇隶属于理论计算机(TCS)系列。 昨天,RSA实验室的首席科学家Burt Kaliski(同时也是副总裁)给我们做了一个讲座,关于最新的One-Time Password...
  • MD5碰撞的新玩意儿 在从hash函数到王小云的MD5破解我们介绍了hash函数的一些基本概念和MD5碰撞的一个“应用”,最近在这个问题上又有了新的进展。 Marc Stevens, Arj...
  • 理论计算机初步:前言 这段时间Blog的更新频率大大降低,因为发现没啥好写的,也没有写文章的欲望。前段时间提到了我加入中国赛客联盟,而且给的说明语是"算机|数学|算...
  • 理论计算机初步:P vs NP - 问题概述 P = NP? 这个问题,作为理论计算机科学的核心问题,其声名早已经超越了这个领域。它是Clay研究所的七个百万美元大奖问题之一,在2006国际数学家大...
  • 理论计算机初步:P vs NP - 历史,现状和未来 上篇文章已经提到,P vs NP是理论计算机科学的核心问题。从数学的角度来说,它和其他历史上有名的数学问题一样,给与人们一个智力上重大的挑战。...
  • 理论计算机初步:概率算法和近似算法 前面已经提到了显示中大多数难解问题问题最后都被证明是NP-完全问题。这意味着,除非NP=P,它们是不可能有多项式时间算法的(而且,在这篇文章提...
27条留言 -> 跳到留言表格
  • At 2006.09.18 21:52, 天方 said:

    嗯,知道了什么叫hash函数,呵呵
    问一个浅显的问题
    我现在Rss Reader换用FeedDemon了,发现FD本地保存的文件都是xxx-xxx-xxx-xxx.rss,文件名的长度也的确都一致,这个是不是用的hash函数?

    • At 2006.09.18 21:56, zhiqiang said:

      应该就是的。hash函数的应用极为广泛,我上面只随便挑了两个说说。

      • At 2006.11.02 13:08, 伤口 said:

        这个是GUID全球唯一编码

    • At 2006.09.19 07:27, Chen Wang said:

      这个写的不错,图文并茂:)
      鼓鼓掌!

      • At 2006.09.19 09:46, 棺材中的尘埃 said:

        这里的东西越来越深奥了

        • At 2006.09.22 07:09, wisagan said:

          明白了,这么说来那些BT或者电驴就是用HASH函数来保证文件没被修改的。

          • At 2006.11.01 17:11, 天河饮马 said:

            我也明白了,MD5

            • At 2006.11.06 18:03, cr said:

              赶快出MD5的破解软件吧

              • At 2006.11.26 13:49, 没有绝对安全 said:

                其实理论上没有绝对安全的密码算法
                在发生破坏之前把已经找到的相互碰撞的字符禁用

                • At 2006.11.26 14:07, 看不懂 said:

                  ”Caesar发现他的秘密文件被非法察看“ 这里的秘密文件是指哪个???

                  • At 2006.11.26 16:30, zhiqiang said:

                    比如说公司的秘密文档,是一个泛指。

                    你可以点letter和order链接看一下里面的具体内容,发现它们一个是推荐性,另外一个则是一封授权书,但它们的MD5码一模一样。

                  • At 2006.12.21 10:01, blog.bobobook.cn said:

                    王老师是我们学校数学院的,有幸见过,看起来很普通的人。不过做学问的大抵如此。

                    • At 2006.12.21 12:24, zhiqiang said:

                      山东大学?现在不是了

                    • At 2006.12.23 13:49, wang said:

                      对不起,我想问一下:按照上面的例子,Alice是如何“凑”出那份order的?

                      因为按照Hash的三个条件的第二条:

                      1. 给定x1,找x2,使得f(x1)=f(x2),非常困难。

                      现在Alice只是拿到了x1(即letter),按道理她是很难找出x2(order)的呀?

                      因为现在MD5破解打破的是第三条,即“找x1,x2,使得f(x1)=f(x2),非常困难”。
                      如果letter(x1)和order(x2)都是Alice自己写的,她是可以使得这两个发生“碰撞”,但是问题现在x1是由她的导师Caesar写的啊。

                      您能解释一下吗?

                      • At 2006.12.23 14:07, zhiqiang said:

                        那封letter虽然是Caesar写的,Alice在里面添了一些不可见的东西,具体说了,她把letter变成了 if(x1==x1) show "letter" else show "order",这样一来,Caesar看到的就是letter的内容,所以就没有疑心的签了名,但这封letter此时的MD5码与 if(x2==x1) show "letter" else show "order"这个文件order的MD5是一样的,但后者实际显示的是order的内容。

                        你可以把那两个东西下载回来看一看,很神奇的。王小云的MD5碰撞绝对不只只有理论价值。

                      • At 2006.12.23 13:54, wang said:

                        顺便说一下,你的blog很不错,我已经收藏 ;-)

                        • At 2006.12.24 05:27, zfling said:

                          是啊 ,很棒啊,可惜我搞一个相册,通宵,还没有搞定,唉。对我来说太难了。

                          • At 2007.01.15 16:24, http://robindennis.bokee.com said:

                            呵呵,不是很明白~~回去再想一想`~谢谢~~~

                            • At 2008.02.28 21:20, 现代古人 said:

                              真是特别的佩服,ZHIQIANG的文章写的让我们这些完全的门外汉似乎都理解了王老师的工作。
                              希望王老师的工作会有更大的突破!

                              • At 2008.11.19 16:04, tellov said:

                                我只想说一句,既然理论上已经能找到碰撞了,那拿个程序来出说话,比理论有说服力多了.不然不能造福大众,有什么用.

                                • At 2008.12.02 19:10, lonegunman said:

                                  我有一个问题,攻击者即使可以在有效时间内找到一个md5值与letter一样的碰撞,又如何能保证这个碰撞能够是有语义意义,进而是表达了自己想要篡改的意义呢?

                                  • At 2008.12.02 22:41, zhiqiang said:

                                    你还没有完全理解文中给的例子的意思,这也说明我还写的不够好 :(

                                    文中的例子使用的是任意一对碰撞,这对碰撞不需要有任何的语义意义。但是利用特殊文件格式(PDF)的文件结构,我们可以构造出MD5完全一样的两个PDF文件,它们打开后看到的是两封意思相反的信(其实信的内容可以任意指定)。

                                    • At 2008.12.03 00:03, lonegunmanb@hotmail.com said:

                                      我的意思是
                                      有一个pdf,内容是"letter"。
                                      我想构造一个pdf,内容看上去是"order",但是需要整个pdf的hash值看上去和原文一样。
                                      那么应该是**order****的一个字串对吧。
                                      如何保证**order****中一定有一个合法的pdf格式,并且看上去只显示"order",并且hash值还要和letter一样?
                                      我曾经构想过寻找碰撞来进行攻击,但是我想不好的是,如何使得我构造的可以产生碰撞的字串“看上去”是我想要伪造的语义?并不能保证这个字串在他人看来是有意义的,甚至是表述了我想要伪造的意思的,对吗?
                                      换在文中的例子里,你不能保证能与letter碰撞的order文件可以给攻击者查看秘密文件的权限,不是吗?

                                      • At 2008.12.03 12:22, zhiqiang said:

                                        如何保证**order****中一定有一个合法的pdf格式,并且看上去只显示"order",并且hash值还要和letter一样

                                        大致方法在文章里写了的,这个应该与具体文件结构有关系,某些文件并不是会把所有内容都显示出来,很多代码都是格式控制符,这点和txt文件不一样。但具体怎么实现你说的我也不知道,我对pdf文件格式结构也不了解。

                                        另外文章里给的例子是ps文件,你可以点开看看就知道了。

                                        • At 2008.12.03 16:40, lonegunman said:

                                          多谢,受教了.
                                          一般生产环境里我是用SHA256来实现散列的,而且一般会先散列一次,取一个0-3之间的值来决定还要把结果散列几次,我想但就MD5来说的确找到了高效的碰撞攻击的手法,但是可能生产中还是可以采用一些小手段来对抗纯黑盒的攻击吧.

                                  • At 2009.03.22 13:38, michael said:

                                    不知哪里可以看到王小云教授的那篇论文。
                                    博主能不能给个链接呀?

                                    • At 2009.03.24 14:39, zhiqiang said:

                                      你可以看一下下面这两篇文章

                                      Xiaoyun Wang and Hongbo Yu: How to Break MD5 and Other Hash Functions. Retrieved July 27, 2008
                                      Xiaoyun Wang, Dengguo Feng, Xuejia Lai, Hongbo Yu: Collisions for Hash Functions MD4, MD5, HAVAL-128 and RIPEMD, Cryptology ePrint Archive Report 2004/199, 16 Aug 2004, revised 17 Aug 2004. Retrieved July 27, 2008.

                                    (Required)
                                    (Required, not published)

                                      B | I | U | D | 添加链接 | 插入引用 | 插入代码 | 插入表情 | | + | ?
                                    guest | 注册 | BBS | 管理 | English | 繁體 | https

                                    阅微堂

                                    zhiqiang's personal blog
                                    Loading...
                                    Loading...
                                    Loading...