--- title: 替换密码 createTime: 2025/10/27 10:47:42 permalink: /theory/cryptography/substitution-ciphers/ --- # 替换密码(Substitution Ciphers) 我们一起来系统梳理古典加密算法(Classical Ciphers)。这些算法虽然在现代已不再安全,但它们是密码学发展的基石,蕴含了替换、置换、密钥等核心思想,非常适合理解密码学的基本原理。 替换密码的核心思想是“一对一”或“多对一”的字符映射:把明文中的每一个字母(或符号)按照事先约定好的规则,替换成另一个字母(或符号)。 这种映射可以是固定不变的(如凯撒密码的“统一移位”),也可以是依赖密钥动态变化的(如维吉尼亚密码的“周期移位”)。 由于密文保留了原始字母的出现频率,只是“换了一张皮”,所以替换密码在本质上没有改变字母的统计特性,这也为频率分析攻击留下了突破口。 替换操作可以手工完成,也可以通过查表、转盘、甚至机械电路实现,是后续更复杂多表替换与乘积密码的雏形。 ## 一、凯撒密码(Caesar Cipher) **工作原理**: 凯撒密码是一种循环移位密码,将字母表视为一个环形结构。加密时每个字母向后移动固定位置 $k$,解密时向前移动相同位置。 **数学表示**: 设字母 A-Z 对应数字 0-25,则: 加密公式: $$E(x) = (x + k) \mod 26$$ 解密公式: $$D(x) = (x - k) \mod 26$$ 其中 $x$ 是明文字母编号,$k$ 是密钥(0 ≤ k ≤ 25)。 **特点**: - 实现简单,易于理解 - 密钥空间仅 $26$ 种可能,安全性极低 - 易受频率分析攻击 - 主要具有教学价值 ## 二、单表替换密码(Simple Substitution Cipher) **工作原理**: 单表替换密码是凯撒密码的泛化形式,它使用一个随机的字母替换表,而不是固定的移位。每个明文字母都被唯一地映射到一个密文字母,形成一对一的替换关系。 ```mermaid graph LR A[明文字母] --> B{替换表} B --> C[密文字母] ``` **数学表示**: 设字母表 $\Sigma = \{A,B,C,...,Z\}$,替换函数 $f: \Sigma \rightarrow \Sigma$ 是一个双射(一一对应),则: 加密公式: $$E(x) = f(x)$$ 解密公式: $$D(y) = f^{-1}(y)$$ 其中 $f^{-1}$ 是 $f$ 的逆函数。 **密钥空间**: 单表替换密码的密钥空间是所有可能的字母排列,大小为: $$|K| = 26! \approx 4.03 \times 10^{26}$$ 这个巨大的密钥空间使得暴力破解在计算上不可行。 **示例**: 假设替换表为: ``` A→Q, B→W, C→E, D→R, E→T, F→Y, G→U, H→I, I→O, J→P, K→A, L→S, M→D, N→F, O→G, P→H, Q→J, R→K, S→L, T→Z, U→X, V→C, W→V, X→B, Y→N, Z→M ``` ```mermaid flowchart LR A[明文: HELLO] --> B[替换加密] B --> C[密文: ITSSG] C --> D[逆替换解密] D --> E[明文: HELLO] ``` **安全性分析**: 虽然单表替换密码的密钥空间巨大,但它仍然易受**频率分析攻击**。因为: 1. **字母频率保留**:高频字母(如E、T、A)在密文中仍然是高频 2. **单词模式保留**:常见单词模式(如"THE"、"ING")在密文中保持相同模式 3. **双字母频率**:常见字母对(如"TH"、"ER")的频率特征仍然存在 **攻击方法**: - 单字母频率分析 - 双字母频率分析 - 单词长度和模式分析 - 已知明文攻击 **特点**: - 密钥空间巨大($26!$),理论上难以暴力破解 - 仍然易受统计攻击 - 是密码学历史上重要的里程碑 - 为现代密码学提供了重要启示 ## 三、维吉尼亚密码(Vigenère Cipher) **工作原理**: 维吉尼亚密码是一种多表替换密码,它使用一个关键词来决定每次替换的凯撒密码移位量。关键词的每个字母对应一个移位量,明文的每个字母根据关键词的循环使用进行替换。 ```mermaid graph LR A[明文] --> B{关键词循环扩展} B --> C[明文与关键词按位组合] C --> D{多表替换} D --> E[密文] ``` **数学表示**: 设字母 A-Z 对应数字 0-25。 明文 $P = p_0 p_1 ... p_{n-1}$ 关键词 $K = k_0 k_1 ... k_{m-1}$ (长度为 $m$) 加密公式: $$E(p_i) = (p_i + k_{i \pmod m}) \mod 26$$ 解密公式: $$D(c_i) = (c_i - k_{i \pmod m}) \mod 26$$ 其中 $p_i$ 是明文第 $i$ 个字母的数字表示,$k_{i \pmod m}$ 是关键词循环后对应第 $i$ 个字母的数字表示,$c_i$ 是密文第 $i$ 个字母的数字表示。 **示例**: 明文:`ATTACKATDAWN` 关键词:`LEMON` 1. **关键词循环扩展**: 将关键词 `LEMON` 循环扩展至与明文等长:`LEMONLEMONLE` 2. **明文与关键词按位组合(数字表示)**: 将明文和扩展后的关键词转换为数字 (A=0, B=1, ..., Z=25)。 明文数字: `0 19 19 0 2 10 0 19 3 0 22 13` 关键词数字: `11 4 12 14 13 11 4 12 14 13 11 4` 3. **加密运算**: 对每对明文数字 $p_i$ 和关键词数字 $k_{i \pmod m}$ 执行 $(p_i + k_{i \pmod m}) \mod 26$ 运算。 例如: - 第一个字母:明文 A (0) + 关键词 L (11) = $(0 + 11) \mod 26 = 11 \rightarrow L$ - 第二个字母:明文 T (19) + 关键词 E (4) = $(19 + 4) \mod 26 = 23 \rightarrow X$ - 第三个字母:明文 T (19) + 关键词 M (12) = $(19 + 12) \mod 26 = 5 \rightarrow F$ ... 最终密文:`LXFOPVEFRNHR` **安全性分析**: 维吉尼亚密码比单表替换密码更安全,因为它引入了**多表替换**,使得密文的字母频率分布趋于平坦,从而抵抗了简单的频率分析攻击。 然而,它并非绝对安全,主要弱点在于**关键词的周期性**: 1. **Kasiski 测试**:通过分析密文中重复出现的字母组,可以推断出关键词的长度。 2. **频率分析(针对子密码)**:一旦关键词长度确定,密文可以被分成若干个凯撒密码,然后对每个子密码进行频率分析。 **特点**: - 多表替换,比单表替换密码更安全 - 引入了关键词的概念,增强了密钥的复杂性 - 易受Kasiski测试和频率分析的组合攻击 - 在历史上曾被认为是“牢不可破的密码” ## 附件: 具体的使用样例代码请参考:[https://gitea.simengweb.com/si-meng-spec/cryptography-example-code](https://gitea.simengweb.com/si-meng-spec/cryptography-example-code)