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

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

本文详解如何在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 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。