经典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 相关文章推荐
刚才在简化php的库,结果发现很多东西
Dec 31 PHP
PHP下几种删除目录的方法总结
Aug 19 PHP
Php无限级栏目分类读取的实现代码
Feb 19 PHP
php实现简单文件下载的方法
Jan 30 PHP
微信自定义菜单的创建/查询/取消php示例代码
Aug 05 PHP
thinkPHP中session()方法用法详解
Dec 08 PHP
php中遍历二维数组并以表格的形式输出的方法
Jan 03 PHP
php+mysql+jquery实现日历签到功能
Feb 27 PHP
Paypal实现循环扣款(订阅)功能
Mar 23 PHP
PHP APP微信提现接口代码
Sep 30 PHP
Laravel5.4简单实现app接口Api Token认证方法
Aug 29 PHP
PHP 实现 WebSocket 协议原理与应用详解
Apr 22 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数组交集的优化代码分析
2011/03/06 PHP
PHP 第二节 数据类型之数值型
2012/04/28 PHP
大家须知简单的php性能优化注意点
2016/01/04 PHP
Laravel 创建可以传递参数 Console服务的例子
2019/10/14 PHP
用jscript实现新建word文档
2007/06/15 Javascript
Javascript String.replace的妙用
2009/09/08 Javascript
Array的push与unshift方法性能比较分析
2011/03/05 Javascript
Underscore.js 的模板功能介绍与应用
2012/12/24 Javascript
JavaScript NodeTree导航栏(菜单项JSON类型/自制)
2013/02/01 Javascript
jquery的ajax和getJson跨域获取json数据的实现方法
2014/02/04 Javascript
基于javascript实现数字英文验证码
2017/01/25 Javascript
Angular.JS中的this指向详解
2017/05/17 Javascript
JS实现可针对算术表达式求值的计算器功能示例
2018/09/04 Javascript
Vue 根据条件判断van-tab的显示方式
2020/08/03 Javascript
Python中的is和id用法分析
2015/01/26 Python
深入理解python中的浅拷贝和深拷贝
2016/05/30 Python
Django实现的自定义访问日志模块示例
2017/06/23 Python
Python双向循环链表实现方法分析
2018/07/30 Python
Python爬取qq空间说说的实例代码
2018/08/17 Python
pyqt5使用按钮进行界面的跳转方法
2019/06/19 Python
Python pandas库中的isnull()详解
2019/12/26 Python
CSS3+HTML5+JS 实现一个块的收缩与展开动画效果
2020/11/17 HTML / CSS
La Senza官网:北美顶尖性感内衣品牌
2018/08/03 全球购物
英国的一家创新礼品和小工具零售商:Menkind
2019/08/24 全球购物
J2EE相关知识面试题
2013/08/26 面试题
大学生就业自荐信
2013/10/26 职场文书
餐饮加盟计划书
2014/01/10 职场文书
超市总经理岗位职责
2014/02/02 职场文书
在校大学生个人的自我评价
2014/02/13 职场文书
公司会计主管岗位责任制
2014/03/01 职场文书
承租经营合作者协议书
2014/10/01 职场文书
文员岗位职责范本
2015/04/16 职场文书
结婚当天新郎保证书
2015/05/08 职场文书
小兵张嘎观后感300字
2015/06/03 职场文书
MySQL如何构建数据表索引
2021/05/13 MySQL
python计算列表元素与乘积详情
2022/08/05 Python