PHP 通用加解密函数 encrypt 使用示例
在 PHP 开发中,有时需要对特定字符串进行简单的加密以存储或传输,随后再根据业务需求进行解密。本例展示了一个经典的通用加解密函数 encrypt,它采用改进的流加密算法,支持指定密钥对数据进行加密(E)和解密(D)操作。
功能说明
该函数主要用于处理字符串的加密与解密,主要特点如下:
- 双模式操作:通过
$operation参数区分加密和解密。 - 密钥派生:内部使用
md5对输入的密钥进行处理,增强安全性并固定长度。 - URL 安全:加密后的结果会替换掉 Base64 中的特殊字符(如
/,+,=),使其更适合在 URL 中传递。 - 完整性校验:加密时会在明文前附加时间戳哈希,解密时验证该哈希以判断数据是否被篡改或密钥是否正确。
代码实现
以下是完整的 PHP 函数定义及使用示例代码:
复制代码 代码如下:
<?php
$id = "https://www.jb51.net";
$token = encrypt($id, 'E', 'jb51');
echo '加密:'.encrypt($id, 'E', 'jb51');
echo '<br />';
echo '解密:'.encrypt($token, 'D', 'jb51'); /*********************************************************************
函数名称:encrypt
函数作用:加密解密字符串
使用方法:
加密 :encrypt('str','E','qingdou');
解密 :encrypt('被加密过的字符串','D','qingdou');
参数说明:
$string :需要加密解密的字符串
$operation:判断是加密还是解密:E:加密 D:解密
$key :加密的钥匙(密匙);
*********************************************************************/
function encrypt($string,$operation,$key='')
{
$src = array("/","+","=");
$dist = array("_a","_b","_c");
if($operation=='D'){$string = str_replace($dist,$src,$string);}
$key=md5($key);
$key_length=strlen($key);
$string=$operation=='D'?base64_decode($string):substr(md5($string.$key),0,8).$string;
$string_length=strlen($string);
$rndkey=$box=array();
$result='';
for($i=0;$i<=255;$i++)
{
$rndkey[$i]=ord($key[$i%$key_length]);
$box[$i]=$i;
}
for($j=$i=0;$i<256;$i++)
{
$j=($j+$box[$i]+$rndkey[$i])%256;
$tmp=$box[$i];
$box[$i]=$box[$j];
$box[$j]=$tmp;
}
for($a=$j=$i=0;$i<$string_length;$i++)
{
$a=($a+1)%256;
$j=($j+$box[$a])%256;
$tmp=$box[$a];
$box[$a]=$box[$j];
$box[$j]=$tmp;
$result.=chr(ord($string[$i])^($box[($box[$a]+$box[$j])%256]));
}
if($operation=='D')
{
if(substr($result,0,8)==substr(md5(substr($result,8).$key),0,8))
{
return substr($result,8);
}
else
{
return'';
}
}
else
{
$rdate = str_replace('=','',base64_encode($result));
$rdate = str_replace($src,$dist,$rdate);
return $rdate;
}
}
?>
关键逻辑解析
- 预处理字符替换:解密开始时,先将自定义的占位符(
_a,_b,_c)还原为 Base64 的标准字符(/,+,=),以便正确调用base64_decode。 - 密钥处理:无论输入何种长度的密钥,都会先进行 MD5 哈希,生成固定 32 位的密钥字符串,用于后续的伪随机数生成器初始化。
- 加密流程:
- 计算明文的 8 字节 MD5 摘要。
- 将摘要拼接在明文之前。
- 使用改进的 RC4 算法对组合数据进行异或加密。
- 对加密结果进行 Base64 编码,并再次替换特殊字符,确保输出安全。 - 解密流程:
- 解码并还原字符后,提取前 8 字节作为预期哈希值。
- 使用相同密钥对剩余密文解密得到明文。
- 重新计算明文的哈希并与预期值比对。若一致则返回明文,否则返回空字符串,防止无效数据泄露或错误处理。
注意事项
虽然此函数在日常小型项目或内部数据传输中可用,但请注意其局限性:
- 依赖于 md5,在现代安全标准下强度有限。
- 每次加密同一内容产生的初始状态虽由密钥决定,但若密钥不变,基础加密逻辑可预测性较高。
- 对于高安全需求的场景(如用户密码、支付令牌),建议使用 openssl_encrypt 配合 AES-GCM 等标准算法。
以上就是带密钥的PHP加密解密函数 encrypt 的详细用法及原理介绍,更多关于PHP数据安全处理的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









