跳到主要内容

仿射密码 Affine 加解密原理:ax+b 与互质条件讲透

从 ax+b 公式讲清仿射密码的加密解密,说明密钥 a 为什么必须与 26 互质,a=1 时如何退化成凯撒,适合 CTF 解题和密码学课堂入门的单表替换教学。

发布于 作者 李雷
#仿射密码 #密码学 #CTF #单表替换 #模运算

仿射密码 Affine:ax+b 单表替换的加解密原理

仿射密码是古典密码里很值得学的一个,因为它把两件事缝在一起:凯撒的位移加法,和一步乘法。一句话写公式就是 E(x) = (ax + b) mod 26。这里 x 是字母的位置,A 记 0,Z 记 25,a 和 b 是两个密钥数。它属于单表替换密码,每个明文字母固定对应一个密文字母,跑完整篇文章这张对应表都不变。

加密公式怎么算

把字母先换成 0 到 25 的数,代进 ax+b,再对 26 取模,得到的数换回字母就是密文。乘法这一步是它和凯撒最大的区别:凯撒只把每个字母平移固定格数,仿射先按 a 拉伸一遍,再按 b 平移,所以对应关系不再是简单的整体右移,而是打乱后的一张表。

举个能手算验证的例子。取 a = 5,b = 8,加密字母 A:A 的位置是 0,代进公式得到 (5 × 0 + 8) mod 26 = 8,位置 8 是字母 I,所以 A 加密成 I。再看 B:位置 1,(5 × 1 + 8) mod 26 = 13,位置 13 是 N,B 加密成 N。整个单词 AFFINE 用这组密钥会变成 IHHWVC,这正是这套密码教学里最经典的一对输入输出。你可以打开 仿射密码加解密器,填 a = 5、b = 8 选加密,逐字对一遍。

为什么 a 必须与 26 互质

这是仿射密码最关键、也最容易踩坑的一条:a 必须与 26 互质,也就是 gcd(a, 26) = 1。原因藏在解密里。解密要把乘法这一步"除回去",而模运算里没有真正的除法,只能乘以 a 的模逆元。这个逆元只有当 a 和 26 没有公因子时才存在。26 = 2 × 13,所以只要 a 是偶数或者 13 的倍数,逆元就不存在。

后果很具体:逆元不存在时,两个不同的明文字母会被映射到同一个密文字母,信息在加密那一刻就丢了,谁都还原不回来。合法的 a 恰好只有十二个:1、3、5、7、9、11、15、17、19、21、23、25。其余的 a,工具会直接报错拦下,而不是闷头生成一段无法解码的密文。

解密公式是 D(y) = a⁻¹ × (y − b) mod 26。还用 a = 5 这组,5 的模逆元是 21,因为 5 × 21 = 105,而 105 mod 26 = 1。于是 D(y) = 21 × (y − 8) mod 26,正好抵消前面的加密,把 IHHWVC 还原成 AFFINE。

a = 1 时退化成凯撒

把 a 设成 1,公式 1 × x + b 就塌成 x + b,纯粹的加法平移,这恰好就是位移量为 b 的凯撒密码。换句话说,凯撒是仿射的一个特例,仿射是凯撒外面套了一层乘法。用 a = 1、b = 3 加密一句话,输出会和 凯撒密码加解密器 位移 3 的结果逐字相同,A 变 D、B 变 E。理解了这层家族关系,位移、仿射、再到更复杂的替换密码就连成一条线了。

也正因为这样,仿射的密钥空间比凯撒大一点:凯撒只有 26 种位移,仿射是 12 种合法的 a 乘 26 种 b,一共 312 种组合。

CTF 与课堂里的用法

我自己第一次认真用到仿射,是在一道 CTF crypto 题里。题面给了一段密文和提示"key is ax+b",但没给 a 和 b。312 种组合并不多,我把已知的 flag 前缀 CTF{ 当作 crib,逐个试与 26 互质的 a,挑出花括号里裹着正常英文的那一行,几秒钟就出 flag。这种暴力空间小到可以肉眼扫的特性,正是它适合教学的原因:学生能亲手把整张密钥表试一遍,而不是停在抽象公式上。

课堂上它还是讲模逆元最干净的例子。让学生填一个与 26 有公因子的 a,比如 13,工具当场报错;再换成 5,它会显示逆元 21 并正确解密。gcd(a, 26) = 1 这个条件为什么不能省,这一刻就看明白了。

一句话提醒:这不是真加密

仿射密码只有 312 个密钥,一眨眼就能穷举破解,它属于密码学史和教学范畴,不要拿它保护密码、私钥或任何真实的私人消息。把它当成谜题、密室线索和数论课的教具,它就很好用。


Made by Toolora · Updated 2026-06-13