经典PHP加密解密函数Authcode()修复版代码


Posted in PHP onApril 05, 2015

Authcode这个函数很多人都使用,这函数来自Discuz程序,用于加密解密字符串,可以设置钥匙(key)和过期时间,在很多时候都用得着。原版的函数代码可能会生成+、/、&这样的字符,导致通过URL传值取回时被转义,导致无法解密。火端网络稍加修改,把这几个字符替换成其它字符,解密时再替换回去,这样就完美了!

代码如下:

function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0){
 
 if($operation == 'DECODE') {
 $string = str_replace('[a]','+',$string);
 $string = str_replace('[b]','&',$string);
 $string = str_replace('[c]','/',$string);
 }
 $ckey_length = 4;
 $key = md5($key ? $key : 'livcmsencryption ');
 $keya = md5(substr($key, 0, 16));
 $keyb = md5(substr($key, 16, 16));
 $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : '';
 $cryptkey = $keya.md5($keya.$keyc);
 $key_length = strlen($cryptkey);
 $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string;
 $string_length = strlen($string);
 $result = '';
 $box = range(0, 255);
 $rndkey = array();
 for($i = 0; $i <= 255; $i++) {
  $rndkey[$i] = ord($cryptkey[$i % $key_length]);
 }
 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 == 'DECODE') {
  if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) {
 
   return substr($result, 26);
  } else {
   return '';
  }
 } else {
 $ustr = $keyc.str_replace('=', '', base64_encode($result));
 $ustr = str_replace('+','[a]',$ustr);
 $ustr = str_replace('&','[b]',$ustr);
 $ustr = str_replace('/','[c]',$ustr);
  return $ustr;
 }
}
PHP 相关文章推荐
一个没有MYSQL数据库支持的简易留言本的编写
Oct 09 PHP
用PHP实现图象锐化代码
Jun 14 PHP
PHP 网页过期时间的控制代码
Jun 29 PHP
PHP 一个比较完善的简单文件上传
Mar 25 PHP
php中is_null,empty,isset,unset 的区别详细介绍
Apr 28 PHP
深入分析使用mysql_fetch_object()以对象的形式返回查询结果
Jun 05 PHP
解析Win7 XAMPP apache无法启动的问题
Jun 26 PHP
PHP使用GIFEncoder类生成的GIF动态图片验证码
Jul 01 PHP
wamp安装后自定义配置的方法
Aug 23 PHP
百度实时推送api接口应用示例
Oct 21 PHP
详解json在php中的应用
Sep 30 PHP
Laravel框架下载,安装及路由操作图文详解
Dec 04 PHP
php简单实现快速排序的方法
Apr 04 #PHP
php获取网页上所有链接的方法
Apr 03 #PHP
php将HTML表格每行每列转为数组实现采集表格数据的方法
Apr 03 #PHP
PHP常用处理静态操作类
Apr 03 #PHP
php使用post数组的键值创建同名变量并赋值的方法
Apr 03 #PHP
php删除指定目录的方法
Apr 03 #PHP
php实现递归抓取网页类实例
Apr 03 #PHP
You might like
PHP中数字检测is_numeric与ctype_digit的区别介绍
2012/10/04 PHP
PHP中单引号与双引号的区别分析
2014/08/19 PHP
php获取远程图片并下载保存到本地的方法分析
2016/10/08 PHP
PHP插件PHPMailer发送邮件功能
2017/02/28 PHP
使用YII2框架实现微信公众号中表单提交功能
2017/09/04 PHP
PHP后期静态绑定实例浅析
2018/12/21 PHP
删除重复数据的算法
2006/11/23 Javascript
JS创建自定义表格具体实现
2014/02/11 Javascript
jquery队列queue与原生模仿其实现方法分享
2014/03/25 Javascript
流量统计器如何鉴别C#:WebBrowser中伪造referer
2015/01/07 Javascript
js实现的四级左侧网站分类菜单实例
2015/05/06 Javascript
JS数组排序方法实例分析
2016/12/16 Javascript
javascript实现秒表计时器的制作方法
2017/02/16 Javascript
微信小程序实现拖拽 image 触摸事件监听的实例
2017/08/17 Javascript
微信小程序实现弹出菜单功能
2018/06/12 Javascript
Vue2.0实现简单分页及跳转效果
2019/07/29 Javascript
微信小程序实现侧边分类栏
2019/10/21 Javascript
基于JavaScript实现单例模式
2019/10/30 Javascript
JS实现简易计算器
2020/02/14 Javascript
Python装饰器的函数式编程详解
2015/02/27 Python
详细解读Python中的__init__()方法
2015/05/02 Python
python中zip和unzip数据的方法
2015/05/27 Python
python+os根据文件名自动生成文本
2019/03/21 Python
Python Web框架之Django框架Model基础详解
2019/08/16 Python
Python爬虫爬取电影票房数据及图表展示操作示例
2020/03/27 Python
绝对令人的惊叹的CSS3折叠效果(3D效果)整理
2012/12/30 HTML / CSS
欧姆龙医疗欧洲有限公司:Omron Healthcare Europe B.V
2020/06/13 全球购物
Java程序员面试题
2013/07/15 面试题
课程改革实施方案
2014/03/16 职场文书
任命书怎么写
2014/06/04 职场文书
2015公务员试用期工作总结
2014/12/12 职场文书
个人维稳承诺书
2015/05/04 职场文书
拿破仑传读书笔记
2015/07/01 职场文书
2015重阳节敬老活动总结
2015/07/29 职场文书
2016党员干部廉洁自律心得体会
2016/01/13 职场文书
Win11怎么跳过联网验机 ?Win11跳过联网验机激活教程
2022/04/05 数码科技