如何破解凯撒密码:三种经典密码分析方法
学习如何使用暴力破解、频率分析和卡方检验三种方法破解凯撒密码,包含逐步讲解的示例与 Python 代码。
凯撒密码可能是西方历史上记载最早的加密方法,但它也是最容易被破解的。无论你是在夺旗(CTF)竞赛中截获了一段密文、在谜题中遇到了一条编码消息,还是只想了解密码分析的基础知识,掌握如何破解凯撒密码都是一项基本技能。
本指南介绍三种由浅入深的凯撒密码破解方法:暴力破解、频率分析和卡方统计检验。每种方法都配有完整的示例讲解,你还将学到在面对不同长度和性质的密文时,应该选择哪种方法。
边读边练:使用我们的免费凯撒密码解码器,跟随本文步骤对真实密文进行实际操作。
为什么凯撒密码易于被破解
在介绍各种方法之前,有必要先理解凯撒密码在本质上为何不安全。该密码的工作原理是将明文中的每个字母在字母表中向后移动固定的位数。由于英文字母表共有 26 个字母,有意义的位移值只有 25 个(位移为 0 时文本不变)。这个极小的密钥空间是所有安全漏洞的根源:
| 弱点 | 为何重要 |
|---|---|
| 只有 25 个可能的密钥 | 攻击者能在几秒内逐一尝试所有密钥 |
| 确定性映射 | 每个明文字母始终加密成同一个密文字母 |
| 保留频率分布 | 原始语言的统计特征在加密后仍然保留 |
| 无扩散性 | 改变一个明文字母只影响一个密文字母 |
| 单整数密钥 | 没有复杂的密钥扩展或多轮变换 |
相比之下,AES-256 等现代加密标准拥有 2^256 个可能密钥,数量之巨,即便穷尽太阳一生所能释放的全部能量也无法完成暴力破解。而凯撒密码 25 个密钥的空间,无论怎么看都是微不足道的。
方法一:暴力破解
暴力破解是破解凯撒密码最简单、最直接的方法。思路十分直白:逐一尝试全部 25 种可能的位移值,找出能产生可读输出的那个。
工作原理
对于一段密文,逐一用 1 到 25 的每个位移值进行解密,然后人工检查结果。对于较短的消息,正确的明文通常一眼可辨。
示例演示
假设你截获了密文 "WKLV LV D VHFUHW"。暴力破解时,依次尝试每种可能的位移:
| 位移 | 解密结果 | 可读? |
|---|---|---|
| 1 | VJKU KU C UGETGV | 否 |
| 2 | UIJT JT B TFDSFU | 否 |
| 3 | THIS IS A SECRET | 是 |
| 4 | SGHR HR Z RDBQDS | 否 |
| 5 | RFGQ GQ Y QCAPQR | 否 |
答案在位移 3 处一目了然:明文是"THIS IS A SECRET"。
适用场景
暴力破解在以下情况中最为适用:
- 密文较短(不足 50 个字符),此时频率分析可能不够可靠
- 需要快速得到答案,不在乎方法是否优雅
- 手工操作,没有计算机辅助
- 密文可能使用非英语语言,频率类方法可靠性较低
人工在纸上测试全部 25 种位移大约需要五分钟,而计算机只需几微秒即可完成。
Python 实现
def caesar_decrypt(text, shift):
result = []
for char in text:
if char.isalpha():
base = ord('A') if char.isupper() else ord('a')
shifted = (ord(char) - base - shift) % 26 + base
result.append(chr(shifted))
else:
result.append(char)
return ''.join(result)
def brute_force(ciphertext):
for shift in range(1, 26):
decrypted = caesar_decrypt(ciphertext, shift)
print(f"Shift {shift:2d}: {decrypted}")
brute_force("WKLV LV D VHFUHW")
# Shift 3: THIS IS A SECRET ← readable English
该脚本打印全部 25 种可能的解密结果,分析人员扫描输出找到可读的那一行即可。
暴力破解的局限性
暴力破解有一个显著的局限:它需要人工判断来识别正确的明文。当密文极短(三四个字符)时,可能有多个位移都能产生看似合理的结果。而在需要自动处理大量消息时,必须有一种方式对结果进行程序化评分。这正是频率分析发挥作用的地方。
方法二:频率分析
频率分析是最古老、最优雅的密码分析技术之一。它最早由 9 世纪的阿拉伯博学家 Al-Kindi 在其著作《密码消息解密手稿》中提出,利用了自然语言的一个基本特性:各字母出现的频率并不相同。
基本原理
在标准英语文本中,字母 E 出现的频率约为 12.7%,其次是 T(9.1%)、A(8.2%)、O(7.5%)和 I(7.0%)。这一规律有时被记为"ETAOIN SHRDLU",在不同文本中表现出惊人的一致性。
由于凯撒密码将每个字母统一替换为同一个字母,密文中的字母频率分布得以保留,只是整体移位了。如果 E 是英语中最常见的字母,而密文中出现频率最高的字母是 H,那么位移几乎可以确定是 3(因为 H 在字母表中比 E 靠后三个位置)。
英语标准字母频率
以下是最常见英语字母的近似频率,供参考:
| 字母 | 频率 | 字母 | 频率 | 字母 | 频率 |
|---|---|---|---|---|---|
| E | 12.70% | T | 9.06% | A | 8.17% |
| O | 7.51% | I | 6.97% | N | 6.75% |
| S | 6.33% | H | 6.09% | R | 5.99% |
| D | 4.25% | L | 4.03% | C | 2.78% |
逐步操作流程
使用频率分析破解凯撒密码的步骤:
- 统计密文中每个字母的出现频率,逐一清点 A 到 Z 各字母出现的次数。
- 找出密文中出现频率最高的字母。
- 假设该字母对应英语中频率最高的字母 E。
- 计算位移量:用密文字母的序号减去 E 的序号。例如,若密文中最常见的字母是 K,则位移为 K - E = 10 - 4 = 6。
- 解密:使用计算出的位移对整段密文进行解密。
- 验证:阅读解密后的文本。若不可读,则改为假设最常见的密文字母对应 T 或 A,重复上述步骤。
示例演示
考虑密文:"WKH TXLFN EURZQ IRA MXPSV RYHU WKH ODCB GRJ"
首先统计字母频率(忽略空格):
| 字母 | 次数 | 字母 | 次数 |
|---|---|---|---|
| R | 3 | H | 2 |
| W | 2 | K | 2 |
| 其他字母 | 各 1 次 |
出现频率最高的字母是 R(出现 3 次)。假设 R 对应 E:
位移 = R - E = 17 - 4 = 13
使用位移 13 解密得到:"THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG"
这个著名的全字母句确认了位移值为 13,正是大名鼎鼎的 ROT13——凯撒密码最广为人知的变体。
频率分析的局限性
频率分析在较长文本(50 个字符以上)中效果最佳。对于较短的密文,随机波动可能导致某个不常见字母出现的次数多于 E,从而产生错误的初始猜测。这时有两种应对方式:
- 尝试第二、第三高频字母,将其作为 E、T 或 A 的候选
- 使用卡方检验(见下节),该方法考虑整体分布而非单一字母
方法三:卡方统计检验
卡方检验是破解凯撒密码最严格的方法。暴力破解依赖人工判断,频率分析依赖单个最高频字母,而卡方方法则一次性对整个字母分布进行统计评估。这使其成为自动化密码破解工具的首选方法,包括本站的凯撒密码解码器。
工作原理
对 25 个候选位移值中的每一个,解密密文并计算卡方统计量,衡量解密后文本的字母分布与标准英语频率的吻合程度。产生最低卡方值的位移即为最可能的密钥。
计算公式为:
chi-squared(s) = sum of (Oi - Ei)^2 / Ei for i = A to Z
其中:
- s 为候选位移值
- Oi 为用位移 s 解密后文本中第 i 个字母的实际出现次数
- Ei 为基于标准英语频率的第 i 个字母预期出现次数,计算方式为(字母总数)×(字母 i 的标准频率)
为何更加稳健
相比简单频率分析,卡方检验的关键优势在于同时考量全部 26 个字母,而非仅依赖单个高频字母。这使其在处理短密文时显著更可靠——随机波动可能导致某个不常见字母比 E 出现得更频繁。
设想一段 20 个字符的密文,由于消息中的具体单词,T 恰好比 E 出现得更多。简单频率匹配会猜错,但卡方检验仍能给出正确答案,因为它评估的是整体分布规律。
Python 实现
ENGLISH_FREQ = {
'A': 0.0817, 'B': 0.0150, 'C': 0.0278, 'D': 0.0425,
'E': 0.1270, 'F': 0.0223, 'G': 0.0202, 'H': 0.0609,
'I': 0.0697, 'J': 0.0015, 'K': 0.0077, 'L': 0.0403,
'M': 0.0241, 'N': 0.0675, 'O': 0.0751, 'P': 0.0193,
'Q': 0.0010, 'R': 0.0599, 'S': 0.0633, 'T': 0.0906,
'U': 0.0276, 'V': 0.0098, 'W': 0.0236, 'X': 0.0015,
'Y': 0.0197, 'Z': 0.0007
}
def chi_squared_score(text):
text_upper = text.upper()
letter_count = sum(1 for c in text_upper if c.isalpha())
if letter_count == 0:
return float('inf')
score = 0.0
for letter, expected_freq in ENGLISH_FREQ.items():
observed = text_upper.count(letter)
expected = letter_count * expected_freq
if expected > 0:
score += (observed - expected) ** 2 / expected
return score
def break_caesar(ciphertext):
best_shift = 0
best_score = float('inf')
for shift in range(26):
decrypted = caesar_decrypt(ciphertext, shift)
score = chi_squared_score(decrypted)
if score < best_score:
best_score = score
best_shift = shift
return best_shift, caesar_decrypt(ciphertext, best_shift)
shift, plaintext = break_caesar("KHOOR ZRUOG")
print(f"Detected shift: {shift}") # Detected shift: 3
print(f"Plaintext: {plaintext}") # Plaintext: HELLO WORLD
该实现无需任何人工干预即可自动确定正确位移,适合批量处理或集成到更大规模的密码分析流水线中。
解读卡方值
对全部 25 个位移运行卡方检验时,通常会看到其中一个位移产生的分数远低于其他所有位移——那就是答案。如果有两个位移产生了接近的低分,说明密文可能太短,不足以支持可靠的自动检测,此时应手动验证这两个候选结果。
历史背景:密码破解的起源
破解凯撒密码的历史与密码分析的整体历史紧密相连。Julius Caesar 本人在高卢战争(公元前 58-50 年)期间的军事通信中使用了位移 3,此事由历史学家 Suetonius 记录在案。数百年间,像凯撒密码这样的简单替换密码被视为安全可靠,主要原因是大多数人目不识丁,系统性密码破解的概念尚未出现。
第一次重大突破来自 Al-Kindi(公元 801-873 年),他是巴格达智慧宫的一位阿拉伯哲学家和数学家。在其开创性著作《密码消息解密手稿》中,Al-Kindi 将频率分析描述为破解替换密码的通用技术。这部著作写于 Caesar 之后约 900 年,代表了密码分析史上最重要的进展之一。
到 15 世纪,欧洲密码学家已认识到单表替换在本质上是不安全的。Leon Battista Alberti(1404-1472)发明了密码盘,并提出多表替换以对抗频率分析。这一演进路径最终催生了维吉尼亚密码——它在每个字母位置使用不同的凯撒位移,密钥由一个关键词决定。维吉尼亚密码抵御密码分析长达约 300 年,直到 19 世纪 Charles Babbage 和 Friedrich Kasiski 分别独立破解了它。
美国内战期间,南方邦联使用基于凯撒原理的黄铜密码盘进行野战通信。北方密码分析员频繁破解这些消息,证明即便是凯撒密码的机械实现也无法克服其根本弱点:极小的密钥空间。
你可能遇到的其他名称
在研究凯撒密码分析时,你可能会以各种别名遇到这种密码。在 CTF 竞赛和谜题场景中,识别这些别名尤为有用:
- 位移密码(Shift cipher)或旋转密码(Rotation cipher)——最常见的通用名称
- ROT-N ——其中 N 是具体的位移值(ROT1、ROT5、ROT13、ROT47)
- ROT13 ——位移 13 的变体,以其自逆性而著称;连续应用两次可还原原始文本
- Augustus 密码 ——奥古斯都皇帝使用位移 1,据 Suetonius 记载
- CD 码(位移 1)、Jail 码(位移 2)、Hello 码(位移 3)——基于特定字母映射的俚语名称
- Baden-Powell 密码 ——在童子军场景中使用
其中最广为人知的变体是 ROT13,自 Usenet 早期以来就被用来隐藏剧透、笑话妙语和谜题答案。
这些技术的应用场景
尽管凯撒密码早已不再用于真实的安全场景,但从破解它所学到的密码分析技能具有令人惊讶的迁移价值:
- CTF 竞赛。 凯撒加密的 flag 是网络安全竞赛中常见的热身题目,能够快速识别和解码被视为基础技能。
- 密室逃脱与解谜活动。 实体和虚拟密室经常将凯撒位移的线索作为多步骤谜题的一环。
- 地理寻宝(Geocaching)。 许多寻宝坐标使用简单的凯撒位移编码,需要解密后才能导航至隐藏地点。
- 密码学课程。 凯撒密码是几乎所有密码学入门课程中讲授的第一个密码,理解其弱点是学习更高级系统的入门之钥。
- 编程练习。 实现一个凯撒密码破解器是经典的入门编程挑战,涵盖字符串操作、模运算和统计分析等知识点。
从凯撒密码到现代密码学
理解凯撒密码为何失败,有助于揭示现代加密系统必须做出的改进。凯撒密码的核心思想——通过受密钥控制的可逆数学运算变换明文——是所有对称加密的基础。但一个安全的密码必须远超简单的字母位移:
- 大密钥空间。 AES 使用 128 位、192 位或 256 位密钥,而非 1 到 25 之间的一个数字。256 位密钥空间包含的可能密钥数量,多于可观测宇宙中的原子总数。
- 扩散性。 在 AES 中,改变明文中的一个比特会影响密文中的每一个比特。而凯撒密码中,改变一个字母只影响一个密文字母。
- 混淆性。 通过多层替换和置换,密钥与密文之间的关系被刻意复杂化。凯撒密码的关系则极为简单:密文字母等于明文字母加密钥。
- 多轮变换。 AES 应用 10 到 14 轮变换,而非单次位移操作。每一轮都进一步模糊了明文与密文之间的关系。
从 Caesar 的三位位移到 AES 的 14 轮替换-置换网络,跨越了 2000 余年的密码学创新,但根本目标从未改变:让没有密钥的人无法读懂消息。
选择合适的方法
以下是根据实际情况选择最佳破解方法的快速决策指南:
| 场景 | 推荐方法 |
|---|---|
| 短密文(不足 20 个字符) | 暴力破解 |
| 中等密文(20-100 个字符) | 卡方检验 |
| 长密文(100 个字符以上) | 频率分析或卡方检验 |
| 手工解密(无计算机) | 暴力破解或频率分析 |
| 自动化流水线或批量处理 | 卡方检验 |
| 非英语语言 | 暴力破解(配合适当语言的人工判断) |
对于大多数实际应用,卡方检验是最全面的方法。它对任意长度的文本都能稳定运行,无需人工判断,也是大多数专业密码破解工具所采用的方法。
欢迎使用我们的免费凯撒密码工具练习这些技术。你可以加密自己的消息,然后尝试用上述方法进行破解。凯撒密码解码器实现了卡方方法,能够自动检测你输入的任何密文所对应的正确位移。