仿射密码数学详解:模运算与加密完整指南
掌握仿射密码背后的数学原理。学习模运算、乘法逆元、加密公式 E(x) = (ax + b) mod 26,以及逐步破解仿射密码的方法。
简介
仿射密码在密码学史上占据独特地位。它处于初等数论与实用加密的交汇点,是最具教学价值的古典密码之一。尽管按任何现代标准都称不上安全,仿射密码却在其简洁公式背后蕴含着令人惊叹的数学深度。
仿射密码的核心是一种单表替换密码,由公式 E(x) = (ax + b) mod 26 控制。这个方程融合了两个对现代密码系统至关重要的算术分支:模运算和乘法逆元理论。理解这一公式的运作原理,能让你直接洞见支撑 RSA 和椭圆曲线密码学等更强大加密算法的代数结构。
与仅将字母沿字母表移位的凯撒密码不同,仿射密码施加了一种对字母表既拉伸又平移的线性变换。这种非均匀字母映射使频率分析比纯移位密码更为困难,但仍远非不可能。仿射密码是连接简单替换密码与密码学教育中更复杂密码之间理想的教学桥梁。
本指南全面解析仿射密码的数学原理:从基础出发的模运算、含完整推导过程的加解密公式、使密码正确运行的约束条件、模乘法逆元理论,以及破解它的密码分析技术。读完本文,你不仅能透彻理解仿射密码的工作原理,还能明白其设计中每个组成部分为何在数学上不可或缺。
使用我们的免费仿射密码编码器,在阅读本指南时亲身体验这些数学原理。
模运算基础
模运算有时被称为"时钟算术",因为最直观的类比就是普通的钟表盘面。在 12 小时制时钟上,如果现在是 10 点,再过 5 小时,得到的不是 15 点,而是 3 点——数字在到达 12 后会绕回来。用数学语言表述,10 + 5 = 3 (mod 12),意即 15 除以 12 的余数是 3。
模运算
"a mod n"表达式返回整数 a 除以正整数 n 的余数。更正式地说,对任意整数 a 和正整数 n,存在唯一整数 q(商)和 r(余数),使得:
a = q × n + r,其中 0 ≤ r < n
"a mod n"返回的值就是 r。
以下是几个关于 mod 26 的例子——仿射密码正是使用 mod 26:
- 0 mod 26 = 0(因为 0 = 0 × 26 + 0)
- 25 mod 26 = 25(因为 25 = 0 × 26 + 25)
- 26 mod 26 = 0(因为 26 = 1 × 26 + 0)
- 27 mod 26 = 1(因为 27 = 1 × 26 + 1)
- 52 mod 26 = 0(因为 52 = 2 × 26 + 0)
- 53 mod 26 = 1(因为 53 = 2 × 26 + 1)
- 105 mod 26 = 1(因为 105 = 4 × 26 + 1,其中 4 × 26 = 104)
mod 26 与字母密码相关的原因在于英文字母表共有 26 个字母。通过令 A=0、B=1、C=2、……、Z=25,并对任意算术结果取 mod 26,我们可以保证输出始终是 0 到 25 之间的合法字母索引。无论中间计算结果多大,模运算都会将其拉回字母表范围。
模运算的性质
模运算保持了加法和乘法的标准代数性质:
封闭性:任意加法或乘法结果对 n 取模后,始终是 [0, n-1] 范围内的整数。
交换律:(a + b) mod n = (b + a) mod n,(a × b) mod n = (b × a) mod n。
结合律:((a + b) + c) mod n = (a + (b + c)) mod n。
分配律:(a × (b + c)) mod n = ((a × b) + (a × c)) mod n。
模运算与普通算术行为不同的是除法。在普通算术中,每个非零数都有乘法逆元(例如 5 的逆元是 1/5)。但在模运算中,乘法逆元并非总是存在。这一限制对于理解仿射密码为何对密钥施加约束至关重要。
仿射密码公式
仿射密码使用如下公式加密每个字母:
E(x) = (ax + b) mod 26
其中:
- x 是明文字母的数值位置(A=0、B=1、C=2、……、Z=25)
- a 是乘法密钥
- b 是加法密钥
- 结果是密文字母的数值位置
逐步示例:用 a=5、b=8 加密"HELLO"
下面用密钥 a=5、b=8 逐步加密单词 HELLO。
首先,将每个字母转换为对应数值:
- H = 7
- E = 4
- L = 11
- L = 11
- O = 14
对每个数值应用 E(x) = (5x + 8) mod 26:
H(7): E(7) = (5 × 7 + 8) mod 26 = (35 + 8) mod 26 = 43 mod 26 = 17 → R
E(4): E(4) = (5 × 4 + 8) mod 26 = (20 + 8) mod 26 = 28 mod 26 = 2 → C
L(11): E(11) = (5 × 11 + 8) mod 26 = (55 + 8) mod 26 = 63 mod 26 = 11 → L
L(11): E(11) = 11 → L(同上)
O(14): E(14) = (5 × 14 + 8) mod 26 = (70 + 8) mod 26 = 78 mod 26 = 0 → A
密文为 RCLLA。
注意字母 L 加密后仍为 L(L → L)。这不是本例的缺陷——它发生的原因是,当 a=5、b=8 时,数值 11 满足 (5 × 11 + 8) mod 26 = 11。在任何单表替换密码中,某些字母映射到自身都是可能的;关键要求是映射构成双射(一一对应且满射)。
密钥约束:为何 a 必须与 26 互质
仿射密码并非对任意 a 值都有效。乘法密钥 a 必须与 26 互质,即 a 与 26 的最大公约数必须等于 1:gcd(a, 26) = 1。
"互质"的含义
若两个整数除 1 外没有其他公因子,则称它们互质(也称"互素")。26 可以分解为 2 × 13,因此任何能被 2 或 13 整除的数都与 26 有公因子,从而不与 26 互质。
1 到 25 中与 26 互质的整数为:1、3、5、7、9、11、15、17、19、21、23、25。
这恰好给出 12 个 a 的合法取值。(这个数量由欧拉函数 φ(26) = φ(2) × φ(13) = 1 × 12 = 12 给出。)
非互质值为何会破坏密码
要理解为何 a 必须与 26 互质,考察不满足此条件时会发生什么。取 a=2(它与 26 不互质,因为 gcd(2, 26) = 2)。
对每个字母应用 E(x) = (2x + 0) mod 26:
- A(0):(2 × 0) mod 26 = 0 → A
- B(1):(2 × 1) mod 26 = 2 → C
- C(2):(2 × 2) mod 26 = 4 → E
- ……
- M(12):(2 × 12) mod 26 = 24 → Y
- N(13):(2 × 13) mod 26 = 26 mod 26 = 0 → A
A 和 N 都加密为 A。映射不是一一对应的。当两个不同的明文字母产生相同的密文字母时,过程无法逆转——解密变得不可能,因为你无法确定原来的字母是哪一个。
互质要求确保加密函数在集合 {0, 1, ..., 25} 上构成双射,从而保证每个密文字母恰好对应一个明文字母。
a 合法取值完整表格
| a 值 | gcd(a, 26) | 合法? |
|---|---|---|
| 1 | 1 | 是 |
| 2 | 2 | 否 |
| 3 | 1 | 是 |
| 4 | 2 | 否 |
| 5 | 1 | 是 |
| 6 | 2 | 否 |
| 7 | 1 | 是 |
| 8 | 2 | 否 |
| 9 | 1 | 是 |
| 10 | 2 | 否 |
| 11 | 1 | 是 |
| 12 | 2 | 否 |
| 13 | 13 | 否 |
| 14 | 2 | 否 |
| 15 | 1 | 是 |
| 16 | 2 | 否 |
| 17 | 1 | 是 |
| 18 | 2 | 否 |
| 19 | 1 | 是 |
| 20 | 2 | 否 |
| 21 | 1 | 是 |
| 22 | 2 | 否 |
| 23 | 1 | 是 |
| 24 | 2 | 否 |
| 25 | 1 | 是 |
模乘法逆元
a 模 26 的乘法逆元是满足以下条件的整数 a⁻¹:
(a × a⁻¹) mod 26 = 1
这是普通乘法逆元在模运算中的对应概念。就像普通算术中 5 × (1/5) = 1,在模运算中我们需要 a × a⁻¹ ≡ 1 (mod 26)。
解密为何需要乘法逆元
解密需要"撤销"加密中的乘法步骤。在普通代数中,如果通过 y = ax + b 加密,解密时求解 x:x = (y - b) / a。除以 a 等价于乘以 a 的逆元。
在模运算中,我们无法直接做除法,而是乘以模逆元。解密公式为:
D(y) = a⁻¹(y - b) mod 26
当且仅当 gcd(a, 26) = 1 时,模逆元 a⁻¹ 存在。这正是互质要求——两个约束从两个不同角度表达的是同一要求。
用扩展欧几里得算法求模逆元
扩展欧几里得算法能找到整数 s 和 t,使得:
a × s + 26 × t = gcd(a, 26) = 1
当 gcd(a, 26) = 1 时,s 值(若需要使其为正则对 26 取模)就是 a 的模逆元。
示例:求 5 mod 26 的逆元。
对 26 和 5 应用欧几里得算法:
- 26 = 5 × 5 + 1
读取系数:1 = 26 - 5 × 5。
因此 5 × (-5) + 26 × 1 = 1,即 s = -5。
转换为正值 mod 26:-5 mod 26 = 21。
验证:(5 × 21) mod 26 = 105 mod 26 = 1。正确。
完整参考表:mod 26 的所有乘法逆元
| a | a⁻¹ mod 26 | 验证:(a × a⁻¹) mod 26 |
|---|---|---|
| 1 | 1 | (1 × 1) mod 26 = 1 |
| 3 | 9 | (3 × 9) mod 26 = 27 mod 26 = 1 |
| 5 | 21 | (5 × 21) mod 26 = 105 mod 26 = 1 |
| 7 | 15 | (7 × 15) mod 26 = 105 mod 26 = 1 |
| 9 | 3 | (9 × 3) mod 26 = 27 mod 26 = 1 |
| 11 | 19 | (11 × 19) mod 26 = 209 mod 26 = 1 |
| 15 | 7 | (15 × 7) mod 26 = 105 mod 26 = 1 |
| 17 | 23 | (17 × 23) mod 26 = 391 mod 26 = 1 |
| 19 | 11 | (19 × 11) mod 26 = 209 mod 26 = 1 |
| 21 | 5 | (21 × 5) mod 26 = 105 mod 26 = 1 |
| 23 | 17 | (23 × 17) mod 26 = 391 mod 26 = 1 |
| 25 | 25 | (25 × 25) mod 26 = 625 mod 26 = 1 |
注意某些对互为逆元:3 与 9、5 与 21、7 与 15、11 与 19、17 与 23。1 和 25 是自身的逆元(1 × 1 = 1,25 × 25 = 625 = 24 × 26 + 1)。
解密公式
定义模逆元后,完整的解密公式为:
D(y) = a⁻¹(y - b) mod 26
其中 y 是密文字母的数值,b 是加法密钥,a⁻¹ 是乘法密钥 a 的模逆元。
计算 (y - b) 时结果可能为负数。在模运算中正确处理此情况的方法是:在应用逆元乘法之前对负结果加 26,或等价地计算 ((y - b) mod 26 + 26) mod 26,以确保结果非负。
逐步示例:用 a=5、b=8 解密"RCLLA"
之前我们将 HELLO 加密为 RCLLA。现在逆向还原。当 a=5 时,模逆元为 a⁻¹ = 21。解密公式为 D(y) = 21(y - 8) mod 26。
R(17): D(17) = 21 × (17 - 8) mod 26 = 21 × 9 mod 26 = 189 mod 26
189 ÷ 26 = 7 余 7,所以 189 mod 26 = 7 → H
C(2): D(2) = 21 × (2 - 8) mod 26 = 21 × (-6) mod 26 = -126 mod 26
-126 + 5 × 26 = -126 + 130 = 4,所以 -126 mod 26 = 4 → E
L(11): D(11) = 21 × (11 - 8) mod 26 = 21 × 3 mod 26 = 63 mod 26
63 = 2 × 26 + 11,所以 63 mod 26 = 11 → L
L(11): 同上 → L
A(0): D(0) = 21 × (0 - 8) mod 26 = 21 × (-8) mod 26 = -168 mod 26
-168 + 7 × 26 = -168 + 182 = 14,所以 -168 mod 26 = 14 → O
解密结果为 HELLO。加解密的完整闭环验证成功。
312 种密钥组合
仿射密码合法密钥组合的总数为:
12 个合法 a 值 × 26 个合法 b 值 = 312 种密钥组合
对安全性的意义
将 312 个密钥放到对比中来看:
- 凯撒密码:26 个密钥(仅加法位移 b,a 固定为 1)
- 仿射密码:312 个密钥(a 有 12 种选择,b 有 26 种选择)
- 简单替换密码:26! ≈ 4 × 10^26 种可能排列
- 维吉尼亚密码(长度为 n 的密钥):26^n 个密钥
- AES-128:2^128 ≈ 3.4 × 10^38 个密钥
现代计算机测试全部 312 个仿射密码密钥只需不到 1 毫秒。这意味着该密码对自动化攻击几乎没有任何安全性可言。与 AES-128 的对比揭示了古典加密与现代加密之间的巨大鸿沟:AES 的密钥数量约为仿射密码的 10^36 倍。
仿射密码确实是对凯撒密码的实质性改进——它有 12 倍以上的密钥,且字母映射非均匀,使纯粹的频率分析稍显复杂。但这些改进都远不足以使其具备密码学安全性。
破解仿射密码
尽管仿射密码具有数学上的优雅性,它仍然很容易被多种技术破解。
方法一:暴力破解
由于只有 312 种密钥组合,最直接的攻击方式就是逐一尝试。对于 12 个合法 a 值中的每一个,以及 26 个 b 值中的每一个,将解密公式应用于密文并检查结果。使用英文字母频率分析对每个候选明文打分并排序,正确解密的结果会排在前列。
这种方法不需要任何明文知识,几行代码即可实现。在任何现代设备上,整个过程在毫秒级别完成。
方法二:频率分析
仿射密码是单表替换密码,即每个明文字母始终映射到同一个密文字母。这一特性使其容易受到频率分析攻击。
在英文文本中,某些字母出现的频率远高于其他字母。最常见的字母是 E(约占 12.7%),其次是 T(9.1%)、A(8.2%)、O(7.5%)和 I(7.0%)。最不常见的字母是 Z、Q、X 和 J。
用频率分析攻击仿射密码的方法:统计密文中每个字母的出现频率。最频繁出现的密文字母很可能是 E 的加密结果,第二频繁的很可能是 T 的加密结果。有了两对已知的明密文对,便可代入方程组求解密钥 a 和 b(参见下方方法三)。
方法三:已知明文攻击
若已知两对明密文字母对 (x₁, y₁) 和 (x₂, y₂),可以列出两个联立方程:
- y₁ ≡ ax₁ + b (mod 26)
- y₂ ≡ ax₂ + b (mod 26)
两式相减:
y₁ - y₂ ≡ a(x₁ - x₂) (mod 26)
在 gcd(x₁ - x₂, 26) = 1 的前提下,将两边乘以 (x₁ - x₂) 的模逆元即可求出 a。知道 a 后,代入原方程求 b。
推导示例:假设已知明文 E(x=4)映射为密文 L(y=11),明文 T(x=19)映射为密文 H(y=7)。
由两个方程:
- 11 ≡ 4a + b (mod 26)
- 7 ≡ 19a + b (mod 26)
两式相减:11 - 7 ≡ 4a - 19a (mod 26),得 4 ≡ -15a (mod 26),等价于 4 ≡ 11a (mod 26)。
两边乘以 11 mod 26 的逆元(即 19):a ≡ 19 × 4 (mod 26) = 76 mod 26 = 24……此处需要 gcd(11, 26) = 1,确实成立,因此继续:19 × 4 = 76,76 mod 26 = 76 - 2×26 = 24。
验证:但 24 不是合法的 a 值(gcd(24, 26) = 2)。这说明假设的明密文对有误,或该密码不是 a=24 的仿射密码。这一结果展示了已知明文攻击如何同时恢复密钥并验证关于密码结构的假设。
仿射密码家族
仿射密码并不孤立——它属于一组线性密码家族,理解它与其他密码的关系有助于揭示古典密码学背后的数学结构。
凯撒密码:a = 1
当乘法密钥设为 a = 1 时,仿射公式变为:
E(x) = (1 × x + b) mod 26 = (x + b) mod 26
这正是凯撒密码的公式。凯撒密码是仿射密码没有乘法运算的退化情形。令 a=1 意味着每个字母都按相同常数 b 移位,对整个字母表产生均匀位移。
乘法密码:b = 0
当加法密钥设为 b = 0 时,仿射公式变为:
E(x) = (ax + 0) mod 26 = ax mod 26
这就是乘法密码。它只使用乘法部分,产生非均匀字母映射但没有任何位移。乘法密码很少单独讨论,因为它始终将 A(x=0)映射到 A(E(0) = 0),这是一个明显的弱点。
希尔密码:矩阵推广
希尔密码可以看作仿射密码在多字母上的推广。与一次加密一个字母的标量乘法不同,希尔密码用矩阵乘法一次加密 n 个字母的分组:
E(x) = (Ax + b) mod 26
其中 A 是 n×n 可逆矩阵,x 和 b 是 n 维向量。用标量矩阵 [a] 和向量 [b] 的 1×1 情形恰好就是仿射密码。关键思想是一致的:矩阵 A 必须模 26 可逆,这是互质要求在矩阵层面的类比。
与现代密码学的关联
理解仿射密码的结构能为学习现代密码学概念奠定基础:
a 必须与 26 互质的要求,是加密函数必须可逆这一更普遍原则的具体体现。在 RSA 中,公钥指数 e 必须与 φ(n) 互质,原因相同。
用扩展欧几里得算法计算模逆元,与从 RSA 公钥参数中推导私钥时所用的算法完全相同。
仿射密码在模运算环 Z₂₆ 上实现的线性映射概念,直接推广到 AES 等分组密码中所使用的域运算。
常见问题解答
如果 a 与 26 不互质会发生什么?
若 a 与 26 不互质,加密函数就不是双射。多个明文字母会映射到同一个密文字母,使得加密无法被唯一逆转。密码变为不可逆,因而无法使用。例如,当 a=2 时,A(0)和 N(13)都加密为 A,因为 (2 × 0) mod 26 = 0 且 (2 × 13) mod 26 = 0。任何含有 A 或 N 的消息经过加密后都将无法恢复其原始内容。
仿射密码可以加密数字和特殊字符吗?
在标准形式下,仿射密码只加密英文字母表的 26 个字母。数字、空格、标点符号和其他特殊字符通常保持不变地传递。某些实现将密码扩展到更大的字母表(例如,对所有可打印 ASCII 字符使用 mod 95),但标准定义使用 mod 26,且只作用于字母。
仿射密码最强的密钥组合是什么?
没有任何仿射密码密钥组合能提供有意义的安全性,但从纯理论角度来看,a 值远离 1 的密钥(如 a=7 或 a=17)产生的字母表看起来比接近 1 的密钥更加混乱。在只有 312 种组合的密码中,"最强"密钥是主观的——所有密钥对暴力破解来说同样微不足道。
仿射密码与现代加密相比如何?
对比极为悬殊。仿射密码有 312 种密钥组合;AES-128 有 2^128 ≈ 3.4 × 10^38 种组合。现代密码还使用多轮非线性替换和置换,能抵抗代数攻击、频率分析和差分密码分析。仿射密码作为线性单表替换密码,同时容易受到所有这些攻击向量的威胁。它绝不应被用于保护真实信息。
仿射密码可以用于英文以外的字母表吗?
可以,但需要做相应修改。对于大小为 m 的字母表,公式变为 E(x) = (ax + b) mod m,其中 a 必须与 m 互质。例如,对于 28 个字母的阿拉伯字母表,应使用 mod 28,a 的合法取值就是与 28 互质的那些数。模逆元表也会相应改变。无论字母表大小如何,相同的数学原理均适用,只是具体的合法密钥值会有所不同。
总结
仿射密码证明,即使是简单的线性变换结合模运算,也需要严格的数学约束才能正确运行。a 必须与 26 互质的要求、解密中模乘法逆元的必要性,以及 312 个密钥空间的结构,都是底层数论的直接结果。
研究仿射密码能让你亲身实践模运算、扩展欧几里得算法、模运算环上的线性方程组以及密码分析思维——这些概念在更高级的密码学场景中反复出现。
实际操作入口:
- 使用我们的免费仿射密码编码器,交互式加密和解密消息
- 使用我们的仿射解码器破解密文,观看暴力分析的实际效果
- 使用我们的仿射计算器计算模逆元,深入探索核心数学原理