Unrecoverable - Writeup by AI题目信息项目内容来源Bugku类型Crypto考点伪随机数生成器、固定种子重现、替换密码考点分值权重表考点分值占比重要程度理解 random.seed() 固定种子的可重现性40%⭐⭐⭐⭐⭐构建字符映射关系30%⭐⭐⭐⭐Python random 模块的 shuffle 算法20%⭐⭐⭐逆向映射解密10%⭐⭐技术路线图分析加密逻辑 → 识别固定种子 → 重现 shuffle 过程 → 构建反向映射 → 解密密文 ↓ ↓ ↓ ↓ ↓ 替换密码 random.seed() random.shuffle() 字典构建 逐字符替换题目分析1. 代码分析查看challenge.pyimportrandomfromstringimportascii_lowercase,digitsfromsecretimportflag charsascii_lowercasedigits# abcdefghijklmnopqrstuvwxyz0123456789random.seed(2**1337-1)# 固定种子shuffled_chars[iforiinchars]random.shuffle(shuffled_chars)# 打乱字符顺序shuffled_chars.join(shuffled_chars)encforiinflag:ifi.isalnum():encshuffled_chars[chars.index(i)]# 替换加密else:enciprint(enc)# ctn44vmunc{3ghgsy_uto_coo2_gc_2asyoxg1ec}2. 加密原理字符集小写字母 a-z 数字 0-9共 36 个字符密钥使用固定种子2**1337 - 1进行 shuffle加密方式将每个字母数字字符替换为 shuffle 后对应位置的字符非字母数字字符保持不变如{、}、_3. 解题思路由于random.seed()使用了固定种子我们可以使用相同的种子重现完全相同的 shuffle 过程获得原始字符集到打乱字符集的映射关系构建反向映射表进行解密解题步骤步骤 1重现 shuffle 过程importrandomfromstringimportascii_lowercase,digits charsascii_lowercasedigits random.seed(2**1337-1)shuffled_chars[iforiinchars]random.shuffle(shuffled_chars)shuffled_chars.join(shuffled_chars)print(f原始字符集{chars})print(f打乱后字符集{shuffled_chars})输出原始字符集abcdefghijklmnopqrstuvwxyz0123456789 打乱后字符集mr02n3ytwjl4vsd6qxcue5kh981gfoazipb7步骤 2构建反向映射并解密# 密文encctn44vmunc{3ghgsy_uto_coo2_gc_2asyoxg1ec}# 构建反向映射表从打乱后的字符映射回原始字符reverse_map{}fori,cinenumerate(chars):reverse_map[shuffled_chars[i]]c# 解密decforiinenc:ifi.isalnum():decreverse_map[i]else:deciprint(f\n密文{enc})print(f明文{dec})完整解题脚本solve.pyimportrandomfromstringimportascii_lowercase,digits charsascii_lowercasedigits# 使用相同的种子重现 shuffle 过程random.seed(2**1337-1)shuffled_chars[iforiinchars]random.shuffle(shuffled_chars)shuffled_chars.join(shuffled_chars)print(f原始字符集{chars})print(f打乱后字符集{shuffled_chars})# 密文encctn44vmunc{3ghgsy_uto_coo2_gc_2asyoxg1ec}# 构建反向映射表从打乱后的字符映射回原始字符reverse_map{}fori,cinenumerate(chars):reverse_map[shuffled_chars[i]]c# 解密decforiinenc:ifi.isalnum():decreverse_map[i]else:deciprint(f\n密文{enc})print(f明文{dec})总结攻击链图谱固定种子泄露 → 确定性伪随机序列 → 可重现的 shuffle → 替换映射可逆 → 成功解密 ↓ ↓ ↓ ↓ ↓ 2^1337-1 random 内部状态 字符排列固定 构建逆映射 还原 flag核心知识点伪随机数的确定性相同的种子必然产生相同的随机序列Python random 模块基于 Mersenne Twister 算法种子确定后所有操作都可重现替换密码的本质一对一映射知道映射表即可逆向破解