经典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错误抑制符(@)导致引用传参失败Bug的分析
May 02 PHP
关于使用key/value数据库redis和TTSERVER的心得体会
Jun 28 PHP
php 读取文件头判断文件类型的实现代码
Aug 05 PHP
用PHP实现弹出消息提示框的两种方法
Dec 17 PHP
Yii操作数据库的3种方法
Mar 11 PHP
highchart数据源纵轴json内的值必须是int(详解)
Feb 20 PHP
在Laravel5.6中使用Swoole的协程数据库查询
Jun 15 PHP
PHP中的访问修饰符简单比较
Feb 02 PHP
php抽象方法和普通方法的区别点总结
Oct 13 PHP
PHP设计模式之适配器模式(Adapter)原理与用法详解
Dec 12 PHP
php 多进程编程父进程的阻塞与非阻塞实例分析
Feb 22 PHP
PHP实现腾讯短网址生成api接口实例
Dec 08 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部分常见问题总结
2006/10/09 PHP
SWFUpload与CI不能正确上传识别文件MIME类型解决方法分享
2011/04/18 PHP
jquery插件jbox使用iframe关闭问题
2009/02/09 Javascript
Jquery Ajax学习实例7 Ajax所有过程事件分析示例
2010/03/23 Javascript
javascript cookies操作集合
2010/04/12 Javascript
Javascript笔记一 js以及json基础使用说明
2010/05/22 Javascript
基于jquery实现的上传图片及图片大小验证、图片预览效果代码
2011/04/12 Javascript
不同的jQuery API来处理不同的浏览器事件
2012/12/09 Javascript
JS中Iframe之间传值的方法
2013/03/11 Javascript
Jquery原生态实现表格header头随滚动条滚动而滚动
2014/03/18 Javascript
JavaScript实现显示函数调用堆栈的方法
2016/04/21 Javascript
AngularJS基础 ng-repeat 指令简单示例
2016/08/03 Javascript
javascript设计模式之module(模块)模式
2016/08/19 Javascript
关于Node.js的events.EventEmitter用法介绍
2017/04/01 Javascript
Vue v2.5 调整和更新不完全问题
2017/10/24 Javascript
jQuery 选择器用法基础入门示例
2020/01/04 jQuery
element 中 el-menu 组件的无限极循环思路代码详解
2020/04/26 Javascript
[00:19]CN DOTA NEVER DIE!VG夺冠rOtK接受采访
2019/12/23 DOTA
Python+opencv 实现图片文字的分割的方法示例
2019/07/04 Python
基于python cut和qcut的用法及区别详解
2019/11/22 Python
PyCharm2020.1.2社区版安装,配置及使用教程详解(Windows)
2020/08/07 Python
python openCV自制绘画板
2020/10/27 Python
10个示例带你掌握python中的元组
2020/11/23 Python
Pycharm 跳转回之前所在页面的操作
2021/02/05 Python
纯css3实现的竖形无限级导航
2014/12/10 HTML / CSS
使用CSS3实现多列布局与多背景的技巧
2016/02/29 HTML / CSS
护理专业毕业生自我鉴定
2013/10/08 职场文书
大学专科生推荐信范文
2013/11/23 职场文书
函授毕业自我鉴定
2013/12/19 职场文书
户外婚礼策划方案
2014/02/08 职场文书
英语国培研修感言
2014/02/13 职场文书
五一劳动节活动记录
2014/03/23 职场文书
小学生田径运动会广播稿
2014/09/11 职场文书
话题作文之学会尊重
2019/12/16 职场文书
Win10防火墙白名单怎么设置?Win10添加防火墙白名单方法
2022/04/06 数码科技
Python中文分词库jieba(结巴分词)详细使用介绍
2022/04/07 Python