经典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 相关文章推荐
MayFish PHP的MVC架构的开发框架
Aug 13 PHP
PHPMailer使用教程(PHPMailer发送邮件实例分析)
Dec 06 PHP
php中\r \r\n \t的区别示例介绍
Feb 08 PHP
PHP CURL或file_get_contents获取网页标题的代码及两者效率的稳定性问题
Nov 30 PHP
学习php设计模式 php实现装饰器模式(decorator)
Dec 07 PHP
php英文单词统计器
Jun 23 PHP
php中引用符号(&amp;)的使用详细介绍
Dec 06 PHP
Zend Framework入门教程之Zend_Config组件用法详解
Dec 09 PHP
PHP实现十进制数字与二十六进制字母串相互转换操作示例
Aug 10 PHP
php给数组赋值的实例方法
Sep 26 PHP
Yii框架学习笔记之应用组件操作示例
Nov 13 PHP
PHP实现页面静态化深入讲解
Mar 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
哪吒敖丙传:新人物二哥敖乙出场 小敖丙奶气十足
2020/03/08 国漫
十天学会php之第十天
2006/10/09 PHP
在PHP中PDO解决中文乱码问题的一些补充
2010/09/06 PHP
深入分析使用mysql_fetch_object()以对象的形式返回查询结果
2013/06/05 PHP
php命令行用法入门实例教程
2014/10/27 PHP
Packer 3.0 JS压缩及混淆工具 下载
2007/05/03 Javascript
jQuery Selector选择器小结
2010/05/06 Javascript
JavaScript继承基础讲解(原型链、借用构造函数、混合模式、原型式继承、寄生式继承、寄生组合式继承)
2014/08/16 Javascript
jquery+ajax验证不通过也提交表单问题处理
2014/12/12 Javascript
JavaScript实现跑马灯抽奖活动实例代码解析与优化(二)
2016/02/16 Javascript
AngularJS用户选择器指令实例分析
2016/11/04 Javascript
微信公众平台开发教程(六)获取个性二维码的实例
2016/12/02 Javascript
Vue.js实现简单动态数据处理
2017/02/13 Javascript
vue2.0使用Sortable.js实现的拖拽功能示例
2017/02/21 Javascript
vue 自定义 select内置组件
2018/04/10 Javascript
Angular ui-roter 和AngularJS 通过 ocLazyLoad 实现动态(懒)加载模块和依赖
2018/11/25 Javascript
vue+canvas实现拼图小游戏
2020/09/18 Javascript
为什么选择python编程语言入门黑客攻防 给你几个理由!
2018/02/02 Python
Python 获取 datax 执行结果保存到数据库的方法
2019/07/11 Python
python学生管理系统的实现
2020/04/05 Python
Pytorch 解决自定义子Module .cuda() tensor失败的问题
2020/06/23 Python
基于Python实现粒子滤波效果
2020/12/01 Python
pandas针对excel处理的实现
2021/01/15 Python
Python中对象的比较操作==和is区别详析
2021/02/12 Python
详解如何用canvas画一个微笑的表情
2019/03/14 HTML / CSS
Hammitt官网:设计师手袋
2020/05/23 全球购物
Sql面试题
2013/03/20 面试题
应届生人事助理求职信
2013/11/09 职场文书
商务英语应届生自我鉴定
2013/12/08 职场文书
拖鞋店创业计划书
2014/01/15 职场文书
2014年纪检部工作总结
2014/11/12 职场文书
土建技术员岗位职责
2015/04/11 职场文书
2015年党支部书记工作总结
2015/05/21 职场文书
浅谈mysql增加索引不生效的几种情况
2021/06/23 MySQL
Python中字符串对象语法分享
2022/02/24 Python
利用Python多线程实现图片下载器
2022/03/25 Python