经典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 5.0对象模型深度探索之对象复制
Mar 27 PHP
php5 pdo新改动加载注意事项
Sep 11 PHP
PHP 飞信好友免费短信API接口开源版
Jul 22 PHP
php更改目录及子目录下所有的文件后缀扩展名的代码
Oct 12 PHP
PHP的异常处理类Exception的使用及说明
Jun 13 PHP
一个简单的网页密码登陆php代码
Jul 17 PHP
PHP随机生成随机个数的字母组合示例
Jan 14 PHP
php准确获取文件MIME类型的方法
Jun 17 PHP
php连接oracle数据库的方法(测试成功)
May 26 PHP
PHP文件操作实例总结【文件上传、下载、分页】
Dec 08 PHP
laravel框架的安装与路由实例分析
Oct 11 PHP
详解Go与PHP的语法对比
May 29 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
30 个很棒的PHP开源CMS内容管理系统小结
2011/10/14 PHP
php中通过正则表达式下载内容中的远程图片的函数代码
2012/01/10 PHP
PHP时间类完整实例(非常实用)
2015/12/25 PHP
php 的反射详解及示例代码
2016/08/25 PHP
laravel框架数据库配置及操作数据库示例
2019/10/10 PHP
PHP7 错误处理机制修改
2021/03/09 PHP
JavaScript调试技巧之console.log()详解
2014/03/19 Javascript
jquery中获取元素里某一特定子元素的代码
2014/12/02 Javascript
浅谈JavaScript的Polymer框架中的behaviors对象
2015/07/29 Javascript
js如何实现淡入淡出效果
2020/11/18 Javascript
Vue.js仿微信聊天窗口展示组件功能
2017/08/11 Javascript
详解angularjs跨页面传参遇到的一些问题
2018/11/01 Javascript
Vue中通过Vue.extend动态创建实例的方法
2019/08/13 Javascript
NodeJS实现一个聊天室功能
2019/11/25 NodeJs
JavaScript组合设计模式--改进引入案例分析
2020/05/23 Javascript
使用vue实现通过变量动态拼接url
2020/07/22 Javascript
vue-cli4使用全局less文件中的变量配置操作
2020/10/21 Javascript
vue中是怎样监听数组变化的
2020/10/24 Javascript
Python实用日期时间处理方法汇总
2015/05/09 Python
Python+django实现文件上传
2016/01/17 Python
python 3利用BeautifulSoup抓取div标签的方法示例
2017/05/28 Python
Python利用ORM控制MongoDB(MongoEngine)的步骤全纪录
2018/09/13 Python
python添加模块搜索路径和包的导入方法
2019/01/19 Python
使用Python和Scribus创建一个RGB立方体的方法
2019/07/17 Python
python next()和iter()函数原理解析
2020/02/07 Python
CSS3实现网站商品展示效果图
2020/01/18 HTML / CSS
匡威德国官网:Converse德国
2019/01/26 全球购物
Madewell澳大利亚官方网站:美国休闲服饰品牌
2019/07/18 全球购物
事假请假条范文
2014/04/11 职场文书
纪检干部现实表现材料
2014/08/21 职场文书
基层党员群众路线教育实践活动个人对照检查材料思想汇报
2014/10/05 职场文书
小学班主任个人总结
2015/03/03 职场文书
超市收银员岗位职责
2015/04/07 职场文书
教师聘用意向书
2015/05/11 职场文书
大学生先进个人主要事迹材料
2015/11/04 职场文书
MySQL的表级锁,行级锁,排它锁和共享锁
2022/07/15 MySQL