XOR 密码工具

输入明文与密钥,逐字节做异或运算得到密文,先输出十六进制再给出可打印文本;因为异或是自反运算,把结果与同一密钥再异或一次即可还原,加密与解密共用同一个按钮。数据在浏览器本地计算,不上传。

—

计算公式:c[i] = p[i] ^ k[i mod k.length];密钥循环使用;(P ^ K) ^ K = P 所以加密与解密是同一个操作;明文字节 p、密钥字节 k、密文字节 c 均按 0~255 的无符号字节处理。

本页的核心结论:XOR 的加密与解密是同一个函数,方向不需要切换——示例明文 HELLO 与密钥 KEY 异或得到密文 03 00 15 07 0a,把这五个字节再与 KEY 循环异或一次就回到 HELLO;同时注意 E 与密钥的第二个字节同为 69,异或得 0x00,说明「密文里出现 0x00」不代表出错,恰是异或的固有结果。

使用方法

  1. 「明文」框服务端直出示例 HELLO,脚本未执行时也不是空白。框内 Enter 换行,触发计算用 Ctrl 加 Enter 或点按钮。
  2. 「密钥」默认 KEY。密钥逐字节循环使用:HELLO 有 5 个字节、KEY 有 3 个字节,于是第 4、5 个明文字节重新用回密钥的第 1、2 个字节 K 与 E。
  3. 「密钥格式」二选一。文本模式按 UTF-8 取字节;十六进制模式每字节写两位,能覆盖 0x00 到 0xFF,例如填 0a 1f;奇数位或非十六进制字符都会给出具体提示。
  4. 「输出格式」二选一。十六进制用空格分隔每个字节,便于逐字节核对;文本直接给字符。若选文本而结果里含不可打印字节(0x00 到 0x1F 或 0x7F 以上),页面会自动改回十六进制并给出提示,避免复制粘贴时丢字节。
  5. 点按钮或按 Ctrl 加 Enter 之后,结果区先给密文 hex,能打印时再补一行文本;把这段结果原样放回「明文」框、密钥保持不变再算一次,就还原成 HELLO,方向完全不用切。
  6. 下方单字节密钥表按当前明文首字节列出十二种密钥字节的密文,默认展开六行;「复制对照表」取 TSV,「导出 CSV」下载带 UTF-8 BOM 的文件。

这个XOR 密码工具能解决什么问题

异或是最靠近底层的加密动作:它不查替换表、不做换位,只把两个字节的八位逐位比一遍。它也被当作定位手段——固件、配置文件、小游戏存档里常能看到被单字节或短密钥糊过一遍的字符串,取回来与猜到的密钥异或,往往就现出原文。

三种场景最常见:做加解密的原理演示,用 HELLO 与 KEY 这种短例子看清每一位怎么变;做小脚本用的轻量混淆,把明文藏成不可打印字节;以及反查——手上有一段疑似被异或过的乱码,用本页正向算出对照密文,判断某个猜测密钥是否对得上。

与凯撒、维吉尼亚这类替换密码相比,异或落在「位」这一层,不依赖字母表,大小写、数字、标点乃至中文一视同仁。

计算原理与变量说明

本页只有一条主公式:对每个字节下标 i,把明文字节 p[i] 与密钥字节 k[i 对密钥长度取余] 做按位异或,得到密文字节 c[i]。

为什么加解密是同一个函数:异或满足自反(a 异或 a = 0)、归零(a 异或 0 = a)与交换律、结合律,于是 (P ^ K) ^ K 先把两个 K 结合成 0,再与 P 异或即得回 P。凯撒与维吉尼亚加密是位移加、解密要做方向相反的减,所以必须给「加密 / 解密」开关;本页把它做成同一段说明,让用户不再问「解密该点哪个」。

为什么密钥循环会削弱强度:密钥短于明文时会重复出现,密文里留下「同一密钥字节周期性作用于同一段明文」的痕迹,这与维吉尼亚的重复密钥是同一个弱点,可被 Kasiski 检验与重合指数分析先估出密钥长度、再逐位还原。示例密钥只有 3 字节,属于典型的短密钥演示。

为什么推荐用十六进制填密钥:ASCII 可见字符的码点落在 0x20 到 0x7E,最高位恒为 0,密钥字节第 8 个 bit 永远是 0,明文字节的高位在异或后原样保留、等于直接泄露。改用十六进制就能写出 0x80、0xC8 这类高位为 1 的字节,覆盖 0x00 到 0xFF,泄露高位的问题随之消失。

为什么它不能当现代密码用:XOR 只是一次按位翻转,没有扩散与混淆、没有密钥调度,对已知明文攻击毫无抵抗力——拿到一段明文与对应密文两两异或,就能直接吐出密钥流。它只适合教学演示与轻量混淆,绝不用于真实机密数据。

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

示例条件:明文 HELLO、密钥 KEY(文本格式)、输出格式十六进制。密钥长度 3,明文长度 5,密钥循环 2 轮。

示例数值均为演示,不代表任何具体加密方案的参数。

XOR 真值表与密钥对照表

下面三张表分别是异或的位级定义、单字节密钥的作用效果与密钥长度对安全性的影响。真值表「两位不同为 1、相同为 0」,这条规则同时解释了自反与归零两条性质,也决定了 (P ^ K) ^ K = P 成立。

aba 异或 b说明
000两位相同得 0(自反 a 异或 a = 0 的来源)
011两位不同得 1
101交换两个操作数结果不变
110两位相同得 0

下表固定明文为单字节 A(0x41 即十进制 65),只改变密钥字节。其中 key 0x00 得到与明文相同的 0x41、key 0x41 得到全 0,正是页面要拦截或提示的两种退化情况。

密钥 hex密钥十进制密文 hex密文十进制
0x0000x4165
0x0110x4064
0x20320x6197
0x2A420x6B107
0x55850x1420
0x7F1270x3E62
0x801280xC1193
0xAA1700xEB235
0xC82000x89137
0xFF2550xBE190
0x41650x000
0x61970x2032

下表按密钥长度给出可枚举空间与典型结论。它回答「密钥该填多长」:1 字节只有 256 种,瞬间可穷举;8 字节约 1.8×10¹⁹ 不能暴力枚举,但重复使用仍可被已知明文攻击还原密钥流。

密钥长度可枚举空间暴力破解难度适用判断
1 字节256 种可暴力枚举只够教学演示
2 字节65,536 种瞬间破解仍不安全
4 字节约 43 亿PC 几分钟弱
8 字节约 1.8×10¹⁹不可暴力但重复使用仍可被已知明文攻击
16 字节2¹²⁸不可暴力只有一次性本才理论安全
与明文等长且只用一次一次性本香农证明无条件安全密钥分发是难点
重复密钥(维吉尼亚式)可被 Kasiski 与重合指数破解密钥越短越脆本页默认就是这种
全零密钥等于没加密密文等于明文页面拦截并提示
密钥等于明文密文全为 0泄露长度信息页面提示
ASCII 可见字符密钥0x20 到 0x7E高位永远不变会泄露明文高位
非 ASCII 密钥(中文)按 UTF-8 字节异或一个汉字 3 字节按字节而非按字符处理
十六进制输入密钥如 0a 1f可用任意字节推荐,能覆盖 0x00 到 0xFF

结果边界、舍入与适用说明

常见问题

加密和解密要分别操作吗?

不用,是同一个操作。异或满足 (P ^ K) ^ K = P,把密文与同一密钥再异或一次就还原。示例 HELLO 与 KEY 得到 03 00 15 07 0a,把它再与 KEY 循环异或一次就回到 HELLO,所以页面只给一个按钮,也不设方向开关。

我选了文本输出,为什么结果变成了十六进制?

因为密文里出现了不可打印字节。示例五个字节全部落在 0x00 到 0x1F 区间,若强行按文本显示,0x0a 会被当成换行、0x00 会消失,复制粘贴就丢字节。页面因此整体改用十六进制。

密文里出现了 0x00,是不是算错了?

不是。当明文字节与密钥字节完全相同,异或结果必然是 0x00。示例第 2 个字节 E(69) 与密钥的第二个字节 E(69) 相同,所以密文里天然带一个 0x00,这是异或的正常结果,不是空值或错误标记。

密钥填多长才算安全?

长度只是必要条件之一。1 字节只有 256 种、2 字节 65,536 种,都能被瞬间穷举;8 字节约 1.8×10¹⁹ 已不可暴力,但只要重复使用,仍可被已知明文攻击还原密钥流。真正无条件安全的只有一次性本:密钥与明文等长且只用一次,代价是密钥分发极难。

中文可以用这个工具处理吗?

可以,按 UTF-8 字节异或。一个汉字通常占 3 字节,异或后几乎全落进不可打印区间,结果会强制以十六进制给出。把这段 hex 与同一密钥再异或一次即可还原原文。

为什么全零密钥会被拦下?

因为异或全零密钥等于不加密:任何字节与 0x00 异或都得回它自己,密文与明文逐字节相同,起不到任何保护作用。页面因此拦截并提示,建议改用非零密钥或十六进制密钥。

这个工具免费吗?

免费,无需注册即可使用。

输入的数据安全吗?

安全。计算在当前浏览器本地完成,不会上传输入内容。

相关工具