PHP自定义可逆加密解密算法实现
针对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开发安全的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









