现在是晚上23:29。写这篇文章呢,是因为早些时候我胃疼,是因为凉导致的胃疼。凉呢喝了一些热水,喝完热水胃倒是不疼了,但是由于我喝的是茶叶开水,于是就导致失眠了。想来想去这漫漫长夜也没意思,于是就决定写这个了。

0X01

这个md5碰撞到底是个什么东西呢,这是王小云发明的一种破解md5摘要算法的的一种方法。这个md5密文,有16位的md5以及32位的md5,然而,32位的md5密文和16位的md5密文它们的区别就是长度不一样,其他没有什么技术上的区别。将同一个字符串加密为16位md5密文和32位md5密文,在32位的md5中减去前8位和后8位,中间的部分就是它的16位md5。例如将字符串admin加密,admin的16位md5是7a57a5a743894a0e,32位md5是21232f297a57a5a743894a0e4a801fc3,去掉32位的前8位和后8位,你看它中间剩下的是不是就是16位md5了。md5密文是由字母和数字组成的,但是md5不区分大小写,也就是由26个字母和10个数字组成的16位的字符串。所以md5密文的总个数一共就是36的16次方个,也就是全宇宙的md5密文总共有1208925819614600000000000个,虽然这是一个很大的数,但是它终究是有限制的,它就只有这么多个,没有办法再+1了,再多一个就重复了,然而明文呢,却是无限制的,不限长度的有标点、大小写字母以及数字组成的字符串有无数个,这是没有办法估量,因为不限长度。然而这无限种明文却都可以用16位的md5表示出来,要用有限数量的东西去表示另一种无限数量的东西,就势必会存在重复,这就是碰撞。由于数量太大,就用数字来代替举例,例如0~9就是md5密文(有限个数),26个字母就是明文(明文数量远大于密文数量),用0表示a,1表示b,2表示c,最多只能表示10个字母。10个数字表示完前10个字母,然而又必须用10个数字表示完26个字母,那么就只能重复了,这是唯一的解决办法了,9表示的字母是i,i后面的字母是j,那这个j就必须要用已经用过的数字来表示了,这样的话从字母j开始,1个数字最少都要表示2个字母了,这就存在碰撞了。j就又要用0来表示。所以简单来说,碰撞算法就是找到另外一个加密以后md5值与原字符串相同的新字符串。碰撞算法会产生多少个结果呢,这是无法估计的,原因也是因为无法限制明文的长度是多少,假如说100位长度的时候就碰撞出md5值与admin相同的字符串,那长度是1000位呢,是100000呢,会碰撞出多少个字符串?这无法计算。如果限制了长度,万一碰撞不出来呢?就要调大长度了。

0X02

碰撞破解对安全的实质性影响?碰撞算法是一种能够100%破解掉md5的一种破解算法(就像穷举一样)。就用网页登陆做为例子,假如存在一个账号:root,它的密码是:a,然后网页向数据库查询账号root的密码的md5是多少,然后再对比输入的密码,如果输入的密码的md5与查询到的md5是一样的,那就说明账号和密码输入正确,允许登陆,否则账号密码错误。假如说a的md5是0,然后碰撞出j的md5密文也是0,那输入账号root和密码j会发生什么情况,肯定是允许登陆,因为原密码a的md5是0,而j的md5也是0,输入的密码的md5和数据库中查询到的密码md5是一样的,那就说明密码正确了,然后j并不是原始密码,而是碰撞出的密码。这就是碰撞破解。

0X03

理论上最多加密32的16次方+1次,就一定能碰撞出一个字符串的md5值跟某个字符串的md5相同,因为32的16次方就用完了所有的md5密文,因为md5密文的总个数就只有这么多个。再多1个字符串,就一定会出现两个字符串的md5值完全相同的情况了。这32的16次方对于个人电脑来说是不可能的,然而能够使用超级计算机的话,是100%能解md5的,如果你能够搜集到32的16次方个不同的md5密文所对应的明文,那么你就100%能够破解任何一个md5了。

0X04

碰撞破解并不是还原,md5是一种不可逆的加密,也就是说它本身就是无法还原的

0X05

crc32碰撞。crc32碰撞的概率相当高,这个我之前并不了解,是我在工作中偶然发现的,当时我还以为我发现了新大陆,结果谷歌一搜,早就有人发现了。这就是crc32碰撞。事件的起因是这样的,前段时间我用Python写了一个破解zip压缩包密码的程序,这个程序我已经开源,放在博客上可以任意下载免费使用,地址是www.tech-era.top/file/hackzip.zip。破解的原理是穷举,然后程序写好以后呢就要测试,于是我压缩了一个空白文本文档,我将压缩包的密码设置为56(设置为56是乱按的),密码设置为数字组成的两位数密码,是因为这只有10的2次方个,也就是字典中的密码只有100个,可以很快就穷举完。当穷举到56程序提示找到密码了,说明我写的这个程序是可以正常的工作的吧,然后我使用了另外一个字典,另外一个字典中并没有正确密码,这样做是因为我想要测试当字典中没有正确密码的时候程序会不会按照设计那样正常运行,然后使用这个我以为没有正确密码的字典时,程序仍然说找到了正确密码,当时我并不知道是为什么,明明字典中就没有正确密码,我还以为是有bug,但是我连这个诡异的bug是怎么出现的都不知道,因为不应该出现这个bug,然后我就用解压软件解压缩测试用的压缩包,当用设置的56做解压密码时成功解压缩了,然后我又用程序穷举出的另一个密码:612,还是成功解压缩了,然后我又用另外一个字典对压缩包进行穷举,发现1251也可以作为密码成功解压缩。然后后来又进行了各种各样的测试发现tm也可以作为密码,所以说这个crc32碰撞的概率很高啊,在10000次的范围内就碰撞出了两个密码(612和1251),当然,测试的前提条件是压缩包的内容的一个空白文本文档。但是压缩包是其他内容时,肯定也是存在碰撞的。

初识md5碰撞与crc32碰撞的更多相关文章

  1. 破解压缩包的几种方式(zip伪加密 爆破 CRC32碰撞 已知明文攻击)

    zip伪加密 zip文件是由3部分组成,详见文末 压缩源文件数据区+压缩源文件目录区+压缩源文件目录结束标志 在压缩源文件数据区有个2字节的 全局方式位标记 ,在压缩源文件目录区也有个2字节的 全局方 ...

  2. 密码学系列之:碰撞抵御和碰撞攻击collision attack

    密码学系列之:碰撞抵御和碰撞攻击collision attack 简介 hash是密码学和平时的程序中经常会用到的一个功能,如果hash算法设计的不好,会产生hash碰撞,甚至产生碰撞攻击. 今天和大 ...

  3. 游戏中的2D OBB碰撞模型的碰撞算法介绍和实践

    前言 上一篇博文说道,射线与场景中模型上的所有三角形求交时,会大幅度影响效率且花费比较多的时间,因此会采取使用包围盒的形式,进行一个加速求交.在此文中介绍OBB碰撞模型的碰撞算法 OBB的碰撞模型 有 ...

  4. python中常用的base64 md5 aes des crc32等的加密解密

    1.base64 Python内置的base64模块可以实现base64.base32.base16.base85.urlsafe_base64的编码解码,python 3.x通常输入输出都是二进制形 ...

  5. unity 2d碰撞/ui组件碰撞

    首先,ugui的碰撞是可以用Collision2D跟Rigidbody2D实现的(就跟3D碰撞一样).之前试过不可以主要问题正在于Collision2D以及Rigidbody的设置上. 碰撞双方都添加 ...

  6. 数据摘要算法的测试效率(SHA、MD5和CRC32)

    1.算法概述 数据摘要算法是密码学算法中非常重要的一个分支,它通过对所有数据提取指纹信息以实现数据签名.数据完整性校验等功能,由于其不可逆性,有时候会被用做敏感信息的加密.数据摘要算法也被称为哈希(H ...

  7. PHP内核探索:哈希碰撞攻击是什么?

    最近哈希表碰撞攻击(Hashtable collisions as DOS attack)的话题不断被提起,各种语言纷纷中招.本文结合PHP内核源码,聊一聊这种攻击的原理及实现. 哈希表碰撞攻击的基本 ...

  8. K:hash(哈希)碰撞攻击

    相关介绍:  哈希表是一种查找效率极高的数据结构,很多语言都在内部实现了哈希表.理想情况下哈希表插入和查找操作的时间复杂度均为O(1),任何一个数据项可以在一个与哈希表长度无关的时间内计算出一个哈希值 ...

  9. Unity 几种碰撞模式

    1.OnControllerColliderHit  事件 (角色控制器使用) 2.Physics.Raycast 函数 3.OnTriggerEnter 事件 (碰撞物体使用,给碰撞物体添加碰撞器, ...

随机推荐

  1. 关于mysql字段名和保留字冲突的问题

    建了个表,有个字段起名为key,结果insert语句报错了,说是sql不对. 原因:字段key和MySQL的保留字冲突了,当mysql的字段名和保留字冲突的时候,sql语句中的字段名需要加上反引号`` ...

  2. C#++c1FlexGrid+帮助文档09

    摘自: http://3y.uu456.com/bp-e2746s16s2d380eb62946d27-1.html C#:c1FlexGrid帮助文档:Value-MappedLists(值映射列表 ...

  3. 不要在基类析构函数中调用纯虚函数,否则运行时会报错“pure virtual method called”

    如上. 这是因为:delete派生类对象时,先调用派生类的析构函数,然后再调用基类的析构函数:此时如果调用纯虚函数的话,派生类的对象已经被破坏了,所以会报错. http://www.cnblogs.c ...

  4. 快速把web项目部署到weblogic上

    转自:http://weijie.blog.51cto.com/340746/90420/ weblogic简介         BEA WebLogic是用于开发.集成.部署和管理大型分布式Web应 ...

  5. android工具类(2)NetWorkHelper 网络工具类

    import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkIn ...

  6. tornado zbar 二维码识别 ,配合nginx 反向代理,supervisord 监控

    tornado zbar 二维码识别 ,配合nginx 反向代理,supervisord 监控 1.zbar识别二维码程序,python2.6.6 #!/usr/bin/env python # co ...

  7. React-Native系列Android——Touch事件原理及状态效果

    Native原生相比于Hybrid或H5最大长处是具有流畅和复杂的交互效果,触摸事件便是当中重要一项,包括点击(Click).长按(LongClick).手势(gesture)等. 以最简单常见的点击 ...

  8. Python-理解装饰器

    文章先由stackoverflow上面的一个问题引起吧,如果使用如下的代码: @makebold @makeitalic def say(): return "Hello" 打印出 ...

  9. gulp入门学习教程(入门学习记录)

    前言 最近在通过教学视频学习angularjs,其中有gulp的教学部分,对其的介绍为可以对文件进行合并,压缩,格式化,监听,测试,检查等操作时,看到前三种功能我的心理思想是,网上有很多在线压缩,在线 ...

  10. input text 去掉标签下拉提示autocomplete

    autocomplete 属性 autocomplete 属性规定输入字段是否应该启用自动完成功能. 自动完成允许浏览器预测对字段的输入.当用户在字段开始键入时,浏览器基于之前键入过的值,应该显示出在 ...