从贴吧神帖到实战:手把手教你用Python复刻那个经典的5层摩尔斯电码加密(附完整代码)
五层加密的浪漫:用Python重构摩尔斯电码解密全流程
当数字与符号交织成谜题,技术便成为解读浪漫的钥匙。2009年那个轰动贴吧的摩尔斯电码爱情故事,至今仍是密码学爱好者津津乐道的经典案例。本文将抛开故事叙述视角,完全聚焦于技术实现——如何用Python完整复现从摩尔斯电码到最终告白的五层解密过程。无论你是想重温这个经典解密之旅,还是希望掌握多层密码系统的破解方法,这篇实战指南都将带你深入密码学的奇妙世界。
1. 环境准备与基础工具
在开始解密之前,我们需要配置合适的开发环境并准备必要的工具库。现代Python生态为我们提供了丰富的密码学处理工具,但在这个案例中,我们将主要依赖基础库来实现每一层的解密逻辑。
1.1 必备Python库
import re
from collections import defaultdict
re模块用于处理摩尔斯电码字符串的正则表达式匹配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"
至此,我们成功获取了第一层解密结果: 4194418141634192622374
3. 第二层:手机键盘替代密码
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:i+2] 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"
第二层解密结果: GZGTOGXNCS
4. 第三层: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"
第三层解密结果: OTEOIOUYVL
5. 第四层:栅栏密码转换
栅栏密码是一种换位密码,通过将字符按特定规律重新排列实现加密。
5.1 两行栅栏实现
def rail_fence_decode(text, rails=2):
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"
第四层解密结果: OOTUOYEVOLI
6. 第五层:倒序排列
最后一层是最简单的倒序操作:
layer5 = "OOTUOYEVOLI"[::-1] # "ILOVEYOUTOO"
最终解密结果: ILOVEYOUTOO (I LOVE YOU TOO)
7. 完整解密流程整合
将所有解密步骤整合为一个完整的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:i+2] 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) # "ILOVEYOUTOO"
8. 密码学实践中的注意事项
在实际密码系统设计和实现时,有几个关键原则需要牢记:
- 密钥管理 :任何加密系统的安全性都依赖于密钥的保密性
- 混淆与扩散 :好的加密算法应该同时实现混淆(使密钥与密文关系复杂)和扩散(使明文统计特性消失)
- 不要自行发明加密算法 :专业密码学算法都经过严格验证,自行设计的算法通常存在漏洞
提示:本文实现的五层加密系统属于教学示例,实际应用中不应依赖此类自设计加密方案
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
这种实现采用了现代密码学标准,提供了更强的安全保障。
更多推荐


所有评论(0)