0
点赞
收藏
分享

微信扫一扫

MD5碰撞与撞库和题

码农K 2022-03-12 阅读 72
安全

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

( 这两个文件打不开)

举报

相关推荐

0 条评论