PHP基于异或运算与Base64的简单加密解密实现

花开有时
花开有时
发布时间:2026-10-14 | 4人浏览过
原创

本文详解如何在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步:构建加密函数

加密函数的核心目标是生成一段包含“验证标识”与“混淆内容”的字符串。具体步骤如下:

  1. 密钥预处理:对用户输入的 $key 进行MD5哈希,再截取前3位。同时生成一个随机数的MD5值并截取前3位,作为动态前缀(相当于临时盐值),确保同一明文多次加密结果不同。
  2. 逐位异或:遍历明文字符串,取字符索引 $i,将该字符与密钥的第 $i % len(key) 个字符进行异或。注意:原文代码中存在潜在的边界风险,实际使用时需确保密钥长度足够或进行循环复用,此处为简化演示,假设密钥覆盖或仅处理短文本。
  3. 组合与编码:将动态前缀 $k 与异或后的密文 $tmp 拼接,最后通过 base64_encode 输出最终字符串。

第2步:构建解密函数

解密过程是加密的逆操作:

  1. 解码:首先对传入密文进行 base64_decode 还原原始字节流。
  2. 剥离前缀:根据加密时约定的前缀长度(此处为3),使用 substr 去掉前3个字符(动态密钥),保留真正的密文部分。
  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基础算法与安全编程的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表