用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. 密码学原理深度解析

这个五层加密方案设计精妙,每一层都采用了不同的密码学技术:

  1. 摩尔斯电码 :最基础的编码转换,将符号系统转为数字
  2. 手机键盘映射 :基于物理设备的替代密码
  3. QWE键盘布局 :利用键盘设计特性的替换密码
  4. 栅栏密码 :典型的换位密码,改变字符顺序
  5. 倒序处理 :最简单的反转加密

这种多层加密方式体现了 纵深防御 的安全理念,即使破解者知道部分加密方法,也需要完整破解所有层次才能获得原文。

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. 扩展应用与创意密码设计

基于这个案例,我们可以设计更多有趣的密码游戏:

  1. 自定义键盘映射 :创建个人化的键盘布局
  2. 图像密码 :将密码隐藏在图片像素数据中
  3. 时间密码 :用特定时间的键盘输入作为密钥
# 示例:基于时间的动态密码
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实现整个过程,我们不仅理解了每层加密的原理,也掌握了如何将这些技术应用到实际编程中。密码学的魅力正在于这种将数学、逻辑与创意完美结合的特性。

更多推荐