使用方法
- 「明文」框服务端直出示例 HELLO,脚本未执行时也不是空白。框内 Enter 换行,触发计算用 Ctrl 加 Enter 或点按钮。
- 「密钥」默认 KEY。密钥逐字节循环使用:HELLO 有 5 个字节、KEY 有 3 个字节,于是第 4、5 个明文字节重新用回密钥的第 1、2 个字节 K 与 E。
- 「密钥格式」二选一。文本模式按 UTF-8 取字节;十六进制模式每字节写两位,能覆盖 0x00 到 0xFF,例如填 0a 1f;奇数位或非十六进制字符都会给出具体提示。
- 「输出格式」二选一。十六进制用空格分隔每个字节,便于逐字节核对;文本直接给字符。若选文本而结果里含不可打印字节(0x00 到 0x1F 或 0x7F 以上),页面会自动改回十六进制并给出提示,避免复制粘贴时丢字节。
- 点按钮或按 Ctrl 加 Enter 之后,结果区先给密文 hex,能打印时再补一行文本;把这段结果原样放回「明文」框、密钥保持不变再算一次,就还原成 HELLO,方向完全不用切。
- 下方单字节密钥表按当前明文首字节列出十二种密钥字节的密文,默认展开六行;「复制对照表」取 TSV,「导出 CSV」下载带 UTF-8 BOM 的文件。
这个XOR 密码工具能解决什么问题
异或是最靠近底层的加密动作:它不查替换表、不做换位,只把两个字节的八位逐位比一遍。它也被当作定位手段——固件、配置文件、小游戏存档里常能看到被单字节或短密钥糊过一遍的字符串,取回来与猜到的密钥异或,往往就现出原文。
三种场景最常见:做加解密的原理演示,用 HELLO 与 KEY 这种短例子看清每一位怎么变;做小脚本用的轻量混淆,把明文藏成不可打印字节;以及反查——手上有一段疑似被异或过的乱码,用本页正向算出对照密文,判断某个猜测密钥是否对得上。
与凯撒、维吉尼亚这类替换密码相比,异或落在「位」这一层,不依赖字母表,大小写、数字、标点乃至中文一视同仁。
计算原理与变量说明
本页只有一条主公式:对每个字节下标 i,把明文字节 p[i] 与密钥字节 k[i 对密钥长度取余] 做按位异或,得到密文字节 c[i]。
- 明文字节 p[i]:输入按 UTF-8 展开成字节序列。示例 HELLO 是 5 个 ASCII 字节 72、69、76、76、79;一个汉字通常占 3 字节,中文按字节而非按字符参与运算。
- 密钥字节 k[i mod k.length]:密钥循环使用。示例密钥 KEY 的字节是 75、69、89,第 4 个明文字节重新取 k[0]=75。
- 密文字节 c[i] = p[i] ^ k[i mod k.length]:示例逐字节为 72 异或 75 得 3、69 异或 69 得 0、76 异或 89 得 21(0x15)、76 异或 75 得 7、79 异或 69 得 10(0x0a)。
- 密文 hex 03 00 15 07 0a:五个字节全落在不可打印区间,因此默认用十六进制展示;把 0x0a 混进文本会被当成换行。
- 对合性 (P ^ K) ^ K = P:密文与同一密钥再异或一次即逐字节得回 48 45 4C 4C 4F,重新拼成 HELLO,还原校验为真。
为什么加解密是同一个函数:异或满足自反(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 轮。
- 第 1 字节:H(72) 异或 K(75) = 3,即 0x03。
- 第 2 字节:E(69) 异或 E(69) = 0,即 0x00;明文与密钥这一位完全相同,异或必然得 0。
- 第 3 字节:L(76) 异或 Y(89) = 21,即 0x15。
- 第 4 字节:L(76) 异或 K(75) = 7,即 0x07;密钥回到第 1 个字节。
- 第 5 字节:O(79) 异或 E(69) = 10,即 0x0a;密钥用第 2 个字节。
- 密文 hex = 03 00 15 07 0a;五个字节全在不可打印区间,文本输出会被强制改回十六进制。
- 还原校验:把 03 00 15 07 0a 与 KEY 循环异或一次,得到 48 45 4C 4C 4F,即 HELLO,与原文逐字节一致。
示例数值均为演示,不代表任何具体加密方案的参数。
XOR 真值表与密钥对照表
下面三张表分别是异或的位级定义、单字节密钥的作用效果与密钥长度对安全性的影响。真值表「两位不同为 1、相同为 0」,这条规则同时解释了自反与归零两条性质,也决定了 (P ^ K) ^ K = P 成立。
| a | b | a 异或 b | 说明 |
|---|---|---|---|
| 0 | 0 | 0 | 两位相同得 0(自反 a 异或 a = 0 的来源) |
| 0 | 1 | 1 | 两位不同得 1 |
| 1 | 0 | 1 | 交换两个操作数结果不变 |
| 1 | 1 | 0 | 两位相同得 0 |
下表固定明文为单字节 A(0x41 即十进制 65),只改变密钥字节。其中 key 0x00 得到与明文相同的 0x41、key 0x41 得到全 0,正是页面要拦截或提示的两种退化情况。
| 密钥 hex | 密钥十进制 | 密文 hex | 密文十进制 |
|---|---|---|---|
| 0x00 | 0 | 0x41 | 65 |
| 0x01 | 1 | 0x40 | 64 |
| 0x20 | 32 | 0x61 | 97 |
| 0x2A | 42 | 0x6B | 107 |
| 0x55 | 85 | 0x14 | 20 |
| 0x7F | 127 | 0x3E | 62 |
| 0x80 | 128 | 0xC1 | 193 |
| 0xAA | 170 | 0xEB | 235 |
| 0xC8 | 200 | 0x89 | 137 |
| 0xFF | 255 | 0xBE | 190 |
| 0x41 | 65 | 0x00 | 0 |
| 0x61 | 97 | 0x20 | 32 |
下表按密钥长度给出可枚举空间与典型结论。它回答「密钥该填多长」: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 |
结果边界、舍入与适用说明
- 密钥不能为空:空密钥等于不加密,页面直接给出「密钥不能为空,异或空密钥等于不加密」的提示。
- 密钥字节全为 0x00 时同样被拦截:全零密钥使密文与明文完全相同,等于没有保护,页面提示换一个非零密钥或改用十六进制输入。
- 明文含非 ASCII 字符(如中文)时按 UTF-8 字节异或,一个汉字通常占 3 字节,输出几乎全是不可打印字节,因此强制以十六进制展示。
- 结果不涉及舍入:异或是整数按位运算,每个字节都精确落在 0 到 255,十进制与十六进制两种写法互为同一数值,不存在末位误差。
- 输出为文本时只接受全部可打印的密文;只要出现一个不可打印字节,就整体改用十六进制,避免控制字符在文本框里被吞掉。
- 本页仅用于教学与轻量混淆,绝不用于保护真实机密数据;口令与密钥不应通过异或长期存储。
常见问题
加密和解密要分别操作吗?
不用,是同一个操作。异或满足 (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 异或都得回它自己,密文与明文逐字节相同,起不到任何保护作用。页面因此拦截并提示,建议改用非零密钥或十六进制密钥。
这个工具免费吗?
免费,无需注册即可使用。
输入的数据安全吗?
安全。计算在当前浏览器本地完成,不会上传输入内容。
相关工具
- 维吉尼亚密码工具:多表替换密码,密钥循环使用的思路与本页异或密钥相似。
- 凯撒密码工具:单表位移加密,加解密方向相反,可与本页的同向操作对照。
- ROT13 密码工具:等价于位移 13 的自反替换,来回一次同样还原。
- Atbash 密码工具:字母表镜像替换,同样属于自反的一类操作。
- 文本转二进制工具:把文字换成 0 与 1,便于观察异或在位层面的翻转。
- 编码解码:查看全部编码解码工具。