吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4126|回复: 13
收起左侧

[其他转载] PHP加密解密算法

[复制链接]
yqsphp 发表于 2019-3-18 11:46
PHP的加密解密函数。还不错
[PHP] 纯文本查看 复制代码
/**
  * 加密函数
  * [url=home.php?mod=space&uid=952169]@Param[/url] mixed $txt 需要加密的数据
  * @param string $key 密钥
  * [url=home.php?mod=space&uid=155549]@Return[/url] string 返回加密结果
  */
 function encrypt($txt, $key = ''){
 	if (empty($txt)) return $txt;
 	if (is_array($txt)) $txt = serialize($txt);
 	if (empty($key)) $key = md5('MD5_KEY');
 	$chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_.";
 	$ikey ="-x6g6ZWm2G9g_vr0Bo.pOq3kRIxsZ6rm";
 	$nh1 = rand(0,64);
 	$nh2 = rand(0,64);
 	$nh3 = rand(0,64);
 	$ch1 = $chars{$nh1};
 	$ch2 = $chars{$nh2};
 	$ch3 = $chars{$nh3};
 	$nhnum = $nh1 + $nh2 + $nh3;
 	$knum = 0;$i = 0;
 	while(isset($key{$i})) $knum +=ord($key{$i++});
 	$mdKey = substr(md5(md5(md5($key.$ch1).$ch2.$ikey).$ch3),$nhnum%8,$knum%8 + 16);
 	$txt = base64_encode(time().'_'.$txt);
 	$txt = str_replace(array('+','/','='),array('-','_','.'),$txt);
 	$tmp = '';
 	$j=0;$k = 0;
 	$tlen = strlen($txt);
 	$klen = strlen($mdKey);
 	for ($i=0; $i<$tlen; $i++) {
 		$k = $k == $klen ? 0 : $k;
 		$j = ($nhnum+strpos($chars,$txt{$i})+ord($mdKey{$k++}))%64;
 		$tmp .= $chars{$j};
 	}
 	$tmplen = strlen($tmp);
 	$tmp = substr_replace($tmp,$ch3,$nh2 % ++$tmplen,0);
 	$tmp = substr_replace($tmp,$ch2,$nh1 % ++$tmplen,0);
 	$tmp = substr_replace($tmp,$ch1,$knum % ++$tmplen,0);
 	return $tmp;
 }
 /**
  * 解密函数
  * @param string $txt 需要解密的字符串
  * @param string $key 密匙
  * @return string 字符串类型的返回结果
  */
 function decrypt($txt, $key = '', $ttl = 0){
 	if (empty($txt)) return $txt;
 	if (empty($key)) $key = md5('MD5_KEY');
 	$chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_.";
 	$ikey  = "-x6g6ZWm2G9g_vr0Bo.pOq3kRIxsZ6rm";
 	$knum  = 0;$i = 0;
 	$tlen  = @strlen($txt);
 	while(isset($key{$i})) $knum +=ord($key{$i++});
 	$ch1 = @$txt{$knum % $tlen};
 	$nh1 = strpos($chars,$ch1);
 	$txt = @substr_replace($txt,'',$knum % $tlen--,1);
 	$ch2 = @$txt{$nh1 % $tlen};
 	$nh2 = @strpos($chars,$ch2);
 	$txt = @substr_replace($txt,'',$nh1 % $tlen--,1);
 	$ch3 = @$txt{$nh2 % $tlen};
 	$nh3 = @strpos($chars,$ch3);
 	$txt = @substr_replace($txt,'',$nh2 % $tlen--,1);
 	$nhnum = $nh1 + $nh2 + $nh3;
 	$mdKey = substr(md5(md5(md5($key.$ch1).$ch2.$ikey).$ch3),$nhnum % 8,$knum % 8 + 16);
 	$tmp = '';
 	$j = 0; $k = 0;
 	$tlen = @strlen($txt);
 	$klen = @strlen($mdKey);
 	for ($i=0; $i<$tlen; $i++) {
 		$k = $k == $klen ? 0 : $k;
 		$j = strpos($chars,$txt{$i})-$nhnum - ord($mdKey{$k++});
 		while ($j<0) $j+=64;
 		$tmp .= $chars{$j};
 	}
 	$tmp = str_replace(array('-','_','.'),array('+','/','='),$tmp);
 	$tmp = trim(base64_decode($tmp));
 	if (preg_match("/\d{10}_/s",substr($tmp,0,11))){
 		if ($ttl > 0 && (time() - substr($tmp,0,11) > $ttl)){
 			$tmp = null;
 		}else{
 			$tmp = substr($tmp,11);
 		}
 	}
 	//解密出来后先反序列化看是否是一个数组信息
 	$res = unserialize($tmp);
 	if($res){
 		return $res;
 	}else{
 		return $tmp;
 	}
}

免费评分

参与人数 1吾爱币 +1 收起 理由
寅儿啊啊啊 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| yqsphp 发表于 2019-3-18 11:56
pt1314 发表于 2019-3-18 11:53
请问,这个 $txt 需要解密的字符串 有长度限制吗?比如这个网页的源码
PHP不懂。只会一些简单的调用。

你说的我还真没试过,我都是加密登录信息,一些缓存。你可以去试,我觉得行
 楼主| yqsphp 发表于 2019-3-18 11:59
pt1314 发表于 2019-3-18 11:53
请问,这个 $txt 需要解密的字符串 有长度限制吗?比如这个网页的源码
PHP不懂。只会一些简单的调用。

不过这样随着字符串长度增加开销会增大
小七星 发表于 2019-3-18 11:49
 楼主| yqsphp 发表于 2019-3-18 11:51

先不管这个,能用就行,我一直在用
pt1314 发表于 2019-3-18 11:53
请问,这个 $txt 需要解密的字符串 有长度限制吗?比如这个网页的源码
PHP不懂。只会一些简单的调用。
小七星 发表于 2019-3-18 11:56
yqsphp 发表于 2019-3-18 11:51
先不管这个,能用就行,我一直在用

你说的不错
 楼主| yqsphp 发表于 2019-3-18 12:02
对于网页,推荐使用压缩,而不是加密
ljily000 发表于 2019-3-18 12:27
对,对于长字符串还是压缩的好。
NOODOO 发表于 2019-3-18 13:07
zhichixia
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-16 05:56

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表