根据题目提示,都猜得到这应该跟MD5的加密形式有关系
我好像还没有具体了解过MD5编码的格式,或许本题可以通过MD5的编码格式推导出字符串
但是说实话,MD5的加密方式没有找到详细简介的文章
然后我就去网上百度了一下,经过大佬wp的洗礼,知道这题考察的是MD5爆破
我个人理解的就是根据MD5的以下特性:
抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)非常困难。
所以在给出部分原数据和MD5值的情况下,根据题目提示
我们以26个大写字母依次遍历原字符串的三个问号位,并进行MD5编码
然后以给定MD5字符串的前4位E903与编码后的MD5字符串相比较,直到两者相等,输出
这里借鉴的以下大佬的wp写出了
import hashlib
'''hashlib 是一个提供了一些流行的hash(摘要)算法的Python标准库
其中所包括的算法有 md5, sha1, sha224, sha256, sha384, sha512等'''
str = 'TASC?O3RJMV?WDJKX?ZM'
for x in range(26):
temp1 = str.replace('?',chr(65+x),1) #用ascii开始,从A开始查
#replace 是一个字符串替换方法,这里的意思是将?替换为ascii码的A,并且只替换依次
#chr函数的意思是将给定的ascii值转换为字符
for y in range(26):
temp2 = temp1.replace('?',chr(65+y),1)
for n in range(26):
temp3 = temp2.replace('?',chr(65+n),1)
result = hashlib.md5(temp3.encode('utf8')).hexdigest().upper()#注意大小写
#这里的意思是将?替换完成后的字符串进行MD5编码,并且以大写16进制返回
if result[:4] == 'E903':#检查元素
print(result)
遍历后的字符串就是最终的结果