MD5 相同的情况叫做“碰撞”,现在网络中已经出现了两个相同的 MD5 可执行文件,所以MD5现在已经被弃用了,发生碰撞的概率是1/(2^128)。
SHA-1 也会发生碰撞,但是几率比 MD5 小的多。
2004年,我国中科院院士王小云证实md5算法无法防止碰撞,因此,不适用于安全性认证。在2005年,王小云院士提出了md5哈希碰撞,公式如下
f(f(s, M), M') = f(f(s, N), N')
因为她的研究成果表明了给定消息 M1
,能够计算获取 M2
,使得 M2
产生的散列值与 M1
产生的散列值相同,即:
MD5(M1)=MD5(M2)
于是MD5不满足抗碰撞性,于是不再是安全的散列算法
例:
字符串1
4d c9 68 ff 0e e3 5c 20 95 72 d4 77 7b 72 15 87
d3 6f a7 b2 1b dc 56 b7 4a 3d c0 78 3e 7b 95 18
af bf a2 00 a8 28 4b f3 6e 8e 4b 55 b3 5f 42 75
93 d8 49 67 6d a0 d1 55 5d 83 60 fb 5f 07 fe a2
字符串2
4d c9 68 ff 0e e3 5c 20 95 72 d4 77 7b 72 15 87
d3 6f a7 b2 1b dc 56 b7 4a 3d c0 78 3e 7b 95 18
af bf a2 02 a8 28 4b f3 6e 8e 4b 55 b3 5f 42 75
93 d8 49 67 6d a0 d1 d5 5d 83 60 fb 5f 07 fe a2
上方两个字符串的 MD5 值完全相同。
常见MD5碰撞
md5值为0e开头
0e830400451993494058024219903391 s878926199a 0e545993274517709034328855841020 s155964671a 0e342768416822451524974117254469 s214587387a 0e848240448830537924465865611904 s214587387a 0e848240448830537924465865611904 s878926199a 0e545993274517709034328855841020 s1091221200a 0e940624217856561557816327384675 s1885207154a 0e509367213418206700842008763514 s1502113478a 0e861580163291561247404381396064 s1885207154a 0e509367213418206700842008763514 s1836677006a 0e481036490867661113260034900752 s155964671a 0e342768416822451524974117254469 s1184209335a 0e072485820392773389523109082030 s1665632922a 0e731198061491163073197128363787 s1502113478a 0e861580163291561247404381396064 s1836677006a 0e481036490867661113260034900752 s1091221200a 0e940624217856561557816327384675 s155964671a 0e342768416822451524974117254469 s1502113478a 0e861580163291561247404381396064 s155964671a 0e342768416822451524974117254469 s1665632922a 0e731198061491163073197128363787 s155964671a 0e342768416822451524974117254469 s1091221200a 0e940624217856561557816327384675 s1836677006a 0e481036490867661113260034900752 s1885207154a 0e509367213418206700842008763514 s532378020a 0e220463095855511507588041205815 s878926199a 0e545993274517709034328855841020 s1091221200a 0e940624217856561557816327384675 s214587387a 0e848240448830537924465865611904 s1502113478a 0e861580163291561247404381396064 s1091221200a 0e940624217856561557816327384675 s1665632922a 0e731198061491163073197128363787 s1885207154a 0e509367213418206700842008763514 s1836677006a 0e481036490867661113260034900752 s1665632922a 0e731198061491163073197128363787 s878926199a 0e545993274517709034328855841020
例题:buuctf 还原大师
代码
import hashlib
k = 'TASC?O3RJMV?WDJKX?ZM' #要还原的明文
for i in range(26):temp1 = k.replace('?',str(chr(65+i)),1)for j in range(26):temp2 = temp1.replace('?',chr(65+j),1)for n in range(26):temp3 = temp2.replace('?',chr(65+n),1)s = hashlib.md5(temp3.encode('utf8')).hexdigest().upper()#注意大小写if s[:4] == 'E903': #检查元素print ('flag{' + s + '}') #输出密文
MD5撞库
md5在理论上是几乎无法破解的,但是可以撞库。
撞库的前提,固定的字符串其对应的MD5值是一定的
撞库攻击也就是黑客通过收集互联网已泄露的用户+密码信息,生成对应的字典表,尝试批量登陆其他网站后,得到一系列可以登陆的用户,这样一旦用户为了省事,在多个网站设置了同样的用户名和密码的话,黑客很容易就会通过字典中已有的信息,登录到这些网站,从而获得用户的相关信息,如:手机号码、身份证号码、家庭住址,支付宝及网银信息等。这些信息泄露后,不仅会给用户和精神和经济带来巨大损失,同时也会给相关网站带来负面影响。
————————————————
版权声明:本文为CSDN博主「法海老方丈」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_44437000/article/details/97677657
常见的撞库方法:
原文链接:常见的三种撞库方法_网易数帆社区博客-CSDN博客_撞库
https://blog.csdn.net/wangyiyungw/article/details/84584163
异性相吸
异性相吸,会想到要进行异或操作,所以,要将这两个文件转化成二进制才能能进行异或
将这两个文件拖入16进制编辑器中,转换成二进制,
得到二进制数据之后进行异或操作就可以
a='0000011100011111000000000000001100001000000001000001001001010101000000110001000001010100010110000100101101011100010110000100101001010110010100110100010001010010000000110100010000000010010110000100011000000110010101000100011100000101010101100100011101010111010001000001001001011101010010100001010000011011'
b='0110000101110011011000010110010001110011011000010111001101100100011000010111001101100100011000010111001101100100011000010111001101100100011000010111001101100100011000010111001101100100011000010111001101100100011000010111001101100100011000010111001101100100011100010111011101100101011100110111000101100110'
c=''
for i in range(len(a)):if(a[i]==b[i]):c+='0'else:c+='1'
print(c)
结果是
0110011001101100011000010110011101111011011001010110000100110001011000100110001100110000001110010011100000111000001110010011100100110010001100100011011100110110011000100011011101100110001110010011010101100010001101010011010001100001001101110011010000110011001101010110010100111000001110010110010101111101
然后再将其转化成字符串
用16进制编辑器新建一个文本文件,复制二进制数据,粘贴到(从二进制文本粘贴),即可得到flag
flag{ea1bc0988992276b7f95b54a7435e89e}
RSAROLL
在date文件中,有好几组数据,第一个花括号中有两个数,第一个数比较长,猜测应该是n,后面较小应该是e,用在线分解网址,将n分解成p和q
然后将下面所有的数据都当成密文,解出明文
import gmpy2N, p, q, e = 920139713, 18443, 49891, 19
d = gmpy2.invert(e, (p - 1) * (q - 1))
result = []
with open("C:\\Users\\惠普\\Desktop\\buuctf 29题\\RsaRoll\\data.txt", "r") as f:for line in f.readlines():line = line.strip('\n') # 去掉列表中每一个元素的换行符result.append(chr(pow(int(line), d, N)))
flag = ''
for i in result:flag += i
print(flag)
print(result)
RSA
( 这两个文件打不开)