MD5 相同的情况叫做“碰撞”,现在网络中已经出现了两个相同的 MD5 可执行文件,所以MD5现在已经被弃用了,发生碰撞的概率是1/(2^128)。
SHA-1 也会发生碰撞,但是几率比 MD5 小的多。
2004年,我国中科院院士王小云证实md5算法无法防止碰撞,因此,不适用于安全性认证。在2005年,王小云院士提出了md5哈希碰撞,公式如下
因为她的研究成果表明了给定消息 M1
,能够计算获取 M2
,使得 M2
产生的散列值与 M1
产生的散列值相同,即:
于是MD5不满足抗碰撞性,于是不再是安全的散列算法
例:
字符串1
字符串2
上方两个字符串的 MD5 值完全相同。
常见MD5碰撞
md5值为0e开头
例题: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值是一定的
常见的撞库方法:
异性相吸
异性相吸,会想到要进行异或操作,所以,要将这两个文件转化成二进制才能能进行异或
将这两个文件拖入16进制编辑器中,转换成二进制,
得到二进制数据之后进行异或操作就可以
a='0000011100011111000000000000001100001000000001000001001001010101000000110001000001010100010110000100101101011100010110000100101001010110010100110100010001010010000000110100010000000010010110000100011000000110010101000100011100000101010101100100011101010111010001000001001001011101010010100001010000011011'
b='0110000101110011011000010110010001110011011000010111001101100100011000010111001101100100011000010111001101100100011000010111001101100100011000010111001101100100011000010111001101100100011000010111001101100100011000010111001101100100011000010111001101100100011100010111011101100101011100110111000101100110'
c=''
for i in range(len(a)):
if(a[i]==b[i]):
c+='0'
else:
c+='1'
print(c)
结果是
然后再将其转化成字符串
用16进制编辑器新建一个文本文件,复制二进制数据,粘贴到(从二进制文本粘贴),即可得到flag
RSAROLL
在date文件中,有好几组数据,第一个花括号中有两个数,第一个数比较长,猜测应该是n,后面较小应该是e,用在线分解网址,将n分解成p和q
然后将下面所有的数据都当成密文,解出明文
import gmpy2
N, 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
( 这两个文件打不开)