使用方法
- 这个维吉尼亚密码工具的输入框里预置了明文
Attack at dawn,密钥框里是Lemon,默认标准变体、加密方向,结果区直接显示密文Lxfopv ef rnhr,不用先点按钮。 - 选方向:加密把明文字母往后推密钥字母那么多位,解密往前拉。解密不是另一个公式——标准式的解密就是
C = P − K,即 Variant Beaufort 的加密式,所以两者互为逆运算。 - 选变体:标准是
C = P + K;Beaufort 是C = K − P,它自逆,加解密同一个按钮不用切方向;Variant Beaufort 是C = P − K。同一段明文在三种变体下的结果分别是Lxfopv ef rnhr、Lltolb et lnpr、Pphmpz wh pnlj。 - 「空格标点也吃密钥位」默认不勾选:非字母原样保留且不消耗密钥位置,因此结果与去掉空格的经典写法
ATTACKATDAWN → LXFOPVEFRNHR逐位一致;勾上之后同一段会变成Lxfopv mh oeib。 - 拿到一段不知密钥长度和内容的密文时,点「估算密钥长度」,页面会给出重合指数、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、标准变体、加密方向、非字母不推进指针。逐项核对:
- 参与运算的字母 12 个(
ATTACKATDAWN),空格 2 个原样保留,整串 14 个字符; - 标准式结果
Lxfopv ef rnhr,与结果区直出内容逐字符一致;Beaufort 得Lltolb et lnpr,Variant Beaufort 得Pphmpz wh pnlj; - 去掉空格的经典写法
ATTACKATDAWN→LXFOPVEFRNHR,与本页默认结果去掉空格后逐位相同,这就是「非字母不推进指针」的直接证据; - 勾上「空格标点也吃密钥位」后同一输入变成
Lxfopv mh oeib——差别只在两个空格各吃掉一个密钥位; - 密钥长度 5 的密钥空间是
26⁵ = 11881376,等效 23.50 bit,只相当于 10 位纯数字(33.22 bit)的约 0.0012 倍; - 绕回校验:
Z配密钥B(位移 1)得A,A用 Variant Beaufort 配B得Z。
密钥长度 → 密钥空间对照表
每一行都是 26 的整次幂,等效位数按 log2(26) ≈ 4.7004 乘以长度得到。第 12 行开始数值已超出 JavaScript 安全整数 9007199254740991,只能用科学计数法表示。
| 密钥长度 L | 密钥空间 26^L | 等效位数 | 备注 |
|---|---|---|---|
| 1 | 2.6000e+1 | 4.70 bit | 退化成单表位移,与凯撒同等 |
| 2 | 6.7600e+2 | 9.40 bit | |
| 3 | 1.7576e+4 | 14.10 bit | |
| 4 | 4.5698e+5 | 18.80 bit | |
| 5 | 1.1881e+7 | 23.50 bit | 本页示例密钥 LEMON 所在行 |
| 6 | 3.0892e+8 | 28.20 bit | |
| 7 | 8.0318e+9 | 32.90 bit | 约等于 10 位纯数字 |
| 8 | 2.0883e+11 | 37.60 bit | |
| 9 | 5.4295e+12 | 42.30 bit | |
| 10 | 1.4117e+14 | 47.00 bit | 仍在安全整数内 |
| 11 | 3.6703e+15 | 51.70 bit | 最后一个不溢出的长度 |
| 12 | 9.5429e+16 | 56.41 bit | 已超出 2^53,只能用对数表示 |
| 13 | 2.4812e+18 | 61.11 bit | |
| 14 | 6.4510e+19 | 65.81 bit | |
| 15 | 1.6773e+21 | 70.51 bit | |
| 16 | 4.3609e+22 | 75.21 bit | 16 字母的密钥仍不足 AES-128 |
| 17 | 1.1338e+24 | 79.91 bit | |
| 18 | 2.9480e+25 | 84.61 bit | |
| 19 | 7.6647e+26 | 89.31 bit | |
| 20 | 1.9928e+28 | 94.01 bit | |
| 21 | 5.1813e+29 | 98.71 bit | |
| 22 | 1.3471e+31 | 103.41 bit | |
| 23 | 3.5026e+32 | 108.11 bit | |
| 24 | 9.1067e+33 | 112.81 bit | 要追平 128 bit 需 28 个字母 |
三种变体在同一输入下的对照
| 变体 | 公式 | Attack at dawn 的结果 | 求逆方式 |
|---|---|---|---|
| 标准 Vigenère | C = (P + K) mod 26 | Lxfopv ef rnhr | 改用 C = P − K,或切到解密方向 |
| Beaufort | C = (K − P) mod 26 | Lltolb et lnpr | 自逆,再做一次即还原 |
| Variant Beaufort | C = (P − K) mod 26 | Pphmpz wh pnlj | 改用 C = P + K,即标准式 |
输入范围、边界与估算误差说明
- 密钥长度限制 1~512 个字符。归一化后长度变成 0(例如密钥全是数字)时会被明确拒绝并指出原因,不会退化成「不动」的恒等变换。
- 维吉尼亚密码工具的单次输入上限是 20000 字符。转换是逐字符一次取模,属线性开销;再长的文本建议分段,页面上渲染几十万字符会明显变慢。
- 只位移 26 个英文字母。汉字、数字、全角字母、带变音符的
é一律原样保留。这不是简化:维吉尼亚原本就定义在 26 个拉丁字母上。 - 大小写各自独立循环。大写区间与小写区间分别取模,
A变L的同时a变l,不会出现大小写互串。 - 密钥长度估算是估算,不是精算。用本页同一段明文(221 个字母、密钥长度 5)实测:整体 IC = 0.039860,Friedman 估算给 18.577(取整 19),与真实值 5 差了三倍多;把样本放大到 1326 个字母后估算收敛到 7.868。样本越短,统计噪声越大——这是估算方法本身的性质,不是实现出错。
- Kasiski 检验在短样本上也不稳。同一段密文(221 个字母)里只找到 7 个重复三字母片段,间距是 25、35、35、115、160、145、30,最大公约数 5,恰好命中真实值;但这依赖运气,样本不足时公约数常常落回 1。所以两个估算要一起看。
- 验证密钥长度猜对了没有。按猜的长度分列后,每一列内部应当是单表,列内 IC 应明显回升到英文水平:上面那段密文按 5 分列后各列 IC 是 0.070707、0.058140、0.066596、0.060254、0.059197,平均 0.062979,远高于整体 IC 的 0.039860——这就是「猜对了」的信号。
- 安全边界。即使用 28 个字母的密钥追平 128 bit,维吉尼亚依然只是课堂教具:它保留词长与标点,频率分析配合分列几乎立刻见效。真实保密请用现代算法,本页的输出不要用于任何真实信息。
常见问题
维吉尼亚密码工具里的三种变体该怎么选?
按你参考资料的口径选。课本与绝大多数教材用的是标准式 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 面板里多点几次「开始转换」确认。
相关工具
- 凯撒密码工具:全篇一个位移的单表版本,可穷举 26 种位移,与本页的多表轮换正好构成对照。
- Atbash密码工具:字母表倒序的单表代换,同样自逆,用于对比「自逆」这一性质的两种来源。
- ROT13密码工具:位移 13 这一自逆特例,适合剧透遮蔽与谜题场景。
- XOR密码工具:按位异或的现代玩法,密钥逐字符参与运算,与模 26 加减是两条路径。
- Brute力时间计算器:把密钥空间换算成穷举耗时,用来理解上面那张对照表的实际含义。
- 密码熵值计算器:按字符池与长度算信息熵,可对照本页的「等效位数」一列。
- 编码解码:查看全部编码解码工具。