PHP字符串自定义加密解密函数详解与实现
针对PHP项目中需要自定义加密解密的场景,如传递非敏感但需防篡改的参数,本文章介绍了一个基于 XOR 异或运算与动态密钥的加解密类库实现。该方法包含加密入口、解密入口及辅助处理函数,适用于快速集成。
原理概述
该套函数主要利用 XOR(异或)运算的可逆特性:若 A ^ B = C,则 C ^ B = A。通过生成一个随机的临时密钥进行异或混淆,并使用 MD5 摘要固定最终加密密钥的长度,配合 base64_encode 将二进制数据转为可读字符串,从而实现简单的字符串隐藏与防篡改机制。
准备工作
确保 PHP 环境支持以下内置函数:
- srand, microtime: 随机数种子
- md5: 哈希算法
- strlen, substr (隐含在数组访问中): 字符串操作
- base64_encode, base64_decode: 编码转换
核心代码实现
第1步:加密函数 passport_encrypt
目的: 将明文转换为不可读的密文字符串。
参数: $str (待加密字符串), $key (用户提供的密钥)
操作逻辑:
- 初始化随机种子,并生成一个基于随机整数的 MD5 临时密钥
$encrypt_key。 - 遍历原文
$str的每个字符,将其与临时密钥对应位置的字符进行异或运算,构建混淆串$tmp。 - 调用辅助函数
passport_key再次对混淆串进行处理,最终经base64_encode输出。
/*
*功能:对字符串进行加密处理
*参数一:需要加密的内容
*参数二:密钥
*/
function passport_encrypt($str,$key){
srand((double)microtime() * 1000000);
$encrypt_key=md5(rand(0, 32000));
$ctr=0;
$tmp='';
for($i=0;$i<strlen($str);$i++){
$ctr=$ctr==strlen($encrypt_key)?0:$ctr;
$tmp.=$encrypt_key[$ctr].($str[$i] ^ $encrypt_key[$ctr++]);
}
return base64_encode(passport_key($tmp,$key));
}
第2步:解密函数 passport_decrypt
目的: 将密文还原为原始明文。
参数: $str (密文), $key (与原加密相同的密钥)
操作逻辑:
- 首先使用
base64_decode解码密文,并通过passport_key去除第二层密钥干扰。 - 遍历处理后的字符串,提取每两位中的第一位作为当前位的“掩码”,将其与下一位字符进行异或运算,还原原始字符。
/*
*功能:对字符串进行解密处理
*参数一:需要解密的密文
*参数二:密钥
*/
function passport_decrypt($str,$key){
$str=passport_key(base64_decode($str),$key);
$tmp='';
for($i=0;$i<strlen($str);$i++){
$md5=$str[$i];
$tmp.=$str[++$i] ^ $md5;
}
return $tmp;
}
第3步:辅助函数 passport_key
目的: 统一密钥处理逻辑,对输入字符串与用户密钥进行异或混合。
参数: $str (待处理字符串), $encrypt_key (用户密钥)
/*
*辅助函数:对字符串与密钥进行异或混合
*/
function passport_key($str,$encrypt_key){
$encrypt_key=md5($encrypt_key);
$ctr=0;
$tmp='';
for($i=0;$i<strlen($str);$i++){
$ctr=$ctr==strlen($encrypt_key)?0:$ctr;
$tmp.=$str[$i] ^ $encrypt_key[$ctr++];
}
return $tmp;
}
使用示例
以下是完整的测试用例,展示如何调用上述函数进行加密与解密验证:
$str='作者:余浩苗;电话:13611972365;电子邮件:123cvbz@163.com';
$key='hacker';
// 执行加密
$encrypt=passport_encrypt($str,$key);
// 执行解密
$decrypt=passport_decrypt($encrypt,$key);
echo '原文:',$str."<br><hr>";
echo '密文:',$encrypt."<br><hr>";
echo '译文:',$decrypt."<br><hr>";
注意事项
- 安全性限制: 此方法属于自定义简易加密,主要用于防止普通浏览者直接查看数据内容或简单的 URL 参数篡改,并非密码学意义上的强加密标准。敏感数据(如密码、金融信息)建议使用 openssl 扩展或成熟的加密库。
- 密钥一致性: 加密和解密必须使用完全相同的
$key参数,否则无法还原数据。 - 编码问题: 由于中间过程涉及异或运算产生的非文本字符,最终输出依赖
base64保证传输稳定性。
以上就是PHP自定义加密解密函数的详细内容,更多关于PHP数据安全处理的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









