经典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 常用函数库和一些实用小技巧
Jan 01 PHP
php 动态添加记录
Mar 10 PHP
采用PHP函数memory_get_usage获取PHP内存清耗量的方法
Dec 06 PHP
php cookie名使用点号(句号)会被转换
Oct 23 PHP
php将textarea数据提交到mysql出现很多空格的解决方法
Dec 19 PHP
PHP实现的简易版图片相似度比较
Jan 07 PHP
PHP删除指定目录中的所有目录及文件的方法
Feb 26 PHP
php搜索文件程序分享
Oct 30 PHP
PHP 芝麻信用接入的注意事项
Dec 01 PHP
ThinkPHP3.2框架自定义配置和加载用法示例
Jun 14 PHP
php使用curl模拟浏览器表单上传文件或者图片的方法
Nov 10 PHP
如何在PHP中使用数组
Jun 09 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多种序列化与反序列化的方法
2013/06/06 PHP
PHP实现多进程并行操作的详解(可做守护进程)
2013/06/18 PHP
数组与类使用PHP的可变变量名需要的注意的问题
2013/06/20 PHP
解析PHP获取当前网址及域名的实现代码
2013/06/23 PHP
php数组使用规则分析
2015/02/27 PHP
PHP使用微信开发模式实现搜索已发送图文及匹配关键字回复的方法
2017/09/13 PHP
javascript字典探测用户名工具
2006/10/05 Javascript
jQuery的一些注意
2006/12/06 Javascript
Js获取事件对象代码
2010/08/05 Javascript
从零开始学习jQuery (六) jquery中的AJAX使用
2011/02/23 Javascript
JQuery插件开发示例代码
2013/11/06 Javascript
JavaScript之WebSocket技术详解
2016/11/18 Javascript
vue组件父子间通信之综合练习(聊天室)
2017/11/07 Javascript
vue的token刷新处理的方法
2018/07/17 Javascript
JavaScript this关键字的深入详解
2021/01/14 Javascript
原生js实现自定义难度的扫雷游戏
2021/01/22 Javascript
[02:52]2014DOTA2西雅图国际邀请赛 CIS战队巡礼
2014/07/07 DOTA
[02:49]2014DOTA2电竞也是体育项目! 势要把荣誉带回中国!
2014/07/20 DOTA
Python实现上下班抢个顺风单脚本
2018/02/07 Python
Django ManyToManyField 跨越中间表查询的方法
2018/12/18 Python
OpenCV 轮廓检测的实现方法
2019/07/03 Python
Python开发之基于模板匹配的信用卡数字识别功能
2020/01/13 Python
Django choices下拉列表绑定实例
2020/03/13 Python
Python-openpyxl表格读取写入的案例详解
2020/11/02 Python
详解如何获取localStorage最大存储大小的方法
2020/05/21 HTML / CSS
英国珠宝和手表专家:Pleasance & Harper
2020/10/21 全球购物
超市实习总结自我鉴定
2013/09/19 职场文书
师范应届生求职信
2013/11/15 职场文书
晚宴邀请函范文
2014/01/15 职场文书
红领巾心向党广播稿
2014/01/19 职场文书
优秀女职工事迹材料
2014/02/06 职场文书
党员干部廉洁承诺书
2014/05/28 职场文书
软件工程毕业生自荐信
2014/07/04 职场文书
宣传稿格式范文
2015/07/23 职场文书
优秀共产党员事迹材料2016
2016/02/29 职场文书
纯html+css实现Element loading效果
2021/08/02 HTML / CSS