AI摘要

凯撒密码是一种通过固定距离平移字母的单表替换密码。因密钥空间仅26种,极易穷举破解,但适合教学和CTF入门。文章介绍了其原理、Python实现及暴力破解方法。

凯撒密码(Caesar Cipher)是最经典的单表替换密码之一:将字母表中的每个字符按固定距离循环平移。它因密钥空间极小而不具备现代保密性,但仍是理解模运算、替换密码和 CTF 古典密码题的良好起点。


基本信息

项目说明
密码类型单表替换密码、移位密码
字母表通常为 26 个英文字母
密钥移位量k,等价密钥只有 26 种
加密复杂度O(n)n 为文本长度
穷举复杂度最多尝试 26 个密钥,实际可忽略
现代安全性不安全,仅适合教学、谜题和 CTF 入门
名称源于罗马统帅尤利乌斯·凯撒。历史上常见的移位量为 3,但从密码学定义看,任意固定移位量都属于凯撒密码。

工作原理

先将字母映射为数字:A=0, B=1, ..., Z=25。对于明文字母 x 和密钥 k,加密与解密分别为:

加密:E_k(x) = (x + k) mod 26
解密:D_k(y) = (y - k) mod 26

mod 26 保证移位会在字母表末尾循环。例如使用 k=3 加密 XYZ

X (23) + 3 = 26 -> 0  -> A
Y (24) + 3 = 27 -> 1  -> B
Z (25) + 3 = 28 -> 2  -> C

整个过程可以表示为:

明文 HELLO
  | 每个字母向后平移 3 位
  v
密文 KHOOR

与仿射密码的关系

仿射密码使用公式 E(x) = (a*x + b) mod 26。当 a=1b=k 时,公式退化为凯撒密码。因此,凯撒密码可以看作仿射密码的一个特例:只保留偏移,不进行乘法替换。

对比项凯撒密码仿射密码
加密公式(x + k) mod 26(a*x + b) mod 26
有效密钥数26312,a 必须与 26 互质
替换规律固定平移线性变换加偏移
破解难度直接穷举仍可穷举或利用已知明文

Python 实现

以下实现保留字母大小写,非英文字母不参与移位:

def caesar_encrypt(plaintext: str, key: int) -> str:
    """使用凯撒密码加密文本。"""
    result = []
    key %= 26

    for char in plaintext:
        if "A" <= char <= "Z":
            result.append(chr((ord(char) - ord("A") + key) % 26 + ord("A")))
        elif "a" <= char <= "z":
            result.append(chr((ord(char) - ord("a") + key) % 26 + ord("a")))
        else:
            result.append(char)

    return "".join(result)


def caesar_decrypt(ciphertext: str, key: int) -> str:
    """解密等价于向反方向平移 key 位。"""
    return caesar_encrypt(ciphertext, -key)


plaintext = "Hello, World!"
ciphertext = caesar_encrypt(plaintext, 3)

print(ciphertext)                   # Khoor, Zruog!
print(caesar_decrypt(ciphertext, 3)) # Hello, World!

key %= 26 将任意整数规范到 025 的范围。例如 k=29k=3 完全等价,k=-1 则表示向前平移一位。


暴力破解

凯撒密码只有 26 种可能的密钥,其中 k=0 不改变文本。因此不知道密钥时,逐个尝试即可:

def crack_caesar(ciphertext: str) -> list[tuple[int, str]]:
    """枚举全部移位量,返回 (密钥, 明文候选) 列表。"""
    return [(key, caesar_decrypt(ciphertext, key)) for key in range(26)]


ciphertext = "KHOOR, ZRUOG!"
for key, candidate in crack_caesar(ciphertext):
    print(f"key={key:2d}: {candidate}")

输出中 key=3: HELLO, WORLD! 即为可读的明文候选。对于较长英文文本,也可以结合词典、字符频率或常见单词自动给候选结果评分。

CTF 中的判断与解题流程

线索判断处理方式
字符仅由英文字母组成,且字母频率形态未改变可能是单表替换或移位先枚举 26 个凯撒密钥
出现synt{...}iodj{...} 等类似 flag 格式可能是flag{...} 被整体平移利用已知前缀快速推得移位量
ROT13凯撒密码的k=13 特例再执行一次 ROT13 即可还原
大小写、数字、符号混杂可能只对字母移位,或使用了自定义字符表先确定实际参与加密的字符集

为什么它不安全

凯撒密码的弱点不在于实现速度,而在于密钥空间只有 26 种。攻击者不需要知道任何明文,也不需要复杂计算,只要枚举所有密钥并挑选语义通顺的结果即可。

此外,它属于单表替换:同一个明文字母始终对应同一个密文字母,所以字母频率和重复模式被完整保留。例如英文中高频的 E 经加密后仍会成为某一个密文字母的高频项。这使得即使不直接穷举,也能通过频率分析推断移位量。

投币支持一下吧
END