散列算法破解
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
常见散列算法:
(1)MD2算法。MD2算法是Rivest在1989年开发出来的,在处理过程中首先对信息进行补位,使得信息的长度是16的倍数,然后以一个16为的校验和最佳的信息的末尾,并根据这个新产生的信息生成128位的散列值。
(2)MD4算法。Rivest在1990年又开发出MD4算法。MD4算法也需要信息的填充,他要求信息在填充后加上448位能够被512整除。用64比特表示消息的长度,放在填充比特之后生成128位的散列值。
虽然王小云没有对散列算法达到实际意义上的破解,但她对密码技术的发展所作出的贡献依然是非常显著的,她推动着以后的密码算法设计走向一个新高度。
这里我要说一下关于密码破解,在对称密码(大家可以去查一下关于对称密码技术和非对称密码技术的资料)中,加密解密用的是相同的密钥,甚至可能用相同的算法。它的用途是:
发生方将原文(M)用密钥(K)用算法ENC加密得到密文:E=ENC(M,K)
通过网络将密文E传给接收方
接收方用相同的密钥(K)解密用算法DEC解密:M=DEC(E,K)
1.K2是K1的逆;2.由K1出发去求解K2十分困难;3.K1和K2要容易计算;
其有两种表现形式,一种是公钥加密然后私钥解密,一种是私钥加密然后公钥解密。
发送方自己生成一对密钥:私钥(KA)和公钥(KPA)
接收方也生成一对密钥:(KB)和(KPB)
发送方和接收方交换公钥
其中公钥是公开的即(KPA)和(KPB)是公开的
发送方用接收方的KPB加密得到密文:E=ENC(ENC(M,KA),KPB)
接收方用发送方的KPA解密得到原文:M=DEC(DEC(E,KB),KPA)
双方都不需要知道对方的私钥,避免了约定密钥导致的不安全。
当然,如果有方法可以从公钥推导出私钥来,从而得到原文,则这种算法被破解。
综上,破解是通过一定的方法推导出原文,而王小云教授并不是推导出原文,而是通过其他方法找到了一个能产生相同散列值的消息,因此她并不是违背散列算法的原理来破解散列算法。所以我们说的MD5破解,本身就是对散列算法的一种误解。
那王小云教授对MD5成功破解有是怎么一回事了?我们知道散列算法必须满足散列函数的属性,从理论上讲这些条件是可以满足的。散列算法对任意长的原文产生定长的值,但当原文的长度超过一定的程度是,散列值中就无法完全记录原文中的全部信息,这就意味着信息的丢失,所以理论上是不可能从散列值中恢复原文的。那为什么是理论上呢?当散列算法被完全破解时,也就是说可以从散列值恢复出任意的原文,具体点就是:假如原文信息量是I,散列值(如MD5的128位)信息量只有i,通常i<I,所以可以说I=i+i’。因为I没有限制,而i有限制,则i’没有限制。当进行散列算法时i’丢失了,如果散列算法被攻破,可以从i推导出I,但因为i'丢失了,意味着i+I’都可能是I(碰撞),I'可以为任意信息,并且 i’包含于I’中。理论上讲可以从I’中找到i’从而恢复原文。王小云的破解就是基于这种碰撞算法,她不需要破解出原文,只需要找到那个碰撞,它的MD5值和原文的MD5值一样,导致MD5验证的失效。那么以前两个例子来说:我要登录网站后台只需要随便生成一个碰撞的原文(不一定和原密码相同),它的MD5值和服务端上存的MD5值相同,就可以登录后台。从而导致MD5在信息安全上的失效。
只要算法足够好,密钥(K)足够保密,就可以保证通信安全,因为别人即使知道了密文(E)和算法ENC/DEC也无法知道原文,这就是为什么算法可以公开,密钥必须保密的原意。但是,如果有方法可以根据密文和算法推导出密钥或明文,就以为着这种密码被破解。那么在非对称密码中了,非对称密码技术又称为双密钥技术,即它所使用的是两个密钥,一个可以公开即公钥K1,一个是秘密的即私钥K2,他们需要满足:
那么既然MD5在2004年就被攻破了,为什么直到到现在依然还在用了?其实MD5等散列算法从设计的原理来讲,就有产生碰撞的可能,而王小云教授的方法缩短了找到碰撞的时间(大约一个小时左右,这可是一项非常重要的成果啊),但她找到得碰撞是没有实际意义的(强无碰撞),也就是说我们的原文是能够让人看懂的东西,但强无碰撞却无法产生有实际意义的原文,我们要能找到弱无碰撞(特定碰撞)才算是真正的破解,也就是说我们在一个程序里能插入病毒或木马使新产生的MD5与原MD5值相同,是别人无法察觉到我们对这个程序做了篡改,这样才达到了我们破解的真正目的。又如在生活中银行和客服之间的一次交易,我们用成千上万的大型计算机花了成千上万年破解,篡改了他们通信的签名,但这有什么意义呢!他们的交易在N年前就交易完成了,所以,MD5在实际应用中依然是没有问题的。
一个安全的哈希函数H必须具有以下属性:
l)H能够应用到大小不一的数据上。
2)H能够生成大小固定的输出。
3)对于任意给定的x,H(x)的计算相对简单。
4)对于任意给定的代码h,要发现满足H(x)=h的x在计算上是不可厅的。
5Hale Waihona Puke 对于任意给定的块x,要发现满足H(y)=H(x)而y=x在计算上是不可行的。
6)要发现满足H(X)=H(y)的(X,y)对在计算上是不可行的 。
简单的说,单向函数就是后向函数,只能计算以后的值,不能计算以前的值。
当前的Hash算法都具有一个一般的模式。其主要计算步骤有:
1)添加数据,使得输入数组的长度是某个数(一般为512)的倍数;
2)对添加的数据进行分组;
散列算法又被称为Hash算法、摘要算法、杂凑算法、签名算法
散列(Hash)函数对不同长度的输入信息,产生固定长度的输出。这个固定长度的输出称为原输入消息的“散列”或“消息摘要”(Message Dige)。散列是信息的提炼,通常其长度要比信息小的多,且为一个固定长度。加密性强的散列一定是不可逆的,这就意味着通过散列结果,无法推出任何部分的原始信息。同时,一般也不能找出具有相同散列结果的两条信息。
说了半天散列算法到底是干嘛的呢?在信息安全技术中,经常需要验证消息的完整性,查看原文是否被篡改了。这时就要用到散列算法,从上面散列算法的特性我们知道它对不定长的原文,产生固定长(如MD5是128位)的值,而这个值又对原文非常的敏感,即原文有一点微小的变法,输出地值都将与原值安全不同。大家在入侵网站时得到后台管理员密码通常都是一个需要解密的MD5值而不是明文吧(当然有的可以直接得到密码明文的垃圾网站例外),因为服务端值记录这个密码的MD5值,而不是记录密码本身,以后验证用户身份时,只需将用户输入的密码做一下MD5加密后,与记录的MD5值作一个比较即可验证密码的合法性(这只是对散列算法的一个小利用,它的真正作用请看下文)。大家在发布一个程序,为了防止别人在程序里插入病毒或木马,你可以发布这个程序文件的MD5值,这样别人下载你的程序后做一下MD5,然后和你公开的MD5值比较就可以知道这个程序是否被更改过。
散列算法基本原理
散列算法也被称为散列函数,是用来产生一些数据片段(例如消息或会话项)的散列值的算法。散列算法具有在输入数据中的更改可以更改结果散列值中每个比特的特性(输入信息有任何一点微小的变法,输出的散列都将不一样),因此,散列对于检测诸如消息或者密钥等信息对象中的任何微小变化很有用。此外,好的散列算法使得构造两个独立的有相同散列的输入不能通过计算方法实现。散列算法就是争取一个萝卜一个坑的原则。(因此MD5解密网站的原理大家应该可以猜到了吧)
3)初始化输出值,根据输出值和分组进行计算,得到一个新的输出值;
4)继续步骤1,直到所有分组都计算完毕;
5)输出结果值。
这里顺便介绍下费尔马小定理(Fermat's Little Theorem)这种数学上的单向限门函数的特点是一个方向求值很容易,但其逆向计算却很困难(只是很难)。许多形式为Y=f(X)的函数,对于给定的自变量X的值,很容易计算出函数Y的值;而给定的Y值,在很多情况下依照函数关系飞f(X)计算X的值十分困难。RSA算法就是基于这种原理。但是,随着计算机速度的不断提高及计算机网络的发展(使用几千甚至上万台计算机同时进行分解)使逆向计算成为可能。
(3)MD5算法。MD5算法是由Rivest在1991年设计的,在RFC1321中描述。MD5按512位数据块为单位来处理输入,产生128为的信息摘要。
(4)SHA/SHA-1算法。SHA(Secure Hash Algoritnm)算法由NIST开发,并在1993年作为联邦信息处理标准公布。在1995年公布了其改进版本SHA-1。
(1)MD2算法。MD2算法是Rivest在1989年开发出来的,在处理过程中首先对信息进行补位,使得信息的长度是16的倍数,然后以一个16为的校验和最佳的信息的末尾,并根据这个新产生的信息生成128位的散列值。
(2)MD4算法。Rivest在1990年又开发出MD4算法。MD4算法也需要信息的填充,他要求信息在填充后加上448位能够被512整除。用64比特表示消息的长度,放在填充比特之后生成128位的散列值。
虽然王小云没有对散列算法达到实际意义上的破解,但她对密码技术的发展所作出的贡献依然是非常显著的,她推动着以后的密码算法设计走向一个新高度。
这里我要说一下关于密码破解,在对称密码(大家可以去查一下关于对称密码技术和非对称密码技术的资料)中,加密解密用的是相同的密钥,甚至可能用相同的算法。它的用途是:
发生方将原文(M)用密钥(K)用算法ENC加密得到密文:E=ENC(M,K)
通过网络将密文E传给接收方
接收方用相同的密钥(K)解密用算法DEC解密:M=DEC(E,K)
1.K2是K1的逆;2.由K1出发去求解K2十分困难;3.K1和K2要容易计算;
其有两种表现形式,一种是公钥加密然后私钥解密,一种是私钥加密然后公钥解密。
发送方自己生成一对密钥:私钥(KA)和公钥(KPA)
接收方也生成一对密钥:(KB)和(KPB)
发送方和接收方交换公钥
其中公钥是公开的即(KPA)和(KPB)是公开的
发送方用接收方的KPB加密得到密文:E=ENC(ENC(M,KA),KPB)
接收方用发送方的KPA解密得到原文:M=DEC(DEC(E,KB),KPA)
双方都不需要知道对方的私钥,避免了约定密钥导致的不安全。
当然,如果有方法可以从公钥推导出私钥来,从而得到原文,则这种算法被破解。
综上,破解是通过一定的方法推导出原文,而王小云教授并不是推导出原文,而是通过其他方法找到了一个能产生相同散列值的消息,因此她并不是违背散列算法的原理来破解散列算法。所以我们说的MD5破解,本身就是对散列算法的一种误解。
那王小云教授对MD5成功破解有是怎么一回事了?我们知道散列算法必须满足散列函数的属性,从理论上讲这些条件是可以满足的。散列算法对任意长的原文产生定长的值,但当原文的长度超过一定的程度是,散列值中就无法完全记录原文中的全部信息,这就意味着信息的丢失,所以理论上是不可能从散列值中恢复原文的。那为什么是理论上呢?当散列算法被完全破解时,也就是说可以从散列值恢复出任意的原文,具体点就是:假如原文信息量是I,散列值(如MD5的128位)信息量只有i,通常i<I,所以可以说I=i+i’。因为I没有限制,而i有限制,则i’没有限制。当进行散列算法时i’丢失了,如果散列算法被攻破,可以从i推导出I,但因为i'丢失了,意味着i+I’都可能是I(碰撞),I'可以为任意信息,并且 i’包含于I’中。理论上讲可以从I’中找到i’从而恢复原文。王小云的破解就是基于这种碰撞算法,她不需要破解出原文,只需要找到那个碰撞,它的MD5值和原文的MD5值一样,导致MD5验证的失效。那么以前两个例子来说:我要登录网站后台只需要随便生成一个碰撞的原文(不一定和原密码相同),它的MD5值和服务端上存的MD5值相同,就可以登录后台。从而导致MD5在信息安全上的失效。
只要算法足够好,密钥(K)足够保密,就可以保证通信安全,因为别人即使知道了密文(E)和算法ENC/DEC也无法知道原文,这就是为什么算法可以公开,密钥必须保密的原意。但是,如果有方法可以根据密文和算法推导出密钥或明文,就以为着这种密码被破解。那么在非对称密码中了,非对称密码技术又称为双密钥技术,即它所使用的是两个密钥,一个可以公开即公钥K1,一个是秘密的即私钥K2,他们需要满足:
那么既然MD5在2004年就被攻破了,为什么直到到现在依然还在用了?其实MD5等散列算法从设计的原理来讲,就有产生碰撞的可能,而王小云教授的方法缩短了找到碰撞的时间(大约一个小时左右,这可是一项非常重要的成果啊),但她找到得碰撞是没有实际意义的(强无碰撞),也就是说我们的原文是能够让人看懂的东西,但强无碰撞却无法产生有实际意义的原文,我们要能找到弱无碰撞(特定碰撞)才算是真正的破解,也就是说我们在一个程序里能插入病毒或木马使新产生的MD5与原MD5值相同,是别人无法察觉到我们对这个程序做了篡改,这样才达到了我们破解的真正目的。又如在生活中银行和客服之间的一次交易,我们用成千上万的大型计算机花了成千上万年破解,篡改了他们通信的签名,但这有什么意义呢!他们的交易在N年前就交易完成了,所以,MD5在实际应用中依然是没有问题的。
一个安全的哈希函数H必须具有以下属性:
l)H能够应用到大小不一的数据上。
2)H能够生成大小固定的输出。
3)对于任意给定的x,H(x)的计算相对简单。
4)对于任意给定的代码h,要发现满足H(x)=h的x在计算上是不可厅的。
5Hale Waihona Puke 对于任意给定的块x,要发现满足H(y)=H(x)而y=x在计算上是不可行的。
6)要发现满足H(X)=H(y)的(X,y)对在计算上是不可行的 。
简单的说,单向函数就是后向函数,只能计算以后的值,不能计算以前的值。
当前的Hash算法都具有一个一般的模式。其主要计算步骤有:
1)添加数据,使得输入数组的长度是某个数(一般为512)的倍数;
2)对添加的数据进行分组;
散列算法又被称为Hash算法、摘要算法、杂凑算法、签名算法
散列(Hash)函数对不同长度的输入信息,产生固定长度的输出。这个固定长度的输出称为原输入消息的“散列”或“消息摘要”(Message Dige)。散列是信息的提炼,通常其长度要比信息小的多,且为一个固定长度。加密性强的散列一定是不可逆的,这就意味着通过散列结果,无法推出任何部分的原始信息。同时,一般也不能找出具有相同散列结果的两条信息。
说了半天散列算法到底是干嘛的呢?在信息安全技术中,经常需要验证消息的完整性,查看原文是否被篡改了。这时就要用到散列算法,从上面散列算法的特性我们知道它对不定长的原文,产生固定长(如MD5是128位)的值,而这个值又对原文非常的敏感,即原文有一点微小的变法,输出地值都将与原值安全不同。大家在入侵网站时得到后台管理员密码通常都是一个需要解密的MD5值而不是明文吧(当然有的可以直接得到密码明文的垃圾网站例外),因为服务端值记录这个密码的MD5值,而不是记录密码本身,以后验证用户身份时,只需将用户输入的密码做一下MD5加密后,与记录的MD5值作一个比较即可验证密码的合法性(这只是对散列算法的一个小利用,它的真正作用请看下文)。大家在发布一个程序,为了防止别人在程序里插入病毒或木马,你可以发布这个程序文件的MD5值,这样别人下载你的程序后做一下MD5,然后和你公开的MD5值比较就可以知道这个程序是否被更改过。
散列算法基本原理
散列算法也被称为散列函数,是用来产生一些数据片段(例如消息或会话项)的散列值的算法。散列算法具有在输入数据中的更改可以更改结果散列值中每个比特的特性(输入信息有任何一点微小的变法,输出的散列都将不一样),因此,散列对于检测诸如消息或者密钥等信息对象中的任何微小变化很有用。此外,好的散列算法使得构造两个独立的有相同散列的输入不能通过计算方法实现。散列算法就是争取一个萝卜一个坑的原则。(因此MD5解密网站的原理大家应该可以猜到了吧)
3)初始化输出值,根据输出值和分组进行计算,得到一个新的输出值;
4)继续步骤1,直到所有分组都计算完毕;
5)输出结果值。
这里顺便介绍下费尔马小定理(Fermat's Little Theorem)这种数学上的单向限门函数的特点是一个方向求值很容易,但其逆向计算却很困难(只是很难)。许多形式为Y=f(X)的函数,对于给定的自变量X的值,很容易计算出函数Y的值;而给定的Y值,在很多情况下依照函数关系飞f(X)计算X的值十分困难。RSA算法就是基于这种原理。但是,随着计算机速度的不断提高及计算机网络的发展(使用几千甚至上万台计算机同时进行分解)使逆向计算成为可能。
(3)MD5算法。MD5算法是由Rivest在1991年设计的,在RFC1321中描述。MD5按512位数据块为单位来处理输入,产生128为的信息摘要。
(4)SHA/SHA-1算法。SHA(Secure Hash Algoritnm)算法由NIST开发,并在1993年作为联邦信息处理标准公布。在1995年公布了其改进版本SHA-1。