Java中可用异或实现可逆轻量加密,因a^b^b==a;单字节密钥易被破解,宜用多字节循环异或;可选加移位增强非线性;但仅适用于低安全场景,不抗已知明文攻击且无完整性校验。

Java 中可以用位运算实现轻量级、可逆的简单加密,核心是利用异或(^)的自反性:a ^ b ^ b == a。这意味着用同一个密钥对数据异或两次,就能还原原始值——非常适合加解密。
用异或(XOR)实现字节级加密
这是最常用也最简洁的方式。每个字节与一个固定密钥(或轮密钥)进行异或,加密和解密使用完全相同的逻辑:
- 加密:
encryptedByte = originalByte ^ key - 解密:
originalByte = encryptedByte ^ key(因为(a ^ k) ^ k = a)
示例(对字符串逐字符异或):
public static String xorEncryptDecrypt(String input, int key) {
StringBuilder sb = new StringBuilder();
for (char c : input.toCharArray()) {
sb.append((char) (c ^ key));
}
return sb.toString();
}
// 使用示例
String plain = "Hello";
String encrypted = xorEncryptDecrypt(plain, 0x55);
String decrypted = xorEncryptDecrypt(encrypted, 0x55); // 得到 "Hello"
增强安全性:多字节密钥循环异或
单字节密钥容易被频率分析破解。改用密钥数组(如 byte[] key = {0x12, 0x34, 0x56}),按位置循环使用,提升混淆效果:
立即学习“Java免费学习笔记(深入)”;
- 第 0、3、6… 字节用
key[0] - 第 1、4、7… 字节用
key[1] - 依此类推,索引取模:
key[i % key.length]
这样即使明文有重复字符,密文也不易呈现规律。
结合移位增加非线性(可选增强)
纯异或属于线性变换。可加入循环左移( + 位或)或无符号右移(<code>>>>)打破线性,例如:
- 加密:先
c = c ^ key,再c = (c >> 5)(8 位内循环移位) - 解密:先逆移位(
(c >> 3)),再异或key
注意移位需在固定位宽(如 byte 转为 int 后掩码 & 0xFF)下操作,避免符号扩展干扰。
注意事项与局限性
这类位运算加密仅适用于教学、配置项混淆或临时保护等低安全场景:
- 不抗已知明文攻击——一旦知道一段明文和对应密文,立刻能算出密钥
- 无法防止篡改——没有完整性校验,密文被改后解密结果无效但不会报错
- 不能替代 AES 等标准算法——生产环境请用
javax.crypto包
如果只是隐藏日志中的敏感字段、混淆配置文件里的 token,位运算快速又够用;真要保障数据安全,务必走标准加密流程。


















