经典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 ignore_user_abort与register_shutdown_function 使用方法
Jun 14 PHP
PHP fopen 读取带中文URL地址的一点见解
Sep 25 PHP
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 2611816 bytes)
Nov 08 PHP
php中的动态调用实例分析
Jan 07 PHP
MacOS 安装 PHP的图片裁剪扩展Tclip
Mar 25 PHP
将PHP从5.3.28升级到5.3.29时Nginx出现502错误
May 09 PHP
php中实现用数组妩媚地生成要执行的sql语句
Jul 10 PHP
php 浮点数比较方法详解
May 05 PHP
Yii 2.0在Grid中格式化时间方法示例
Jun 06 PHP
PHP实现求两个字符串最长公共子串的方法示例
Nov 17 PHP
Laravel 默认邮箱登录改成用户名登录的实现方法
Aug 12 PHP
php实现快速对二维数组某一列进行组装的方法小结
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代码的50个实用技巧必备(下)
2016/01/22 PHP
php实现微信公众平台发红包功能
2018/06/14 PHP
PHP多个图片压缩成ZIP的方法
2020/08/18 PHP
jQuery 动画基础教程
2008/12/25 Javascript
jquery异步调用页面后台方法&amp;#8207;(asp.net)
2011/03/01 Javascript
JQuery.ajax传递中文参数的解决方法 推荐
2011/03/28 Javascript
Jquery 表格合并的问题分享
2011/09/17 Javascript
jquery获取tr并更改tr内容示例代码
2014/02/13 Javascript
js确认删除对话框效果的示例代码
2014/02/20 Javascript
JavaScript中的alert()函数使用技巧详解
2014/12/29 Javascript
AngularJS页面访问时出现页面闪烁问题的解决
2016/03/06 Javascript
JS简单实现无缝滚动效果实例
2016/08/24 Javascript
jQuery实现点击任意位置弹出层外关闭弹出层效果
2016/10/19 Javascript
Vue 进阶教程之v-model详解
2017/05/06 Javascript
Node.js学习教程之HTTP/2服务器推送【译】
2017/10/31 Javascript
vue中mint-ui的使用方法
2018/04/04 Javascript
angular2 ng2-file-upload上传示例代码
2018/08/23 Javascript
JavaScript利用键盘码控制div移动
2020/03/19 Javascript
python中关于时间和日期函数的常用计算总结(time和datatime)
2013/03/08 Python
github配置使用指南
2014/11/18 Python
插入排序_Python与PHP的实现版(推荐)
2017/05/11 Python
Python构建XML树结构的方法示例
2017/06/30 Python
python通过paramiko复制远程文件及文件目录到本地
2019/04/30 Python
Python unittest如何生成HTMLTestRunner模块
2020/09/08 Python
Canvas制作的下雨动画的示例
2018/03/06 HTML / CSS
函授毕业生的自我鉴定
2013/11/26 职场文书
三八妇女节活动主持词
2014/03/17 职场文书
工作证明格式及范本
2014/09/12 职场文书
社区班子个人对照检查材料思想汇报
2014/10/07 职场文书
党员群众路线剖析材料
2014/10/08 职场文书
大学生上课迟到检讨书
2014/10/15 职场文书
丽江古城导游词
2015/02/03 职场文书
2015年宣传思想工作总结
2015/05/22 职场文书
运动会5000米加油稿
2015/07/21 职场文书
小学数学教学反思范文
2016/02/16 职场文书
深入理解pytorch库的dockerfile
2022/06/10 Python