PHP自定义可逆加密解密算法实现

阿澈
阿澈
发布时间:2026-10-14 | 5人浏览过
原创

针对MD5和SHA1仅适用于不可逆数据加密的限制,本文介绍了一种PHP自定义的可逆加密解密算法。通过结合md5摘要处理密钥、字符偏移运算以及base64_encode序列化,实现了数据的灵活加解密。这对于需要存储并可恢复的敏感信息(如接口凭证、内部配置项)提供了实用的解决方案。

应用场景与准备条件

在Web开发中,部分数据(如数据库连接密码、第三方API Key)需要保存在服务端配置文件中,且管理员可能需要查看原始内容。此时单向哈希(md5、sha1)因无法还原而失效,必须使用对称或自定义可逆加密方案。

环境要求:

  • PHP 5.x/7.x/8.x 均可运行。
  • 服务器基础函数库支持 strlen、ord、chr、substr 及 base64 相关函数。
  • 注意:该算法属于轻量级混淆加密,不适用于高安全风险场景(如银行交易、核心隐私数据),建议配合SSL传输及访问控制使用。

核心算法实现

算法逻辑主要分为两步:加密时将明文与经过MD5处理的密钥进行字符ASCII码加减偏移;解密时逆向操作并剥离Base64外壳。

第1步:定义加密函数 encrypt()

目的:将原始明文 $data 转换为乱码字符串。

参数:

  • $data: 待加密的字符串。
  • $key: 用户自定义的加密密钥(盐值)。

代码实现:

function encrypt($data, $key) {
    $key = md5($key); // 对密钥进行哈希,固定长度并增加随机性
    $x = 0;
    $len = strlen($data);
    $l = strlen($key);
    
    // 第一步:根据密钥生成对应长度的混淆字符序列 $char
    for ($i = 0; $i < $len; $i++) {
        if ($x == $l) { $x = 0; }
        $char .= $key{$x};
        $x++;
    }
    
    // 第二步:计算每个字符的偏移量并进行累加
    for ($i = 0; $i < $len; $i++) {
        $str .= chr(ord($data{$i}) + (ord($char{$i})) % 256);
    }
    
    return base64_encode($str); // 转为Base64格式以便安全存储
}

第2步:定义解密函数 decrypt()

目的:将加密后的Base64串还原为原始明文。

参数:

  • $data: encrypt 函数输出的字符串。
  • $key: 与加密时相同的密钥。

代码实现:

function decrypt($data, $key) {
    $key = md5($key);
    $x = 0;
    $data = base64_decode($data); // 先解压Base64
    $len = strlen($data);
    $l = strlen($key);
    
    // 重构与加密阶段完全一致的 $char 混淆序列
    for ($i = 0; $i < $len; $i++) {
        if ($x == $l) { $x = 0; }
        $char .= substr($key, $x, 1);
        $x++;
    }
    
    // 逆向减法还原原始字符
    for ($i = 0; $i < $len; $i++) {
        if (ord(substr($data, $i, 1)) < ord(substr($char, $i, 1))) {
            // 发生借位时,加上256再减去密钥字符ASCII
            $str .= chr((ord(substr($data, $i, 1)) + 256) - ord(substr($char, $i, 1)));
        } else {
            $str .= chr(ord(substr($data, $i, 1)) - ord(substr($char, $i, 1)));
        }
    }
    
    return $str;
}

测试用例与结果验证

在实际使用中,只需传入任意字符串和密钥即可调用。以下是标准测试流程:

$data = 'PHP加密解密算法'; // 原始信息
$key = '123';               // 密钥
$encrypt = encrypt($data, $key);
$decrypt = decrypt($encrypt, $key);

echo $encrypt . "\n";
echo $decrypt;

预期输出示例:

第一行为加密后的乱码串(如 gniCSOzZG+HnS9zcFea7SefNGhXF),第二行为原文 PHP加密解密算法。若修改 $key,则解密出的内容将为乱码或报错,从而保证数据安全。

注意事项与排错

  • 特殊字符处理:由于涉及字符ASCII码运算,建议仅加密文本型数据。包含二进制流或非UTF-8字符时可能导致解码异常。
  • 空指针风险:如果 $data 为空,循环次数为0,函数将返回空字符串或Base64编码的空串,需确保业务端非空校验。
  • 兼容性:$key{$x} 是PHP早期版本的数组式字符串访问语法,在现代PHP中推荐使用 substr($key, $x, 1) 以获得更好的性能与兼容稳定性。

总结

本组PHP代码提供了一种简单有效的自研可逆加密机制。虽然安全性不及AES/RSA标准库,但凭借其极低的代码依赖性和轻量级特征,非常适合在CMS系统、插件配置或内部工具中进行简单的信息防暴露处理。以上就是PHP可逆加密解密算法实现内容的详细解析,更多关于PHP开发安全的资料请关注本站其它相关文章!

相关标签:

本站声明

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

Python 相关产品和应用

全部下载

专题列表