初识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参数化查询之where in和like实现详解
本文转自;http://www.cnblogs.com/lzrabbit/archive/2012/04/22/2465313.html 文章导读 拼SQL实现where in查询 使用CHARIND ...
- 深入理解Java中为什么内部类可以访问外部类的成员
内部类简介 虽然Java是一门相对比较简单的编程语言,但是对于初学者, 还是有很多东西感觉云里雾里, 理解的不是很清晰.内部类就是一个经常让初学者感到迷惑的特性. 即使现在我自认为Java学的不错了, ...
- Node & Cheerio & WebStorm 学习实验
准备用cheerio去抓一些网页看看. 可以参考的材料有: http://www.cnblogs.com/CraryPrimitiveMan/p/3674421.html http://cnodejs ...
- Hadoop平台配置汇总
Hadoop平台配置汇总 @(Hadoop) Hadoop hadoop-env.sh和yarn-env.sh中export log和pid的dir即可和JAVA_HOME. core-site.xm ...
- 可以ping通虚拟机但不能telnet 9000端口
突然发现eclipse不能连上虚拟机了,报错是本机连接不上9000的端口. 觉得有点奇怪,就在命令行里试图ping通虚拟机,成功:但尝试这telnet 9000端口的时候,却报错连接不上. 上网查了这 ...
- JAVA简单选择排序算法原理及实现
简单选择排序:(选出最小值,放在第一位,然后第一位向后推移,如此循环)第一位与后面每一个逐个比较,每次都使最小的置顶,第一位向后推进(即刚选定的第一位是最小值,不再参与比较,比较次数减1) 复杂度: ...
- 主动通知Android系统图库进行更新
项目中遇到调用图库进行图片的选择,因为不能主动及时更新,遂实现代码调用实现主动及时更新. 废话不多刷,看代码. 方式一,发送一个广播, sendBroadcast(new Intent(Intent. ...
- Js、JQuery脚本兼容
1.获取属性值 IE:$("#xxx").prop("title"); chrome:$("#xxx").attr("title& ...
- IBM-ETP 实训项目前一天
明天就要开始项目了,实训项目,虽然之前做了几个项目,但是明天就要被一个有着8年项目经验的大牛带着做这个项目了.心中还是不免有点兴奋的.希望能学到更多的东西,来充实自己. 自己也搭建了一个小的demo ...
- 我装win8与win7双系统的血泪史
前段时间教徒弟装系统,由于笔记本原带了win8,他不想换掉原来的系统.遂决定装个双系统.于是按照之前的一贯套路,但是出现了问题. 一. 首先遇到的问题是:如何进入BIOS,设置成U盘启动.Win XP ...