用Python复刻那个经典的贴吧爱情密码:手把手教你5层摩尔斯电码解密(附完整代码)
·
用Python复刻经典贴吧爱情密码:5层摩尔斯电码全解析
2009年百度贴吧那个轰动一时的爱情密码故事,至今仍是密码学爱好者津津乐道的经典案例。当时一位女生用5层加密的摩尔斯电码回应男生的告白,最终在网友协作下破解出"I LOVE YOU TOO"的浪漫结局。本文将用Python完整复现这个多层解密过程,带你深入理解每层加密原理。
1. 环境准备与基础工具
在开始解密前,我们需要准备Python环境和几个核心库:
import re
from collections import defaultdict
摩尔斯电码解码是第一步,我们需要建立电码与字母的映射关系:
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', '.----': '1', '..---': '2',
'...--': '3', '....-': '4', '.....': '5', '-....': '6',
'--...': '7', '---..': '8', '----.': '9', '-----': '0'
}
2. 第一层:摩尔斯电码解码
原始密码字符串如下:
****-/*----/----*/****-/****-/*----/---**/*----/****-/*----/-****/***--/****-/*----/----*/**---/-****/**---/**---/***--/--***/****-/
首先我们需要处理这种特殊格式的摩尔斯电码。注意到这里用 * 代表点(·), - 代表划(-), / 分隔不同字符:
def morse_decode(cipher):
# 替换符号并分割字符
cipher = cipher.replace('*', '.').replace('/', ' ')
words = cipher.split()
# 解码每个摩尔斯电码字符
result = []
for code in words:
result.append(MORSE_CODE_DICT.get(code, ''))
return ''.join(result)
original_cipher = "****-/*----/----*/****-/****-/*----/---**/*----/****-/*----/-****/***--/****-/*----/----*/**---/-****/**---/**---/***--/--***/****-/"
first_layer = morse_decode(original_cipher) # 输出: 4194418141634192622374
3. 第二层:手机键盘替代密码
得到数字串 4194418141634192622374 后,下一步是手机键盘解码。我们需要模拟传统手机的数字键盘布局:
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']
}
def phone_decode(digits):
# 将数字两两分组
pairs = [digits[i:i+2] for i in range(0, len(digits), 2)]
result = []
for pair in pairs:
num = pair[0]
pos = int(pair[1]) - 1 # 转换为0-based索引
if num in PHONE_KEYMAP and pos < len(PHONE_KEYMAP[num]):
result.append(PHONE_KEYMAP[num][pos])
return ''.join(result)
second_layer = phone_decode(first_layer) # 输出: GZGTOGXNC S
4. 第三层:QWE键盘替代密码
接下来是计算机键盘QWE布局解码。我们需要建立QWERTY键盘到ABCD顺序的映射:
QWE_MAPPING = {
'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'
}
def qwe_decode(text):
return ''.join([QWE_MAPPING.get(c, c) for c in text])
third_layer = qwe_decode(second_layer) # 输出: OTOEOIOUYVL
5. 第四层:栅栏密码解密
栅栏密码是一种换位密码,我们需要将字符按特定方式重新排列:
def rail_fence_decode(text, rails=2):
pattern = []
for i in range(rails):
pattern.append([])
# 重建栅栏模式
down = True
row = 0
for _ in text:
for i in range(rails):
pattern[i].append('*' if i == row else '.')
if down:
row += 1
if row == rails:
down = False
row = rails - 2
else:
row -= 1
if row == -1:
down = True
row = 1
# 填充字符
chars = list(text)
for i in range(rails):
for j in range(len(text)):
if pattern[i][j] == '*':
pattern[i][j] = chars.pop(0)
# 读取结果
result = []
down = True
row = 0
for _ in text:
result.append(pattern[row].pop(0))
if down:
row += 1
if row == rails:
down = False
row = rails - 2
else:
row -= 1
if row == -1:
down = True
row = 1
return ''.join(result)
fourth_layer = rail_fence_decode(third_layer) # 输出: OOTUOYEVOLI
6. 第五层:倒序处理
最后一步简单而关键——将字符串反转:
def reverse_text(text):
return text[::-1]
final_result = reverse_text(fourth_layer) # 输出: ILOVEYOUTOO
7. 完整解密流程整合
现在我们将所有解密步骤整合到一个函数中:
def decode_love_cipher(cipher):
print(f"原始密码: {cipher}")
# 第一层:摩尔斯解码
layer1 = morse_decode(cipher)
print(f"第一层(摩尔斯): {layer1}")
# 第二层:手机键盘解码
layer2 = phone_decode(layer1)
print(f"第二层(手机键盘): {layer2}")
# 第三层:QWE键盘解码
layer3 = qwe_decode(layer2)
print(f"第三层(QWE键盘): {layer3}")
# 第四层:栅栏密码
layer4 = rail_fence_decode(layer3)
print(f"第四层(栅栏密码): {layer4}")
# 第五层:倒序
layer5 = reverse_text(layer4)
print(f"第五层(倒序): {layer5}")
return layer5
# 测试完整解密流程
final_answer = decode_love_cipher(original_cipher)
print(f"\n最终解密结果: {final_answer}")
8. 密码学原理深度解析
这个五层加密方案设计精妙,每一层都采用了不同的密码学技术:
- 摩尔斯电码 :最基础的编码转换,将符号系统转为数字
- 手机键盘映射 :基于物理设备的替代密码
- QWE键盘布局 :利用键盘设计特性的替换密码
- 栅栏密码 :典型的换位密码,改变字符顺序
- 倒序处理 :最简单的反转加密
这种多层加密方式体现了 纵深防御 的安全理念,即使破解者知道部分加密方法,也需要完整破解所有层次才能获得原文。
9. 密码强度分析与改进建议
虽然这个五层密码在2009年难倒了许多人,但从现代密码学角度看仍有改进空间:
优点 :
- 多层不同加密技术叠加
- 结合了物理设备特征(手机/键盘)
- 包含替换和换位两种加密类型
弱点 :
- 每层加密单独来看强度不足
- 缺乏现代加密算法
- 依赖特定键盘布局
改进方案 :
# 建议加入现代加密元素
from cryptography.fernet import Fernet
def modern_encrypt(message):
key = Fernet.generate_key()
cipher_suite = Fernet(key)
encrypted = cipher_suite.encrypt(message.encode())
return encrypted, key
10. 扩展应用与创意密码设计
基于这个案例,我们可以设计更多有趣的密码游戏:
- 自定义键盘映射 :创建个人化的键盘布局
- 图像密码 :将密码隐藏在图片像素数据中
- 时间密码 :用特定时间的键盘输入作为密钥
# 示例:基于时间的动态密码
import datetime
def time_based_cipher(text):
now = datetime.datetime.now()
key = now.hour * 60 + now.minute
return ''.join(chr(ord(c) + key) for c in text)
这个经典的爱情密码故事不仅浪漫,更是学习密码学的绝佳案例。通过Python实现整个过程,我们不仅理解了每层加密的原理,也掌握了如何将这些技术应用到实际编程中。密码学的魅力正在于这种将数学、逻辑与创意完美结合的特性。
更多推荐
所有评论(0)