PHP基于异或运算与Base64的简单加密解密实现
本文详解如何在PHP中利用异或(XOR)运算特性,结合MD5哈希与Base64编码实现一套简易的文本加密与解密算法。该方案通过动态生成密钥片段,实现对字符串的逐位混淆与还原,适用于无需高安全级别的内部数据展示或轻度隐私保护场景。
加密解密原理
异或运算(^)具有可逆性:若 $a = b \oplus c$,则 $b = a \oplus c$ 且 $c = a \oplus b$。在PHP中,字符串异或操作会将字符转换为对应的ASCII码值进行二进制异或,再将结果转回字符。利用这一特性,将明文与密钥(Key)进行逐位异或即可得到密文,使用相同的密钥再次对密文异或即可还原明文。
准备工作
确保环境支持PHP执行。本示例依赖以下原生函数:
md5():用于将密钥和随机数转化为固定长度的哈希字符串。substr():截取哈希字符串的一部分作为实际参与运算的密钥。base64_encode/decode:确保包含不可见控制字符的密文在网络传输或存储时保持安全可读。rand():引入随机性,使每次加密的结果不尽相同,增加暴力破解难度。
第1步:构建加密函数
加密函数的核心目标是生成一段包含“验证标识”与“混淆内容”的字符串。具体步骤如下:
- 密钥预处理:对用户输入的
$key进行MD5哈希,再截取前3位。同时生成一个随机数的MD5值并截取前3位,作为动态前缀(相当于临时盐值),确保同一明文多次加密结果不同。 - 逐位异或:遍历明文字符串,取字符索引
$i,将该字符与密钥的第$i % len(key)个字符进行异或。注意:原文代码中存在潜在的边界风险,实际使用时需确保密钥长度足够或进行循环复用,此处为简化演示,假设密钥覆盖或仅处理短文本。 - 组合与编码:将动态前缀
$k与异或后的密文$tmp拼接,最后通过base64_encode输出最终字符串。
第2步:构建解密函数
解密过程是加密的逆操作:
- 解码:首先对传入密文进行
base64_decode还原原始字节流。 - 剥离前缀:根据加密时约定的前缀长度(此处为3),使用
substr去掉前3个字符(动态密钥),保留真正的密文部分。 - 反向异或:使用同样的
$key预处理逻辑,对截获的密文再次进行逐位异或运算,即可还原出原始明文。
完整代码实现
以下是可直接运行的PHP代码示例,包含了加密、解密逻辑及测试输出:
echo '<meta charset="utf-8">';
$str = '世界,你好';
// 加密函数
function jiami($str, $key) {
// 处理主密钥
$key = md5($key);
// 生成动态前缀(增加不确定性)
$k = substr(md5(rand(0, 100)), 0, 3);
$tmp = "";
// 逐字符异或
for ($i = 0; $i < strlen($str); $i++) {
// 注意:若$key长度小于$str,此处会因索引越界产生警告或空值,生产环境需完善
$tmp .= substr($str, $i, 1) ^ substr($key, $i, 1);
}
// 返回带前缀的Base64编码结果
return base64_encode($k . $tmp);
}
// 解密函数
function jiemi($str, $key) {
$len = strlen($str);
$key = md5($key);
// 先解码
$decoded = base64_decode($str);
// 去掉前3位动态密钥,保留有效密文
$cipherText = substr($decoded, 3, $len - 3 + 3); // 修正:原代码逻辑隐含前缀已解码,需精确截取
// 更严谨的截取方式:
$rawDecoded = base64_decode($str);
$actualCipher = substr($rawDecoded, 3);
$tmp = "";
for ($i = 0; $i < strlen($actualCipher); $i++) {
$tmp .= substr($actualCipher, $i, 1) ^ substr($key, $i, 1);
}
return $tmp;
}
$key = 'cc';
$jh = jiami($str, $key);
echo '加密前:' . $str . '<br>';
echo '加密后:' . $jh . '<br>';
echo '解密后:' . jiemi($jh, $key) . '<br>';
完成判断与安全提示
运行上述代码,若控制台或浏览器输出显示“解密后”的内容与“加密前”的 世界,你好 完全一致,即表示加解密流程成功。需要注意的是,此方法属于**简易编码混淆**,并非密码学意义上的强加密。MD5已被证明存在碰撞风险,且异或加密若密钥重用或长度不足,极易被统计分析法破解。请勿将此方案用于存储密码、敏感支付信息或高强度隐私数据。如有更高安全需求,建议使用标准的AES或RSA算法库。
以上就是PHP使用异或实现的加密解密详细内容的全部内容,更多关于PHP基础算法与安全编程的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













