经典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中的登陆login
Jan 18 PHP
Discuz板块横排显示图片的实现方法
May 28 PHP
PHP 字符串 小常识
Jun 05 PHP
PHP学习之字符串比较和查找
Apr 17 PHP
PHP URL参数获取方式的四种例子
Feb 28 PHP
详解WordPress中给链接添加查询字符串的方法
Dec 18 PHP
PHP+sqlite数据库操作示例(创建/打开/插入/检索)
May 26 PHP
php实现文章置顶功能的方法
Oct 20 PHP
php基于SQLite实现的分页功能示例
Jun 21 PHP
php中文乱码问题的终极解决方案汇总
Aug 01 PHP
ThinkPHP5.1表单令牌Token失效问题的解决
Mar 22 PHP
PHP 实现 JSON 数据的编码和解码操作详解
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实现获取域名的方法小结
2014/11/05 PHP
图片上传即时显示缩略图的js代码
2009/05/27 Javascript
使用JQuery进行跨域请求
2010/01/25 Javascript
jquery 实现checkbox全选,反选,全不选等功能代码(奇数)
2012/10/24 Javascript
jquery简单瀑布流实现原理及ie8下测试代码
2013/01/23 Javascript
javascript匿名函数实例分析
2014/11/18 Javascript
JS实现光滑展开合拢的菜单效果代码
2015/09/16 Javascript
Angular.js 实现数字转换汉字实例代码
2016/07/14 Javascript
Node.js中 __dirname 的使用介绍
2017/06/19 Javascript
jQuery、layer实现弹出层的打开、关闭功能
2017/06/28 jQuery
JS中正则表达式要注意lastIndex属性
2017/08/08 Javascript
深入理解Vuex 模块化(module)
2017/09/26 Javascript
详解vue mixins和extends的巧妙用法
2017/12/20 Javascript
BootStrap modal实现拖拽功能
2018/12/01 Javascript
vue框架下部署上线后刷新报404问题的解决方案(推荐)
2019/04/03 Javascript
ES6知识点整理之数组解构和字符串解构的应用示例
2019/04/17 Javascript
js实现圆形显示鼠标单击位置
2020/02/11 Javascript
JavaScript实现网页动态生成表格
2020/11/25 Javascript
python应用程序在windows下不出现cmd窗口的办法
2014/05/29 Python
python进阶教程之循环对象
2014/08/30 Python
python实现字符串连接的三种方法及其效率、适用场景详解
2017/01/13 Python
Python文本统计功能之西游记用字统计操作示例
2018/05/07 Python
python3 unicode列表转换为中文的实例
2018/10/26 Python
Python OpenCV读取中文路径图像的方法
2020/07/02 Python
中外合拍动画首获奥斯卡提名,“上海出品”《飞奔去月球》能否拿下最终大奖?
2021/03/16 国漫
CSS3动画:5种预载动画效果实例
2017/04/05 HTML / CSS
美国迪克体育用品商店:DICK’S Sporting Goods
2018/07/24 全球购物
Senreve官网:美国旧金山的奢侈手袋品牌
2019/03/21 全球购物
Quiksilver荷兰官方网站:冲浪和滑雪板
2019/11/16 全球购物
生产副总岗位职责
2013/11/28 职场文书
优秀大学生的自我评价
2014/01/16 职场文书
母亲80寿诞答谢词
2014/01/16 职场文书
学生保证书范文
2014/04/28 职场文书
2014年六五普法工作总结
2014/11/25 职场文书
2016春季田径运动会广播稿
2015/12/21 职场文书
一文了解MYSQL三大范式和表约束
2022/04/03 MySQL