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

张开发
2026/6/6 7:28:31 15 分钟阅读

分享文章

从贴吧神帖到实战:手把手教你用Python复刻那个经典的5层摩尔斯电码加密(附完整代码)
五层加密的浪漫用Python重构摩尔斯电码解密全流程当数字与符号交织成谜题技术便成为解读浪漫的钥匙。2009年那个轰动贴吧的摩尔斯电码爱情故事至今仍是密码学爱好者津津乐道的经典案例。本文将抛开故事叙述视角完全聚焦于技术实现——如何用Python完整复现从摩尔斯电码到最终告白的五层解密过程。无论你是想重温这个经典解密之旅还是希望掌握多层密码系统的破解方法这篇实战指南都将带你深入密码学的奇妙世界。1. 环境准备与基础工具在开始解密之前我们需要配置合适的开发环境并准备必要的工具库。现代Python生态为我们提供了丰富的密码学处理工具但在这个案例中我们将主要依赖基础库来实现每一层的解密逻辑。1.1 必备Python库import re from collections import defaultdictre模块用于处理摩尔斯电码字符串的正则表达式匹配collections.defaultdict将简化密码映射表的构建过程1.2 摩尔斯电码对照表我们需要构建完整的摩尔斯电码字典包含字母、数字和常用符号morse_code_dict { 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: ----., .: .-.-.-, ,: --..--, ?: ..--.., : .----., !: -.-.--, /: -..-., (: -.--., ): -.--.-, : .-..., :: ---..., ;: -.-.-., : -...-, : .-.-., -: -....-, _: ..--.-, : .-..-., $: ...-..-, : .--.-., : / }注意实际解密时我们需要反向查找从摩尔斯码到字符因此还需要构建逆向字典2. 第一层摩尔斯电码解码原始密码字符串如下****-/*----/----*/****-/****-/*----/---**/*----/****-/*----/-****/***--/****-/*----/----*/**---/-****/**---/**---/***--/--***/****-/2.1 摩尔斯符号标准化首先需要将原始字符串中的*和-转换为标准的.和-def standardize_morse(raw_morse): return raw_morse.replace(*, .).replace(/, )2.2 摩尔斯解码实现reverse_morse_dict {v:k for k,v in morse_code_dict.items()} def decode_morse(morse_string): words morse_string.split( ) return .join([reverse_morse_dict.get(code, ) for code in words])应用解码raw_code ****-/*----/----*/****-/****-/*----/---**/*----/****-/*----/-****/***--/****-/*----/----*/**---/-****/**---/**---/***--/--***/****-/ std_code standardize_morse(raw_code) # ....-/.----/----./....-/....-/.----/---../.----/....-/.----/-..../...--/....-/.----/----./..---/-..../..---/..---/...--/--.../....- decoded decode_morse(std_code) # 4194418141634192622374至此我们成功获取了第一层解密结果41944181416341926223743. 第二层手机键盘替代密码3.1 构建手机键盘映射考虑到2009年的手机键盘布局Nokia经典键盘1 2(ABC) 3(DEF) 4(GHI) 5(JKL) 6(MNO) 7(PQRS) 8(TUV) 9(WXYZ) * 0 #对应的数字-字母映射phone_keymap { 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] }3.2 数字分组解码实现将第一层结果按两位一组分割并解码def phone_key_decode(number_str): groups [number_str[i:i2] for i in range(0, len(number_str), 2)] result [] for group in groups: num group[0] pos int(group[1]) - 1 if num in phone_keymap and pos len(phone_keymap[num]): result.append(phone_keymap[num][pos]) else: result.append(?) return .join(result) layer2 phone_key_decode(4194418141634192622374) # GZGTOGXNCS第二层解密结果GZGTOGXNCS4. 第三层QWE键盘替代密码4.1 构建QWE键盘映射标准QWERTY键盘的第一行字母对应ABC顺序Q W E R T Y U I O P A S D F G H J K L Z X C V B N M替代密码映射关系qwe_keymap { 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 }4.2 QWE解码实现def qwe_decode(encoded_str): return .join([qwe_keymap.get(c, c) for c in encoded_str]) layer3 qwe_decode(GZGTOGXNCS) # OTEOIOUYVL第三层解密结果OTEOIOUYVL5. 第四层栅栏密码转换栅栏密码是一种换位密码通过将字符按特定规律重新排列实现加密。5.1 两行栅栏实现def rail_fence_decode(text, rails2): pattern [] for i in range(rails): pattern.append([]) # 重建栅栏模式 down True row 0 for c in text: pattern[row].append(c) if down: row 1 if row rails: down False row - 2 else: row - 1 if row -1: down True row 2 # 合并结果 result [] for row in pattern: result.extend(row) return .join(result) layer4 rail_fence_decode(OTEOIOUYVL) # OOTUOYEVOLI第四层解密结果OOTUOYEVOLI6. 第五层倒序排列最后一层是最简单的倒序操作layer5 OOTUOYEVOLI[::-1] # ILOVEYOUTOO最终解密结果ILOVEYOUTOOI LOVE YOU TOO7. 完整解密流程整合将所有解密步骤整合为一个完整的Python脚本def full_decrypt(raw_morse): # 第一层摩尔斯解码 std_morse raw_morse.replace(*, .).replace(/, ) layer1 .join([reverse_morse_dict.get(code, ) for code in std_morse.split( )]) # 第二层手机键盘解码 groups [layer1[i:i2] for i in range(0, len(layer1), 2)] layer2 .join([phone_keymap.get(g[0], [?])[int(g[1])-1] for g in groups]) # 第三层QWE键盘解码 layer3 .join([qwe_keymap.get(c, c) for c in layer2]) # 第四层栅栏密码 layer4 rail_fence_decode(layer3) # 第五层倒序 return layer4[::-1] result full_decrypt(****-/*----/----*/****-/****-/*----/---**/*----/****-/*----/-****/***--/****-/*----/----*/**---/-****/**---/**---/***--/--***/****-/) print(result) # ILOVEYOUTOO8. 密码学实践中的注意事项在实际密码系统设计和实现时有几个关键原则需要牢记密钥管理任何加密系统的安全性都依赖于密钥的保密性混淆与扩散好的加密算法应该同时实现混淆使密钥与密文关系复杂和扩散使明文统计特性消失不要自行发明加密算法专业密码学算法都经过严格验证自行设计的算法通常存在漏洞提示本文实现的五层加密系统属于教学示例实际应用中不应依赖此类自设计加密方案9. 扩展思考与改进这个五层加密系统虽然巧妙但从密码学角度看存在一些可以改进的地方增加随机性目前的加密步骤都是确定的容易受到模式分析攻击引入现代加密算法可以结合AES等标准算法增强安全性错误处理当前实现缺乏对无效输入的健壮性处理一个改进版本可能包含from Crypto.Cipher import AES import hashlib import os def better_encrypt(message, password): # 使用PBKDF2派生密钥 salt os.urandom(16) key hashlib.pbkdf2_hmac(sha256, password.encode(), salt, 100000) # AES加密 cipher AES.new(key[:32], AES.MODE_GCM) ciphertext, tag cipher.encrypt_and_digest(message.encode()) return salt cipher.nonce tag ciphertext这种实现采用了现代密码学标准提供了更强的安全保障。

更多文章