初识md5碰撞与crc32碰撞
现在是晚上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碰撞的更多相关文章
- 破解压缩包的几种方式(zip伪加密 爆破 CRC32碰撞 已知明文攻击)
zip伪加密 zip文件是由3部分组成,详见文末 压缩源文件数据区+压缩源文件目录区+压缩源文件目录结束标志 在压缩源文件数据区有个2字节的 全局方式位标记 ,在压缩源文件目录区也有个2字节的 全局方 ...
- 密码学系列之:碰撞抵御和碰撞攻击collision attack
密码学系列之:碰撞抵御和碰撞攻击collision attack 简介 hash是密码学和平时的程序中经常会用到的一个功能,如果hash算法设计的不好,会产生hash碰撞,甚至产生碰撞攻击. 今天和大 ...
- 游戏中的2D OBB碰撞模型的碰撞算法介绍和实践
前言 上一篇博文说道,射线与场景中模型上的所有三角形求交时,会大幅度影响效率且花费比较多的时间,因此会采取使用包围盒的形式,进行一个加速求交.在此文中介绍OBB碰撞模型的碰撞算法 OBB的碰撞模型 有 ...
- python中常用的base64 md5 aes des crc32等的加密解密
1.base64 Python内置的base64模块可以实现base64.base32.base16.base85.urlsafe_base64的编码解码,python 3.x通常输入输出都是二进制形 ...
- unity 2d碰撞/ui组件碰撞
首先,ugui的碰撞是可以用Collision2D跟Rigidbody2D实现的(就跟3D碰撞一样).之前试过不可以主要问题正在于Collision2D以及Rigidbody的设置上. 碰撞双方都添加 ...
- 数据摘要算法的测试效率(SHA、MD5和CRC32)
1.算法概述 数据摘要算法是密码学算法中非常重要的一个分支,它通过对所有数据提取指纹信息以实现数据签名.数据完整性校验等功能,由于其不可逆性,有时候会被用做敏感信息的加密.数据摘要算法也被称为哈希(H ...
- PHP内核探索:哈希碰撞攻击是什么?
最近哈希表碰撞攻击(Hashtable collisions as DOS attack)的话题不断被提起,各种语言纷纷中招.本文结合PHP内核源码,聊一聊这种攻击的原理及实现. 哈希表碰撞攻击的基本 ...
- K:hash(哈希)碰撞攻击
相关介绍: 哈希表是一种查找效率极高的数据结构,很多语言都在内部实现了哈希表.理想情况下哈希表插入和查找操作的时间复杂度均为O(1),任何一个数据项可以在一个与哈希表长度无关的时间内计算出一个哈希值 ...
- Unity 几种碰撞模式
1.OnControllerColliderHit 事件 (角色控制器使用) 2.Physics.Raycast 函数 3.OnTriggerEnter 事件 (碰撞物体使用,给碰撞物体添加碰撞器, ...
随机推荐
- [转]Sql server 大数据量分页存储过程效率测试附代码
本文转自:http://www.cnblogs.com/lli0077/archive/2008/09/03/1282862.html 在项目中,我们经常遇到或用到分页,那么在大数据量(百万级以上)下 ...
- [转]Sql Server参数化查询之where in和like实现详解
本文转自;http://www.cnblogs.com/lzrabbit/archive/2012/04/22/2465313.html 文章导读 拼SQL实现where in查询 使用CHARIND ...
- iOS:延时执行的三种方式
延时执行的三种方式:performSelectorXXX方法.GCD中延时函数.创建定时器 第一种方式:NSObject分类当中的方法,延迟一段时间调用某一个方法 @interface NSObj ...
- Storm应用系列之——集成Kafka
本文系原创系列,转载请注明. 原帖地址:http://blog.csdn.net/xeseo 前言 在前面Storm系列之——基本概念一文中,提到过Storm的Spout应该是源源不断的取数据,不能间 ...
- 流畅的python第十一章接口学习记录
鸭子协议(忽略对象真正类型,转而关注对象有没有实现所需的方法,签名和语义) 标准库中的抽象基类 collections.abc模块中的抽象基类 抽象方法是抽象基类中用来强制子类必须实现的方法,如果子类 ...
- 格雷码C++递归实现
昨天参加腾讯的笔试,结果答的一塌糊涂,大题第一题是关于格雷码的递归实现的,当时没写出来,今天查了下资料试着用C++实现一下. #include <iostream> #include &l ...
- C#秘密武器之表达式树
一.表达式树入门 Lambda表达式树很复杂,从概念上很难理解清楚,一句话,表达式树是一种数据结构!这里我们通过下面的这个例子来理解一下表达式树,你就能看个大概: lambda表达式树动态创建方法 s ...
- 关于bitmap recycle trying to use a recycled bitmap android.graphics.Bitmap
在开发中,一直使用4.0以上手机作为測试机所以一直没有出现这个问题,今天换了2.3版本号的手机.出现了这个错误: trying to use a recycled bitmap android.gra ...
- 使用caffe的HDF5数据完毕回归任务
一直在研究怎样用caffe做行人检測问题.然而參考那些经典结构比方faster-rcnn等,都是自己定义的caffe层来完毕的检測任务. 这些都要求对caffe框架有一定程度的了解.近期看到了怎样用c ...
- 【DB2】If 'db2' is not a typo you can run the following command to lookup the package that contains the binary: command-not-found db2 bash: db2: command not found
数据库安装以后,db2报错如下: If 'db2' is not a typo you can run the following command to lookup the package that ...