位运算符不能直接实现安全加密,但异或(^)可用于简单混淆或教学演示;因a^b^b==a,单字节密钥可完成可逆加解密,多字节密钥循环异或则增强混淆性。

位运算符本身不能直接实现安全加密,但可以用于简单混淆或教学演示(如异或加密)。真正加密应使用标准算法(如AES),但用 ^(异或)做对称加解密是经典入门示例——因为 a ^ b ^ b == a,即同一密钥异或两次可还原原文。
基础原理:异或的自反性
异或(^)满足:
- 明文 ^ 密钥 = 密文
- 密文 ^ 密钥 = 明文
只要密钥长度与数据匹配(或循环使用),就能完成可逆变换。
单字节密钥的字符串加解密
适合短文本、调试演示。密钥为一个 char(如 'K'),逐字符异或:
public class XorCipher {
public static String encrypt(String plain, char key) {
StringBuilder cipher = new StringBuilder();
for (char c : plain.toCharArray()) {
cipher.append((char) (c ^ key));
}
return cipher.toString();
}
<pre class='brush:java;toolbar:false;'>public static String decrypt(String cipher, char key) {
// 异或解密和加密完全相同
return encrypt(cipher, key);
}
public static void main(String[] args) {
String text = "Hello123";
char key = 'K';
String encrypted = encrypt(text, key);
String decrypted = decrypt(encrypted, key);
System.out.println("原文: " + text);
System.out.println("密文: " + encrypted); // 不可读乱码(可能含控制字符)
System.out.println("解密: " + decrypted);
}}
多字节密钥(密钥流)增强混淆性
用字符串密钥循环异或,比单字节更难肉眼识别规律:
立即学习“Java免费学习笔记(深入)”;
- 密钥转为 byte 数组,按索引循环使用
- 对每个字节做
plain[i] ^ key[i % key.length] - 返回 byte[] 更稳妥(避免 char 异或后超出 UTF-16 范围导致乱码)
public static byte[] encryptBytes(byte[] plain, byte[] key) {
byte[] cipher = new byte[plain.length];
for (int i = 0; i < plain.length; i++) {
cipher[i] = (byte) (plain[i] ^ key[i % key.length]);
}
return cipher;
}
<p>public static byte[] decryptBytes(byte[] cipher, byte[] key) {
return encryptBytes(cipher, key); // 同样复用
}</p><p>// 使用示例:
String msg = "Secret!";
byte[] key = "KEY123".getBytes();
byte[] enc = encryptBytes(msg.getBytes(), key);
String dec = new String(decryptBytes(enc, key));</p>重要提醒:这不是生产级加密
这种异或方案存在明显缺陷:
- 密钥一旦泄露,全部内容瞬间可破
- 相同明文+相同密钥 → 永远生成相同密文(无随机性,易被频率分析)
- 不防篡改,不提供完整性校验
- Java 中若处理 Unicode 字符串,需注意编码(建议统一用 UTF-8 byte[] 操作)
真实项目请用 javax.crypto.Cipher 配合 AES/GCM 等标准算法,并妥善管理密钥和 IV。


















