在 Web 开发中,我们经常需要对一些敏感数据(如 API 密钥、临时令牌或配置信息)进行简单的混淆或加密存储。虽然 AES 等标准加密算法安全性更高,但在某些对性能要求极高或只需防止明文泄露的场景下,基于 XOR(异或) 运算的加密方式因其速度极快且实现简单,依然有一席之地。
今天,我们将通过一段简洁的 PHP 代码,演示如何实现基于 XOR 逻辑的字符串加密与解密。
核心原理
XOR 加密的核心数学特性是:A ^ B ^ B = A。 这意味着,如果我们将明文 A 与密钥 B 进行异或运算得到密文 C,那么再将密文 C 与相同的密钥 B进行异9或运算,就能还原出明文 A。
代码实现
以下是完整的 PHP 实现代码,包含加密和解密两个核心函数。
<?php
// 定义密钥 (Key)
define('CRYPT_KEY', 'avjYyT65X7ym');
/**
* XOR 加密函数
*将明文字符串与密钥进行 XOR 运算并转换为十六进制字符串
*/
function encrypt_xor_string($plain_text, $key)
{
$encrypted_binary = '';
$key_length = strlen($key);
// 1. 逐字节进行 XOR 运算
for ($i = 0; $i < strlen($plain_text); $i++) {
$encrypted_binary .= chr(ord($plain_text[$i]) ^ ord($key[$i % $key_length]));
}
// 2. 将结果转换为十六进制字符串(以便存储在 PHP 代码中或传输)
return bin2hex($encrypted_binary);
}
/**
* 解密函数 (XOR Logic)
*/
function decrypt_xor_string($hex_encoded_string, $key)
{
// 1. 将十六进制字符串还原为二进制数据
$binary_data = hex2bin($hex_encoded_string);
$decrypted_result = '';
$key_length = strlen($key);
// 2. 逐字节进行 XOR 运算还原明文
for ($i = 0; $i < strlen($binary_data); $i++) {
$decrypted_result .= chr(ord($binary_data[$i]) ^ ord($key[$i % $key_length]));
}
return $decrypted_result;
}
// --- 测试示例 ---
//加密 "demo"
$encrypted = encrypt_xor_string("demo", CRYPT_KEY);
echo "加密结果: " . $encrypted . "\n";
// 解密
$decrypted = decrypt_xor_string($encrypted, CRYPT_KEY);
echo "解密结果: " . $decrypted . "\n";
代码解析
- 密钥循环使用: 由于密钥长度通常短于明文,我们使用
$i % $key_length来循环使用密钥中的字符。这确保了无论字符串多长,都能找到对应的密钥字节进行运算。 - 十六进制编码 (
bin2hex/hex2bin): XOR 运算后的结果可能是不可见的控制字符或非 UTF-8 兼容字节。为了便于存储、传输或在代码中硬编码,我们将二进制结果转换为十六进制字符串。解密时则反向操作。 - 位运算效率:
ord()获取字符 ASCII 值,^进行异或,chr()转回字符。这种底层位运算在 PHP 中执行效率非常高。
适用场景与注意事项
✅ 适用场景
- 配置混淆:防止配置文件中的密码以明文形式直接暴露。
- Cookie/Session 简单签名:对非敏感数据进行防篡改处理(需配合 HMAC 使用)。
- 内部通信:在受信任的内网服务间传递简单参数。
⚠️ 安全警告
- 非高强度加密:XOR 加密属于对称加密中最基础的形式。如果密钥被泄露,或者攻击者拥有部分明文-密文对,密钥极易被破解。
- 不要用于敏感数据:请勿使用此方法加密用户密码、信用卡号或个人身份信息(PII)。对于高安全需求,请使用
openssl_encrypt(AES-256-CBC 等)。 - 密钥管理:密钥
CRYPT_KEY应妥善保管,不要硬编码在版本控制系统中,建议通过环境变量注入。
总结
这段代码提供了一个快速、轻量的字符串加解密方案。它在保证基本混淆效果的同时,极大地降低了计算开销。在实际项目中,请根据数据的安全等级选择合适的加密策略。
0