PHP实现简单可逆加密解密算法:代码与逻辑解析
本文介绍并解析了一种基于PHP的可逆加密解密算法。核心逻辑涉及将用户提供的密钥进行MD5摘要,随后在字符层面执行位移操作,最后辅以Base64编码输出密文。该方法便于快速集成,适合对数据安全等级要求一般且必须保留明文信息的业务场景。
核心实现逻辑
该加密方案的核心在于“加盐”与“移位”。首先,通过 md5() 函数将原始密钥转换为32位的十六进制哈希值,作为后续操作的固定基准。接着,遍历待加密字符串的每一位,将其ASCII码与密钥对应位置的字符ASCII码相加(取模256),生成新的字符序列。最终,利用 base64_encode() 将二进制流转化为安全的URL传输文本。
PHP代码实现
第1步:编写加密函数
目的:生成经过混淆处理的密文字符串。
- 入口参数:$data(原始明文), $key(自定义密钥)
- 处理流程
function encrypt($data, $key) {
// 1. 获取密钥的MD5哈希值(32位)
$key = md5($key);
$x = 0;
$len = strlen($data);
$l = strlen($key);
// 2. 扩展密钥长度以匹配数据长度
// 循环将32位密钥重复拼接,形成临时密钥串
for ($i = 0; $i < $len; $i++) {
if ($x == $l) {
$x = 0;
}
$char .= $key{$x};
$x++;
}
// 3. 执行字符位移加密
for ($i = 0; $i < $len; $i++) {
// ASCII码相加后取模256,模拟字节进位
$str .= chr(ord($data{$i}) + (ord($char{$i})) % 256);
}
// 4. 返回Base64编码后的密文
return base64_encode($str);
}
第2步:编写解密函数
目的:根据密文和相同密钥还原原始明文。
- 入口参数:$data(待解密的Base64密文), $key(相同密钥)
- 处理流程
function decrypt($data, $key) {
// 1. 还原密钥及预处理
$key = md5($key);
$x = 0;
// 先解码为二进制流
$data = base64_decode($data);
$len = strlen($data);
$l = strlen($key);
// 2. 同样扩展密钥长度
for ($i = 0; $i < $len; $i++) {
if ($x == $l) {
$x = 0;
}
$char .= substr($key, $x, 1);
$x++;
}
// 3. 逆向位移运算
for ($i = 0; $i < $len; $i++) {
// 判断当前字节是否小于密钥对应字节
if (ord(substr($data, $i, 1)) < ord(substr($char, $i, 1))) {
// 若发生借位,说明之前加了256,此时需加上256再减
$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;
}
第3步:调用与验证
通过定义测试数据和密钥,分别调用上述两个函数,观察控制台输出结果是否一致。
$data = 'PHP加密解密算法'; // 原始信息
$key = '123'; // 密钥
// 执行加密
$encrypt = encrypt($data, $key);
echo "密文: {$encrypt}\n";
// 执行解密
$decrypt = decrypt($encrypt, $key);
echo "原文: {$decrypt}";
运行结果与特性分析
运行上述代码,系统将输出类似如下内容:
密文: gniCSOzZG+HnS9zcFea7SefNGhXF
原文: PHP加密解密算法
特性说明:
- 可逆性:只要密钥正确,即可完全还原原始文本。
- 局限性:该算法依赖简单的ASCII位移,容易被具备基础密码学知识的攻击者通过已知明文攻击破译。它仅适用于防止普通用户查看数据,或用于非敏感信息的临时混淆,不可用于金融支付或重要隐私保护。
- 依赖性:解密端必须持有与原加密端完全一致的密钥,否则无法还原出有意义的字符串。
以上就是PHP简单可逆加密解密算法的详细内容,更多关于PHP开发安全的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









