维吉尼亚密码工具

多表替换:密钥逐字母轮换取模,同一个明文字母在不同位置会变成不同密文字母。本页给出标准式、Beaufort、Variant Beaufort 三种变体,明确「非字母不推进密钥指针」这一分歧点,并附重合指数与重复片段的密钥长度估算。

密钥: 变体:
Lxfopv ef rnhr

(标准 Vigenère 加密,密钥 LEMON 长度 5:14 个字符中 12 个字母被位移,2 个空格原样保留,密钥空间 26^5 = 11881376,等效 23.50 bit)

提示:输入框是多行文本,Enter 留给换行,转换请按 Ctrl + Enter(macOS 为 Cmd + Enter);密钥框是单行输入,裸按 Enter 即可触发。示例已服务端直出,脚本没跑也有结果。

使用方法

  1. 这个维吉尼亚密码工具的输入框里预置了明文 Attack at dawn,密钥框里是 Lemon,默认标准变体、加密方向,结果区直接显示密文 Lxfopv ef rnhr,不用先点按钮。
  2. 选方向:加密把明文字母往后推密钥字母那么多位,解密往前拉。解密不是另一个公式——标准式的解密就是 C = P − K,即 Variant Beaufort 的加密式,所以两者互为逆运算。
  3. 选变体:标准是 C = P + K;Beaufort 是 C = K − P,它自逆,加解密同一个按钮不用切方向;Variant Beaufort 是 C = P − K。同一段明文在三种变体下的结果分别是 Lxfopv ef rnhr、Lltolb et lnpr、Pphmpz wh pnlj。
  4. 「空格标点也吃密钥位」默认不勾选:非字母原样保留且不消耗密钥位置,因此结果与去掉空格的经典写法 ATTACKATDAWN → LXFOPVEFRNHR 逐位一致;勾上之后同一段会变成 Lxfopv mh oeib。
  5. 拿到一段不知密钥长度和内容的密文时,点「估算密钥长度」,页面会给出重合指数、Friedman 估算值与重复片段间距的最大公约数,作为继续分析的起点。

这个维吉尼亚密码工具能解决什么问题

一是把「多表替换」这个概念真正跑起来。凯撒密码全篇一个位移,明文字母 E 永远是同一个密文字母;维吉尼亚的密钥逐字母轮换,同一个 E 在密钥 L、E、M 三个位置上分别变成 P、I、Q。本页让你输入任意密钥并立刻看到轮换效果,而不是停在概念上。

二是处理不同资料来源的口径差异。同一个「维吉尼亚」名字下面至少藏着三套公式(三种变体)和两套密钥指针约定,跨书跨站复制实验结果时最容易在这里对不上号。本页把它们做成显式选项,任何一段结果都能说明自己用的是哪一套。

三是给古典密码分析提供起点。估算密钥长度是破译多表替换的第一步:重合指数给出「整体像不像单表」的量化判断,重复片段间距的最大公约数直接指向可能的密钥长度。本页把这两个数算出来,你再拿去分列做频率分析。

本页不做:不做单表整体位移(那是「凯撒密码工具」);不做自密钥(autokey)这类把明文当密钥续接的变体;不自动破译完整密钥——本页只给出长度估算与统计线索,逐列频率分析需要你自己判断;也绝不能用来保护真实信息。

原理:三条公式、一套指针约定与两个统计量

核心算术只有一行。对每个字符取码点,落在 A–Z(65~90)或 a–z(97~122)时,取它在本字母表里的序号(0~25)与当前密钥字母的序号做一次模 26 加减,再补回 65 或 97 拼成新字符;其余字符原样返回。String.fromCharCode 与 % 就够了,没有查表、没有第三方依赖。

三条公式的关系。标准式是 C = (P + K) mod 26;Variant Beaufort 是 C = (P − K + 26) mod 26,它恰好就是标准式的解密式;Beaufort 是 C = (K − P + 26) mod 26,因为 K − (K − P) = P,它自己就是自己的逆运算,加解密共用同一行代码。加 26 再取模这一步不能省:JavaScript 的 % 对负数返回负值,(0 − 1) % 26 是 −1 而不是 25,不加 26 会直接算出非法字符。

密钥指针的约定是本页最重要的默认项。密钥长度有限,需要按位置循环取用。本页默认「只有字母推进指针」:空格、标点、数字既不参与位移,也不消耗密钥位置。这条约定直接决定结果是否等于课本上的经典答案——按它算,Attack at dawn 得到 Lxfopv ef rnhr,去掉空格正是经典的 LXFOPVEFRNHR;若改成每个字符都推进指针,同样输入得到 Lxfopv mh oeib。两种写法都能找到出处,但结果不同,必须挑明。

密钥归一化在位移之前完成。密钥先做 NFD 分解并去掉组合音标,再剔除非英文字母,最后统一转大写:Le-mon!、lé mon、 Lemon 三个不同输入都归一成 LEMON;123456 归一后长度为 0,此时工具明确报错而不是静默按空串处理。

重合指数 IC(Index of Coincidence)是什么。它是「随机抽两个字符恰好相同」的概率,用 Σ nᵢ(nᵢ−1) / (N(N−1)) 计算。按标准英文字母频率算,英文单表文本的 IC 是 0.065497(文献常取近似值 0.0667),而均匀随机文本是 26 × (1/26)² = 1/26 = 0.038462。多表替换把这份「偏向性」摊薄了,所以密文的 IC 会落在两者之间,且密钥越长越接近 0.038462。

Friedman 估算是怎么推的。把密文按假想长度 L 分成 L 列,每一列内部其实是同一个位移的单表。整体 IC 与列内 IC 之间有关系式,反解出 L ≈ N × (0.0667 − 0.038462) / ((N−1) × IC − N × 0.038462 + 0.0667)。本页按这个式子算,并同时列出重复三字母片段的间距与它们的最大公约数——那是 Kasiski 检验(1863 年)的思路。

历史与命名。如今被称为「维吉尼亚」的这套多表替换,最早由 Giovan Battista Bellaso 在 1553 年提出;Blaise de Vigenère 在 1586 年发表的是更强的自密钥(autokey)方案,19 世纪才被误挂到他名下。这不是猎奇:它解释了为什么不同资料里「维吉尼亚」指的东西并不完全一样。

完整示例(数值仅作演示)

示例条件与页面默认态一致:明文 Attack at dawn、密钥 Lemon、标准变体、加密方向、非字母不推进指针。逐项核对:

密钥长度 → 密钥空间对照表

每一行都是 26 的整次幂,等效位数按 log2(26) ≈ 4.7004 乘以长度得到。第 12 行开始数值已超出 JavaScript 安全整数 9007199254740991,只能用科学计数法表示。

密钥长度 L密钥空间 26^L等效位数备注
12.6000e+14.70 bit退化成单表位移,与凯撒同等
26.7600e+29.40 bit
31.7576e+414.10 bit
44.5698e+518.80 bit
51.1881e+723.50 bit本页示例密钥 LEMON 所在行
63.0892e+828.20 bit
78.0318e+932.90 bit约等于 10 位纯数字
82.0883e+1137.60 bit
95.4295e+1242.30 bit
101.4117e+1447.00 bit仍在安全整数内
113.6703e+1551.70 bit最后一个不溢出的长度
129.5429e+1656.41 bit已超出 2^53,只能用对数表示
132.4812e+1861.11 bit
146.4510e+1965.81 bit
151.6773e+2170.51 bit
164.3609e+2275.21 bit16 字母的密钥仍不足 AES-128
171.1338e+2479.91 bit
182.9480e+2584.61 bit
197.6647e+2689.31 bit
201.9928e+2894.01 bit
215.1813e+2998.71 bit
221.3471e+31103.41 bit
233.5026e+32108.11 bit
249.1067e+33112.81 bit要追平 128 bit 需 28 个字母

三种变体在同一输入下的对照

变体公式Attack at dawn 的结果求逆方式
标准 VigenèreC = (P + K) mod 26Lxfopv ef rnhr改用 C = P − K,或切到解密方向
BeaufortC = (K − P) mod 26Lltolb et lnpr自逆,再做一次即还原
Variant BeaufortC = (P − K) mod 26Pphmpz wh pnlj改用 C = P + K,即标准式

输入范围、边界与估算误差说明

常见问题

维吉尼亚密码工具里的三种变体该怎么选?

按你参考资料的口径选。课本与绝大多数教材用的是标准式 C = P + K;Beaufort 常见于英美古典文献与部分密码机;Variant Beaufort 与标准式互为逆。若你手上的密文解密不出来,先换变体试一次,这是最常见的「对不上号」原因。

为什么我的结果和书上差了一两位?

先查两件事:一是非字母是否推进密钥指针(本页默认不推进,勾上复选框可切换);二是密钥有没有先归一化(去掉空格、连字符与音标)。本页默认口径下 Attack at dawn 得到 Lxfopv ef rnhr,去掉空格正是经典答案 LXFOPVEFRNHR。

Beaufort 为什么不用切方向?

因为它自逆:K − (K − P) = P。对密文再做一次 Beaufort 就得到明文,加密与解密是同一行代码,切换方向反而会算出错误结果。

估算出来的长度和实际不符怎么办?

先确认样本足够长。221 个字母时本页实测估算 18.577(真实 5),放大到 1326 个字母后收敛到 7.868。样本短时请把估算值当作候选列表,逐个长度分列后看列内 IC 是否回升到 0.06 附近,靠这个信号确认真值。

重复片段间距的最大公约数为什么是 1?

说明样本里没有足够的重复片段,或重复是偶然撞上的。Kasiski 检验靠的是「同一明文片段恰好撞上同一密钥位置」产生的重复,密钥越长、文本越短,撞上的概率越低。这种情况请改用分列 IC 的办法。

密钥里能带空格和中文吗?

可以输入,但会被归一化掉:先 NFD 分解去音标,再剔除非英文字母,最后转大写。Le-mon! 与 lé mon 都归一成 LEMON。如果归一化后一个字母都不剩,工具会明确拒绝而不是当作空密钥。

能把维吉尼亚用在真实保密上吗?

不能。它保留词长与标点,密钥长度一旦确定,剩下的就是分列做频率分析,现代设备上几秒钟就能破。本页给出的密钥空间数字说明的是「暴力穷举有多难」,而破译它根本不需要穷举。真实场景请用现代加密。

输入的内容会被上传或保存吗?

不会。位移、统计量、对照表全在当前页面算完,没有网络请求,也不写 Cookie 或本地存储。可以在开发者工具的 Network 面板里多点几次「开始转换」确认。

相关工具