还原大师-遍历残缺字符串匹配md5杂凑值
题目:
我们得到了一串神秘字符串:TASC?O3RJMV?WDJKX?ZM,问号部分是未知大写字母,
为了确定这个神秘字符串,我们通过了其他途径获得了这个字串的32位MD5码。
但是我们获得它的32位MD5码也是残缺不全,E903???4DAB????08?????51?80??8A?,
请猜出神秘字符串的原本模样,并且提交这个字串的32位MD5码作为答案。
神秘字符串所有的可能性数量并不多,直接遍历
脚本如下:(回看题目发现字符集写多了,题目说了只有大写字母的)
import hashlib
import itertools
# 已知字符串和MD5部分
pattern = 'TASC?O3RJMV?WDJKX?ZM'
partial_md5 = 'E903???4DAB????08?????51?80??8A?'
# 用于替代的字符集(大写字母 + 数字)
characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
# 获取所有的问号位置
question_marks_indices = [i for i, c in enumerate(pattern) if c == '?']
# 暴力破解
def find_original_string():
# 生成所有可能的字母和数字组合
for replacement in itertools.product(characters, repeat=len(question_marks_indices)):
# 将字符替换到原始字符串
temp_pattern = list(pattern)
for idx, char in zip(question_marks_indices, replacement):
temp_pattern[idx] = char
test_string = ''.join(temp_pattern)
# 计算该字符串的MD5值
md5_hash = hashlib.md5(test_string.encode('utf-8')).hexdigest().upper()
# 检查MD5值是否匹配
match = True
for i in range(len(partial_md5)):
if partial_md5[i] != '?' and partial_md5[i] != md5_hash[i]:
match = False
break
# 如果匹配,返回结果
if match:
return test_string, md5_hash
return None, None
# 运行函数
original_string, full_md5 = find_original_string()
if original_string:
print(f"神秘字符串: {original_string}")
print(f"完整的MD5哈希: {full_md5}")
else:
print("没有找到匹配的字符串。")
运行即可获得结果

浙公网安备 33010602011771号