安全实用 本地计算 开箱即用 内置示例 不留痕迹

维吉尼亚密码与栅栏密码

维吉尼亚密码是凯撒密码的升级版:凯撒固定移几位,维吉尼亚让每一位的位移由密钥决定,同一个字母在文中的不同位置会变成不同字符。本工具提供维吉尼亚与栅栏两种古典密码的加解密,它们适合做教学演示、谜题设计与轻量文本混淆,但不具备现代加密强度。

维吉尼亚密码是凯撒的升级版:凯撒把每个字母都移固定位数,维吉尼亚让每一位的位移由密钥轮流决定——密钥 LEMON 对应 11、4、12、14、13,明文 ATTACKATDAWN 加密后得到 LXFOPVEFRNHR。本工具同时提供栅栏密码(只重排顺序、不改动字符),两者都是古典密码教学的常客。

一个影响互操作的口径:本工具只位移字母,数字、空格、标点原样保留且不消耗密钥位。很多老实现把空格也算一位,双方规则不一致时密钥就会错位、解出来全是乱码——这是明明算法一样却对不上的最常见原因。古典密码只用于教学与谜题,真实数据请用 AES。

使用步骤

  1. 选密码类型:维吉尼亚(需密钥)或栅栏(需栏数)。
  2. 选加密或解密,粘贴文本,结果即时生成。
  3. 维吉尼亚的密钥只取字母(l-e m o n 等效 LEMON),无字母会报错。
  4. 解出乱码时先核对口径:密钥错位、空格是否占位、栏数是否一致。

计算原理与示例

维吉尼亚密码的算法

维吉尼亚的算法是:把密钥字母换算成 0~25 的位移量,依次对明文里的字母做凯撒位移,密钥循环使用。例如密钥 LEMON 对应 11、4、12、14、13,明文 ATTACKATDAWN 加密后得到 LXFOPVEFRNHR。解密时把位移反过来即可。本工具只位移 A~Z 与 a~z 并各自保持大小写;数字与标点原样输出,而且不消耗密钥位——这一点很关键,很多实现把空格也算作一位,导致双方密钥错位。

栅栏密码的算法

栅栏密码是把文本按「之字形」分行写出,再按行顺序拼接。以 3 栏为例,明文的第 1 个字符放在第 1 行、第 2 个放第 2 行、第 3 个放第 3 行,然后折返回来放第 2 行、第 1 行……最后把第 1 行到第 3 行依次连起来就是密文。它不改动任何字符,只改变顺序。解密需要先算出每行各有几个字符,再按同样的轨迹把字符放回去。

两种密码为什么都不安全

这两种密码都属于古典密码,破解门槛很低:栅栏密码的栏数通常不超过十几,逐个试就能穷举;维吉尼亚虽然轮流位移、能掩盖字母频率,但只要密文足够长,就能通过「重复片段间隔」推算出密钥长度,再用分组频率分析求出每一位的位移。它们的正确用途是教学、谜题与游戏,而不是保护真实数据——真实场景请使用 AES 等现代加密算法。

代码示例

JavaScript 维吉尼亚加解密

const vigenere = (text, key, enc = true) => {
  let ki = 0;
  return text.replace(/[a-z]/gi, (ch) => {
    const base = ch <= "Z" ? 65 : 97;
    const k = key[ki++ % key.length].toLowerCase().charCodeAt(0) - 97;
    const d = enc ? k : 26 - k;
    return String.fromCharCode((ch.charCodeAt(0) - base + d) % 26 + base);
  });
};

vigenere("ATTACKATDAWN", "LEMON");         // "LXFOPVEFRNHR"
vigenere("LXFOPVEFRNHR", "LEMON", false);  // "ATTACKATDAWN"

Python 非字母不消耗密钥位

def vigenere(text, key, dec=False):
    out, ki = [], 0
    for ch in text:
        if ch.isalpha():
            base = 65 if ch.isupper() else 97
            k = ord(key[ki % len(key)].lower()) - 97
            d = -k if dec else k
            out.append(chr((ord(ch) - base + d) % 26 + base))
            ki += 1
        else:
            out.append(ch)   # 标点原样保留,不消耗密钥位
    return "".join(out)

常见问题

维吉尼亚密码和凯撒密码是什么关系?

维吉尼亚是凯撒的推广。凯撒密码把每个字母都移动固定的位数(比如全部后移 3 位),所以只有 25 种可能,一眼就能试完;维吉尼亚让每一位的位移由密钥轮流决定,密钥长度为 n 时就有 26 的 n 次方种组合,强度高得多。凯撒相当于「密钥是单个字母的维吉尼亚」。

为什么空格和标点没有被加密?

这是刻意的口径,也是互操作的关键:本工具只位移字母,数字、空格、标点原样保留,且不消耗密钥位。如果把空格也算作一位参与位移,双方必须对「哪些字符算一位」完全一致,否则密钥就会错位、解出来全是乱码。保留标点还能让密文保持可读的分词结构,方便核对。

密钥越长越安全吗?

相对而言是的:密钥越长,重复周期越长,越难通过重复片段猜出密钥长度。理论上当密钥长度不短于明文、且完全随机、从不重复使用时,维吉尼亚就是不可破解的(一次性密码本)。但现实中手写长密钥极易出错也难以记忆,所以它始终停留在教学与谜题层面,不要用于真实数据。

没有密钥能破解维吉尼亚密码吗?

密文足够长时可以。标准做法分两步:先用「重复片段间隔的最大公因数」或卡西斯基检验猜出密钥长度,再把密文按位置分成若干组——每一组其实都是一个凯撒密码,用字母频率分析(英文里 e、t、a 出现最多)逐位求出位移,最终还原密钥。密文越短越难,两三句话的密文基本无法可靠破译。

栅栏密码的栏数选错了会怎样?

会解出一段看似正常、实际是乱码的文本,而且不会有任何报错——因为栅栏密码本身没有校验机制,任何栏数都能算出结果。所以解密时需要人工判断:常见栏数是 2~6,如果解出来不像话就换个栏数再试。这也是它不能用于真实加密的原因之一。

解密出来的结果是乱码,最可能是什么问题?

三个方向排查:一是密钥或栏数不对;二是加密时的口径不同(有的工具把空格也计入密钥位、有的只处理大写,双方规则不一致必然对不上);三是密文在复制过程中被改动过(大小写变化、多余空格、被编辑器自动换行截断)。维吉尼亚的密钥错了不会报错,只能靠观察结果是否是正常语言来判断。

维吉尼亚密码能用来保护真实数据吗?

不能。它的密钥长度通常远短于文本,且加密只作用于字母表,字母频率、词长分布等统计特征都保留着,现代工具几分钟就能破译。它属于「读起来像密码」的教学素材,而不是加密方案。真实场景请使用 AES、ChaCha20 这类经过验证的算法,并用足够长的随机密钥。

密钥可以是中文或者带空格吗?

可以输入,但非字母字符会被忽略。例如输入「l-e m o n」,实际起作用的是 LEMON。如果密钥里一个字母都没有(比如「12345」),工具会直接提示密钥无效——这是为了避免生成一段「看起来加密了、实际没有任何位移」的结果,那种假安全比报错更危险。

延伸阅读

来自本站原创文章,讲清这个工具背后的算法与口径。