经典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 相关文章推荐
如何给phpcms v9增加类似于phpcms 2008中的关键词表
Jul 01 PHP
php中require和require_once的区别说明
Feb 27 PHP
php动态生成缩略图并输出显示的方法
Apr 20 PHP
PHP通过反射动态加载第三方类和获得类源码的实例
Nov 27 PHP
PHP中的session安全吗?
Jan 22 PHP
Yii2中使用asset压缩js,css文件的方法
Nov 24 PHP
php计算多个集合的笛卡尔积实例详解
Feb 16 PHP
简单谈谈PHP面向对象之标识对象
Jun 27 PHP
laravel 框架结合关联查询 when()用法分析
Nov 22 PHP
php设计模式之建造器模式分析【星际争霸游戏案例】
Jan 23 PHP
Laravel的加密解密与哈希实例讲解
Mar 24 PHP
PHP新手指南
Apr 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安全的URL字符串base64编码和解码
2014/06/19 PHP
ThinkPHP写数组插入与获取最新插入数据ID实例
2014/11/03 PHP
PHP安装memcached扩展笔记
2015/05/28 PHP
php 生成加密公钥加密私钥实例详解
2017/06/16 PHP
创建无限极分类树型结构的简单方法
2017/06/20 PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
[原创]站长必须要知道的javascript广告代码
2007/05/30 Javascript
理解Javascript_06_理解对象的创建过程
2010/10/15 Javascript
Javascript生成json的函数代码(可以用php的json_decode解码)
2012/06/11 Javascript
jquery ready(fn)事件使用介绍
2013/08/21 Javascript
方便实用的jQuery checkbox复选框全选功能简单实例
2013/10/09 Javascript
JavaScript实现相册弹窗功能(zepto.js)
2016/06/21 Javascript
KnockoutJS 3.X API 第四章之数据控制流with绑定
2016/10/10 Javascript
微信小程序 实战程序简易新闻的制作
2017/01/09 Javascript
vue-dialog的弹出层组件
2020/05/25 Javascript
layui获取多选框中的值方法
2018/08/15 Javascript
微信小程序自定义select下拉选项框组件的实现代码
2018/08/28 Javascript
webpack DllPlugin xxx is not defined解决办法
2019/12/13 Javascript
[04:29]【TI9采访】OG.N0tail在胜者组决赛后接受采访
2019/08/25 DOTA
web.py中调用文件夹内模板的方法
2014/08/26 Python
python将文本分每两行一组并保存到文件
2018/03/19 Python
python实时获取外部程序输出结果的方法
2019/01/12 Python
Python3之不使用第三方变量,实现交换两个变量的值
2019/06/26 Python
Python Django 实现简单注册功能过程详解
2019/07/29 Python
使用canvas绘制超炫时钟
2014/12/17 HTML / CSS
HTML5在微信内置浏览器下右上角菜单的调整字体导致页面显示错乱的问题
2021/01/19 HTML / CSS
英国Radley包德国官网:Radley London德国
2019/11/18 全球购物
编程输出如下图形
2013/11/24 面试题
Ruby如何进行文件操作
2014/07/17 面试题
篝火晚会主持词
2014/03/25 职场文书
优秀少先队辅导员先进事迹材料
2014/05/18 职场文书
cf战队收人口号
2014/06/21 职场文书
教育系统干部作风整顿心得体会
2014/09/09 职场文书
2015年骨干教师工作总结
2015/05/26 职场文书
2015年会计年终工作总结
2015/05/26 职场文书
python生成可执行exe控制Microsip自动填写号码并拨打功能
2021/06/21 Python