PHP 通用加解密函数 encrypt 使用示例

码头散步
码头散步
发布时间:2026-10-14 | 3人浏览过
原创

在 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;
}
}
?>

关键逻辑解析

  1. 预处理字符替换:解密开始时,先将自定义的占位符(_a, _b, _c)还原为 Base64 的标准字符(/, +, =),以便正确调用 base64_decode。
  2. 密钥处理:无论输入何种长度的密钥,都会先进行 MD5 哈希,生成固定 32 位的密钥字符串,用于后续的伪随机数生成器初始化。
  3. 加密流程:
    - 计算明文的 8 字节 MD5 摘要。
    - 将摘要拼接在明文之前。
    - 使用改进的 RC4 算法对组合数据进行异或加密。
    - 对加密结果进行 Base64 编码,并再次替换特殊字符,确保输出安全。
  4. 解密流程:
    - 解码并还原字符后,提取前 8 字节作为预期哈希值。
    - 使用相同密钥对剩余密文解密得到明文。
    - 重新计算明文的哈希并与预期值比对。若一致则返回明文,否则返回空字符串,防止无效数据泄露或错误处理。

注意事项

虽然此函数在日常小型项目或内部数据传输中可用,但请注意其局限性:
- 依赖于 md5,在现代安全标准下强度有限。
- 每次加密同一内容产生的初始状态虽由密钥决定,但若密钥不变,基础加密逻辑可预测性较高。
- 对于高安全需求的场景(如用户密码、支付令牌),建议使用 openssl_encrypt 配合 AES-GCM 等标准算法。

以上就是带密钥的PHP加密解密函数 encrypt 的详细用法及原理介绍,更多关于PHP数据安全处理的资料请关注本站其它相关文章!

相关标签:

本站声明

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

Python 相关产品和应用

全部下载

专题列表