题目:
我们得到了一串神秘字符串: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] = chartest_string = ''.join(temp_pattern)# 计算该字符串的MD5值md5_hash = hashlib.md5(test_string.encode('utf-8')).hexdigest().upper()# 检查MD5值是否匹配match = Truefor i in range(len(partial_md5)):if partial_md5[i] != '?' and partial_md5[i] != md5_hash[i]:match = Falsebreak# 如果匹配,返回结果if match:return test_string, md5_hashreturn None, None# 运行函数
original_string, full_md5 = find_original_string()if original_string:print(f"神秘字符串: {original_string}")print(f"完整的MD5哈希: {full_md5}")
else:print("没有找到匹配的字符串。")
运行即可获得结果