MD5碰撞和我眼中的MD5

      MD5的全称是Message-Digest Algorithm 5(信息-摘要算法5),是一种用于产生数字签名的单项散列算法,在1991年由MIT Laboratory for Computer Science(IT计算机科学实验室)和RSA Data Security Inc(RSA数据安全公司)的Ronald L. Rivest教授开发出来。

    

     对于原始密码,MD5加密时并没有对长度进行要求,这导致可输入字符为,大写字母+小写字母+数字+符号(26+26+10+33=95,符号为键盘上所能看到的,并未加入其它特殊字符,如/X12等)。而输出的密码为32位,大写字母+数字(26+10=36)。有此可以看出输出密码最多为36的32次方种。而输入密码却有无数种可能。即当输入位数超过㏒95(32^36)时就会产生加密后的文字重复。即可导致碰撞。(这里并没有加入不可输入字符,即ASCII中存在的,但不能从键盘直接输入的。)有此可以看出。MD5产生碰撞时必然的,并非偶然。

 

      在2004年8月17日的美国加州圣巴巴拉召开的国际密码学会议(Crypto’2004)上来自山东大学的王小云教授做了破译MD5、HAVAL-128、 MD4和RIPEMD算法的报告。MD5和SHA-1属于散列算法,从设计原理来讲,就有产生碰撞的可能,王小云教授的方法缩短了找到碰撞的时间,是一项重要的成果。

 

     所谓的碰撞其实原理很简单,就是找到一组新密码(可能和原本密码相同),对其进行MD5加密运算。使得加密后的密码和原本密码相同,则可以通过比较运算。就好比MD5为算术运算。对3+3进行运算可得到加密后的密码为6。当我们通过某种办法找到加密后的密码6的时候,就可以通过一些列算法得到一组新的密码为2+6,这样我们把2+6拿去加密运算依然可以得到加密后的密码6。这样就可以混淆程序,通过验证。

 

     但如果给原始密码加入一些特定的信息,然后进行加密就会得到其他效果,哪怕拿到加密后的密码时也无法进行碰撞。如同上面算法 当我输入3+3 后  系统自动帮我在其后加入一个数字如 10 ,则可以得到原文为3+3+10,对其进行运算可得到加密后的密码为16。当我们通过某种办法得到该加密后的密码16时进行碰撞,可能会得到新密码 8+8 。但是当输入8+8时,系统也会再其后加入一个数字如 10,则输入为8+8+10,这样再通过加密,会得到加密后的密码26,这样就无法和16进行比对了,这样可以使得MD5碰撞失去意义。

 

      所以当在进行密码录入的时候,可以对密码进行增强型过滤,如在其开头结尾加入特定字符,就可以使得MD5碰撞失去意义。

 

     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
sha碰撞,MD5碰撞实现,#!/usr/local/bin/perl # It was noted that Intel IA-32 C compiler generates code which # performs ~30% *faster* on P4 CPU than original *hand-coded* # SHA1 assembler implementation. To address this problem (and # prove that humans are still better than machines:-), the # original code was overhauled, which resulted in following # performance changes: # # compared with original compared with Intel cc # assembler impl. generated code # Pentium -25% +37% # PIII/AMD +8% +16% # P4 +85%(!) +45% # # As you can see Pentium came out as looser:-( Yet I reckoned that # improvement on P4 outweights the loss and incorporate this # re-tuned code to 0.9.7 and later. # ---------------------------------------------------------------- # Those who for any particular reason absolutely must score on # Pentium can replace this module with one from 0.9.6 distribution. # This "offer" shall be revoked the moment programming interface to # this module is changed, in which case this paragraph should be # removed. # ---------------------------------------------------------------- # $normal=0; push(@INC,"perlasm","../../perlasm"); require "x86asm.pl"; &asm_init($ARGV[0],"sha1-586.pl",$ARGV[$#ARGV] eq "386"); $A="eax"; $B="ecx"; $C="ebx"; $D="edx"; $E="edi"; $T="esi"; $tmp1="ebp"; $off=9*4; @K=(0x5a827999,0x6ed9eba1,0x8f1bbcdc,0xca62c1d6); &sha1_block_data("sha1_block_asm_data_order"); &asm_finish(); sub Nn { local($p)=@_; local(%n)=($A,$T,$B,$A,$C,$B,$D,$C,$E,$D,$T,$E); return($n{$p}); } sub Np { local($p)=@_; local(%n)=($A,$T,$B,$A,$C,$B,$D,$C,$E,$D,$T,$E); local(%n)=($A,$B,$B,$C,$C,$D,$D,$E,$E,$T,$T,$A); return($n{$p}); } sub Na { local($n)=@_; return( (($n )&0x0f), (($n+ 2)&0x0f), (($n+ 8)&0x0f), (($n+13)&0x0f), (($n+ 1)&0x0f)); } sub X_expand { local($in)=@_; &comment("First, load the words onto the stack in network byte order"); for ($i=0; $i<16; $i+=2) { &mov($A,&DWP(($i+0)*4,$in,"",0));# unless $i == 0; &mov($B,&DWP(($i+1)*4,$in,"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值