经典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的计数器程序
Oct 09 PHP
PHP数据缓存技术
Feb 14 PHP
php 从数据库提取二进制图片的处理代码
Sep 09 PHP
PHP MySQL应用中使用XOR运算加密算法分享
Aug 28 PHP
PHP判断远程url是否有效的几种方法小结
Oct 08 PHP
php防止站外远程提交表单的方法
Oct 20 PHP
php结合web uploader插件实现分片上传文件
May 10 PHP
PHP读取文本文件并逐行输出该行使用最多的字符与对应次数的方法
Nov 25 PHP
PHP 实现公历日期与农历日期的互转换
Sep 13 PHP
详解PHP 二维数组排序保持键名不变
Mar 06 PHP
微信支付之JSAPI公众号支付详解
May 15 PHP
浅谈laravel 5.6 安装 windows上使用composer的安装过程
Oct 18 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
音乐朗读剧《MARS RED》2021年TV动画化决定!
2020/03/06 日漫
PHP实现提取一个图像文件并在浏览器上显示的代码
2012/10/06 PHP
mcrypt启用 加密以及解密过程详细解析
2013/08/07 PHP
php中explode函数用法分析
2014/11/15 PHP
php 基础函数
2017/02/10 PHP
PHP解决中文乱码
2017/04/28 PHP
laravel config文件配置全局变量的例子
2019/10/13 PHP
基于php+MySql实现学生信息管理系统实例
2020/08/04 PHP
实例:用 JavaScript 来操作字符串(一些字符串函数)
2007/02/15 Javascript
js计算精度问题小结
2013/04/22 Javascript
JavaScript实现多维数组的方法
2013/11/20 Javascript
JQuery为页面Dom元素绑定事件及解除绑定方法
2014/04/23 Javascript
jQuery如何获取同一个类标签的所有值(默认无法获取)
2014/09/25 Javascript
node.js中的Socket.IO使用实例
2014/11/04 Javascript
自己动手写的javascript前端等待控件
2015/10/30 Javascript
更高效的使用JQuery 这里总结了8个小技巧
2016/04/13 Javascript
[js高手之路]单例模式实现模态框的示例
2017/09/01 Javascript
快速搭建React的环境步骤详解
2017/11/06 Javascript
jQuery动态添加li标签并添加属性和绑定事件方法
2018/02/24 jQuery
Bootstrap 中data-[*] 属性的整理
2018/03/13 Javascript
用react-redux实现react组件之间数据共享的方法
2018/06/08 Javascript
webpack4 升级迁移的实现
2018/09/12 Javascript
jQuery Raty星级评分插件使用方法实例分析
2019/11/25 jQuery
node crawler如何添加promise支持
2020/02/01 Javascript
Numpy之random函数使用学习
2019/01/29 Python
Python图像读写方法对比
2020/11/16 Python
HTML5新标签兼容——&gt; 的两种方法
2018/09/12 HTML / CSS
马来西亚最大的在线隐形眼镜商店:MrLens
2019/03/27 全球购物
某IT外企面试题-二分法求方程!看看大家的C++功底
2015/07/04 面试题
舞蹈教育学专业推荐信
2013/11/27 职场文书
质量保证书范本
2014/04/29 职场文书
长江三峡导游词
2015/01/31 职场文书
大学生个人简历自我评价
2015/03/11 职场文书
总结会主持词
2015/07/02 职场文书
2015新员工工作总结范文
2015/10/15 职场文书
2016年“七一建党节”广播稿
2015/12/18 职场文书