从贴吧神帖到实战:手把手教你用Python复现那个经典的5层摩斯密码(附完整代码)

张开发
2026/6/6 3:29:18 15 分钟阅读

分享文章

从贴吧神帖到实战:手把手教你用Python复现那个经典的5层摩斯密码(附完整代码)
五层加密的浪漫用Python还原摩斯密码表白全流程在2009年的百度贴吧一个名为《求救我已经快想爆了》的帖子引发了数万网友的集体解码狂欢。发帖男生为破解心仪女生设置的五层加密摩斯密码最终在网友帮助下成功破译出I LOVE YOU TOO的浪漫回应。如今我们将用Python完整复现这个经典密码学案例从摩斯解码到栅栏密码一步步揭开多层加密背后的技术奥秘。1. 环境准备与基础工具开始前需要确保Python环境已安装以下基础库pip install python-morse-converter我们将使用字典结构构建核心密码本这是后续所有解码步骤的基础# 摩斯密码对照表 MORSE_CODE { .-: A, -...: B, -.-.: C, -..: D, .: E, ..-.: F, --.: G, ....: H, ..: I, .---: J, -.-: K, .-..: L, --: M, -.: N, ---: O, .--.: P, --.-: Q, .-.: R, ...: S, -: T, ..-: U, ...-: V, .--: W, -..-: X, -.--: Y, --..: Z, -----: 0, .----: 1, ..---: 2, ...--: 3, ....-: 4, .....: 5, -....: 6, --...: 7, ---..: 8, ----.: 9 } # 传统手机键盘映射 PHONE_KEYPAD { 2: [A, B, C], 3: [D, E, F], 4: [G, H, I], 5: [J, K, L], 6: [M, N, O], 7: [P, Q, R, S], 8: [T, U, V], 9: [W, X, Y, Z] } # QWERTY键盘替换密码 QWERTY_MAP { Q: A, W: B, E: C, R: D, T: E, Y: F, U: G, I: H, O: I, P: J, A: K, S: L, D: M, F: N, G: O, H: P, J: Q, K: R, L: S, Z: T, X: U, C: V, V: W, B: X, N: Y, M: Z }2. 第一层摩斯密码解码原始密码字符串****-/*----/----*/****-/****-/*----/---**/*----/****-/*----/-****/***--/****-/*----/----*/**---/-****/**---/**---/***--/--***/****-/首先实现摩斯密码解析函数def decode_morse(ciphertext): # 替换符号统一格式 ciphertext ciphertext.replace(*, .).replace(-, -) return .join([MORSE_CODE[code] for code in ciphertext.split(/)]) # 测试解码 morse_result decode_morse(****-/*----/----*/****-/****-/*----/---**/*----/****-/*----/-****/***--/****-/*----/----*/**---/-****/**---/**---/***--/--***/****-/) print(morse_result) # 输出: 4194418141634192622374关键解码步骤说明将*转换为摩斯码的.保持-不变按/分割密码字符串得到独立码元通过字典查询每个码元对应的字母或数字拼接得到第一层解码结果3. 第二层手机键盘替换将数字串两两分组后进行手机键盘映射def phone_keypad_decode(digits): result [] for i in range(0, len(digits), 2): num digits[i] pos int(digits[i1]) - 1 # 位置转为0-based索引 result.append(PHONE_KEYPAD[num][pos]) return .join(result) # 测试解码 phone_result phone_keypad_decode(4194418141634192622374) print(phone_result) # 输出: GZGTGOGXNCS手机键盘解码逻辑数字串按两位一组分割如41、94、41...每组第一位数字对应手机键盘数字键第二位数字对应该键上字母的序号1-based传统手机键盘布局示例数字字母2ABC3DEF4GHI5JKL6MNO7PQRS8TUV9WXYZ4. 第三层QWERTY键盘替换将字母通过QWERTY键盘布局进行二次替换def qwerty_decode(text): return .join([QWERTY_MAP.get(char, char) for char in text]) # 测试解码 qwerty_result qwerty_decode(GZGTGOGXNCS) print(qwerty_result) # 输出: OTEOEIOUYVLQWERTY替换规则说明将键盘字母按QWE顺序对应ABCQ W E R T Y U I O P - A B C D E F G H I J A S D F G H J K L - K L M N O P Q R S Z X C V B N M - T U V W X Y Z例如G在键盘第二排第5个位置对应字母O5. 第四层栅栏密码对文本进行两行栅栏排列后重组def rail_fence_decode(text): mid len(text) // 2 row1 text[:mid] row2 text[mid:] return .join(row1[i] row2[i] for i in range(mid)) (row2[-1] if len(text)%2 else ) # 测试解码 rail_result rail_fence_decode(OTEOEIOUYVL) print(rail_result) # 输出: OOTUOYEVOLI栅栏密码处理过程将字符串平分两行O T E O E I O U Y V L → 第一行O T E O E → 第二行I O U Y V L按列交叉读取OI, TO, EU, OY, EV → OOTUOYEVOLI6. 第五层倒序排列最后一步简单倒序即可得到最终结果def reverse_text(text): return text[::-1] # 完整解码流程 def full_decode(ciphertext): step1 decode_morse(ciphertext) step2 phone_keypad_decode(step1) step3 qwerty_decode(step2) step4 rail_fence_decode(step3) step5 reverse_text(step4) return { step1: step1, step2: step2, step3: step3, step4: step4, step5: step5 } # 最终测试 result full_decode(****-/*----/----*/****-/****-/*----/---**/*----/****-/*----/-****/***--/****-/*----/----*/**---/-****/**---/**---/***--/--***/****-/) print(result[step5]) # 输出: ILOVEYOUTOO7. 密码学原理深度解析这个五层加密方案巧妙融合了多种经典密码技术加密层技术类型安全特性破解关键第一层替换密码符号替换摩斯码表公开第二层替换密码设备依赖需知手机键盘布局第三层替换密码键盘布局需知QWERTY排列第四层换位密码位置混淆需知栅栏行数第五层倒序变换简单混淆明显可逆操作这种多层加密方式体现了 Kerckhoffs 原则 - 即使密码系统的一切细节已为人所知只要密钥未泄露也应保持安全。在本案例中每一层的加密规则都相当于一个密钥。现代密码学中类似思想发展出了以下技术混淆与扩散通过多层变换打乱原始信息特征乘积密码组合多个简单密码增强安全性Feistel网络分块加密与多轮迭代结构提示实际安全系统中单纯依赖这种替换/换位密码并不足够需要结合现代加密算法如AES、RSA等8. 完整实现与交互工具将所有功能整合为可交互的解码工具import sys class LoveDecoder: def __init__(self): self.steps { 1: 摩斯密码解码, 2: 手机键盘替换, 3: QWERTY键盘替换, 4: 栅栏密码重组, 5: 最终倒序处理 } def show_process(self, result): print(\n解码过程追踪) for step, value in result.items(): print(f{self.steps[int(step[4:])]}: {value}) if __name__ __main__: decoder LoveDecoder() cipher input(请输入五层加密的摩斯密码) try: result full_decode(cipher) decoder.show_process(result) print(f\n最终解码结果{result[step5]}) except Exception as e: print(f解码失败{str(e)})使用示例请输入五层加密的摩斯密码****-/*----/----*/****-/****-/*----/---**/*----/****-/*----/-****/***--/****-/*----/----*/**---/-****/**---/**---/***--/--***/****-/ 解码过程追踪 摩斯密码解码: 4194418141634192622374 手机键盘替换: GZGTGOGXNCS QWERTY键盘替换: OTEOEIOUYVL 栅栏密码重组: OOTUOYEVOLI 最终倒序处理: ILOVEYOUTOO 最终解码结果ILOVEYOUTOO9. 密码学实战技巧通过这个案例我们可以总结出密码分析的通用方法观察模式特征摩斯密码的/分隔符数字串的偶数长度重复出现的数字组合尝试常见编码优先测试ASCII、Unicode等标准编码检查是否为Base64等编码形式考虑键盘位置替换可能性分层测试策略def try_all_decoders(text): decoders [caesar_shift, atbash, rail_fence, reverse] for decoder in decoders: result decoder(text) if looks_like_plaintext(result): return decoder.__name__, result return None上下文线索利用密码设置者的设备特征如使用传统手机可能的关键词提示如love、secret等文化背景相关的编码习惯自动化测试工具# 使用密码学工具包测试 sudo apt install crypTool crypTool --input cipher.txt --bruteforce在信息安全领域这类多层加密方案虽然不适合高安全需求场景但作为密码学教学案例它完美展示了如何组合简单密码构建复杂系统密码分析的基本思路与方法社会工程学在密码破解中的作用安全性与可用性的平衡考量

更多文章