PHP 实现加强版加密解密类实例
本文介绍了一个基于 PHP 的加强版加密解密类,该类结合了 MD5 哈希、异或运算和 Base64 编码技术,有效提升了字符串加密的安全性并解决了特殊字符兼容性问题。
核心功能与特性
该加密解密类主要解决以下安全问题:
- 动态密钥生成:每次加密时随机生成密钥,增加破解难度。
- 异或加密:通过异或运算混淆明文,防止直接识别。
- Base64 编码与特殊字符处理:将密文转为 Base64 格式,并自定义替换 '=' 符号,确保数据在 URL 或数据库中的兼容性。
完整代码实现
以下是完整的 Ender 类代码,可直接复制到项目中作为基础工具使用:
<?php
class Ender{
private $enkey;//加密解密用的密钥
private $rep_char='#';//替换加密后的base64字符串中的=,因为=在有些场合是禁止使用的
//构造参数是密钥
public function __construct($key=''){
if(!$key){
$this->enkey=$key;
}
}
//设置密钥
public function set_key($key){
$this->enkey=$key;
}
private function keyED($txt,$encrypt_key)
{
$encrypt_key = md5($encrypt_key);
$ctr=0;
$tmp = "";
for ($i=0;$i<strlen($txt);$i++)
{
if ($ctr==strlen($encrypt_key)) $ctr=0;
$tmp.= substr($txt,$i,1) ^ substr($encrypt_key,$ctr,1);
$ctr++;
}
return $tmp;
}
//加密字符串
public function encrypt($txt,$key='')
{
if(!$key){
$key=$this->enkey;
}
srand((double)microtime()*1000000);
$encrypt_key = md5(rand(0,32000));
$ctr=0;
$tmp = "";
for ($i=0;$i<strlen($txt);$i++)
{
if ($ctr==strlen($encrypt_key)) $ctr=0;
$tmp.= substr($encrypt_key,$ctr,1) .
(substr($txt,$i,1) ^ substr($encrypt_key,$ctr,1));
$ctr++;
}
$r=base64_encode($this->keyED($tmp,$key));
$r=str_replace('=',$this->rep_char,$r);
return $r;
}
//解密字符串
public function decrypt($txt,$key='')
{
$txt=str_replace($this->rep_char,'=',$txt);
$txt=base64_decode($txt);
if(!$key){
$key=$this->enkey;
}
$txt = $this->keyED($txt,$key);
$tmp = "";
for ($i=0;$i<strlen($txt);$i++)
{
$md5 = substr($txt,$i,1);
$i++;
$tmp.= (substr($txt,$i,1) ^ $md5);
}
return $tmp;
}
}
使用方法与注意事项
第1步:初始化类
创建一个 Ender 实例,并传入一个固定的私钥($key)。这个密钥将用于后续的加解密过程,务必妥善保管。
第2步:执行加密
调用 encrypt() 方法,传入需要加密的明文字符串。可选地传入临时密钥,若未提供则使用构造函数中设定的默认密钥。
第3步:执行解密
调用 decrypt() 方法,传入加密后的密文字符串。同样支持使用默认密钥或指定临时密钥进行解密。
排错与风险提示
- 密钥一致性:加密和解密必须使用完全相同的密钥。如果密钥不匹配,解密结果将是乱码或失败。
- URL 安全性:由于代码中使用了
str_replace将 '=' 替换为 '#',这使得密文更适合在 URL 参数中传递。如果不需要此特性,可调整$rep_char的设置或删除替换逻辑。 - 数据安全:此算法属于应用层简易加密,适用于非敏感数据的混淆和保护。对于高度敏感的数据(如支付信息),建议使用更专业的加密库(如 OpenSSL)。
总结
以上就是PHP实现加强版加密解密类的详细内容,更多关于PHP加解密资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













