经典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 相关文章推荐
第十一节--重载
Nov 16 PHP
Windows下的PHP5.0详解
Nov 18 PHP
php实现的在线人员函数库
Apr 09 PHP
《PHP编程最快明白》第二讲 数字、浮点、布尔型、字符串和数组
Nov 01 PHP
wordpress自定义url参数实现路由功能的代码示例
Nov 28 PHP
php防止sql注入代码实例
Dec 18 PHP
Laravel 5框架学习之Laravel入门和新建项目
Apr 07 PHP
PHP编程基本语法快速入门手册
Jan 07 PHP
PHP实现移除数组中为空或为某值元素的方法
Jan 07 PHP
PHP实现的DES加密解密封装类完整实例
Apr 29 PHP
[原创]php正则删除html代码中class样式属性的方法
May 24 PHP
使用PHP连接数据库_实现用户数据的增删改查的整体操作示例
Sep 01 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中基于ts与nts版本- vc6和vc9编译版本的区别详解
2013/04/26 PHP
Function eregi is deprecated (解决方法)
2013/06/21 PHP
对淘宝URL中ID提取的PHP代码
2013/09/01 PHP
PHP基于GD库的缩略图生成代码(支持jpg,gif,png格式)
2014/06/19 PHP
php运行提示:Fatal error Allowed memory size内存不足的解决方法
2014/12/17 PHP
WAMP环境中扩展oracle函数库(oci)
2015/06/26 PHP
php日期操作技巧小结
2016/06/25 PHP
php微信公众号开发(4)php实现自定义关键字回复
2016/12/15 PHP
jQuery中$.fn的用法示例介绍
2013/11/05 Javascript
浅析hasOwnProperty方法的应用
2013/11/20 Javascript
javascript删除数组元素并且数组长度减小的简单实例
2014/02/14 Javascript
jquery专业的导航菜单特效代码分享
2015/08/29 Javascript
jQuery实现可以编辑的表格实例详解【附demo源码下载】
2016/07/09 Javascript
AngularJS过滤器详解及示例代码
2016/08/16 Javascript
JavaScript实现星级评分
2017/01/12 Javascript
jquery请求servlet实现ajax异步请求的示例
2017/06/03 jQuery
AngularJS 限定$scope的范围实例详解
2017/06/23 Javascript
JavaScript设计模式之职责链模式应用示例
2018/08/07 Javascript
将RGB值转换为灰度值的简单算法
2019/10/09 Javascript
微信小程序实现拼图小游戏
2020/10/22 Javascript
python检测lvs real server状态
2014/01/22 Python
Python多层嵌套list的递归处理方法(推荐)
2016/06/08 Python
Django 多语言教程的实现(i18n)
2018/07/07 Python
python将秒数转化为时间格式的实例
2018/09/16 Python
python开发准备工作之配置虚拟环境(非常重要)
2019/02/11 Python
python excel转换csv代码实例
2019/08/26 Python
Python中输入和输出(打印)数据实例方法
2019/10/13 Python
selenium WebDriverWait类等待机制的实现
2020/03/18 Python
PyQt5+python3+pycharm开发环境配置教程
2020/03/24 Python
Django restful framework生成API文档过程详解
2020/11/12 Python
HTML5页面嵌入小程序没有返回按钮及返回页面空白的问题
2020/05/28 HTML / CSS
孝老爱亲模范事迹
2014/01/24 职场文书
大学生党员承诺书
2014/05/20 职场文书
考试后的感想
2015/08/07 职场文书
2016年中学植树节活动总结
2016/03/16 职场文书
PyTorch的Debug指南
2021/05/07 Python