还原大师-遍历残缺字符串匹配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("没有找到匹配的字符串。")

运行即可获得结果

posted @ 2025-01-09 14:17  Draina  阅读(62)  评论(0)    收藏  举报