php加密解密函数authcode的用法详细解析


Posted in PHP onOctober 28, 2013

核心提示:康盛的 authcode 函数可以说对中国的PHP界作出了重大贡献。包括康盛自己的产品,以及大部分中国使用PHP的公司都用这个函数进行加密,authcode 是使用异或运算进行加密和解密。
 
康盛的 authcode 函数可以说对中国的PHP界作出了重大贡献。包括康盛自己的产品,以及大部分中国使用PHP的公司都用这个函数进行加密,authcode 是使用异或运算进行加密和解密。
  
原理如下,假如:
 
加密
 
明文:1010 1001
 
密匙:1110 0011
 
密文:0100 1010
 
得出密文0100 1010,解密之需和密匙异或下就可以了
 
解密
 
密文:0100 1010
 
密匙:1110 0011
 
明文:1010 1001
 
并没有什么高深的算法,密匙重要性很高,所以,关键在于怎么生成密匙。
 
那我们一起看下康盛的authcode怎么做的吧

// 参数解释  
 // $string: 明文 或 密文  
 // $operation:DECODE表示解密,其它表示加密  
 // $key: 密匙  
 // $expiry:密文有效期  
 function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) {  
   // 动态密匙长度,相同的明文会生成不同密文就是依靠动态密匙  
   $ckey_length = 4;  
     
   // 密匙  
   $key = md5($key ? $key : $GLOBALS['discuz_auth_key']);  
     
   // 密匙a会参与加解密  
   $keya = md5(substr($key, 0, 16));  
   // 密匙b会用来做数据完整性验证  
   $keyb = md5(substr($key, 16, 16));  
   // 密匙c用于变化生成的密文  
   $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): 
substr(md5(microtime()), -$ckey_length)) : '';  
   // 参与运算的密匙  
   $cryptkey = $keya.md5($keya.$keyc);  
   $key_length = strlen($cryptkey);  
   // 明文,前10位用来保存时间戳,解密时验证数据有效性,10到26位用来保存$keyb(密匙b),解密时会通过这个密匙验证数据完整性  
   // 如果是解码的话,会从第$ckey_length位开始,因为密文前$ckey_length位保存 动态密匙,以保证解密正确  
   $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') {  
     // substr($result, 0, 10) == 0 验证数据有效性  
     // substr($result, 0, 10) - time() > 0 验证数据有效性  
     // substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16) 验证数据完整性  
     // 验证数据有效性,请看未加密明文的格式  
     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 {  
     // 把动态密匙保存在密文里,这也是为什么同样的明文,生产不同密文后能解密的原因  
     // 因为加密后的密文可能是一些特殊字符,复制过程可能会丢失,所以用base64编码  
     return $keyc.str_replace('=', '', base64_encode($result));  
   }  
 }
PHP 相关文章推荐
PHP.MVC的模板标签系统(三)
Sep 05 PHP
搜索和替换文件或目录的一个好类--很实用
Oct 09 PHP
第十一节--重载
Nov 16 PHP
php adodb操作mysql数据库
Mar 19 PHP
简单的php中文转拼音的实现代码
Feb 11 PHP
PHP 魔术变量和魔术函数详解
Feb 25 PHP
php实现zip文件解压操作
Nov 03 PHP
php仿微信红包分配算法的实现方法
May 13 PHP
thinkphp跨库操作的简单代码实例
Sep 22 PHP
ThinkPHP5框架实现简单的批量查询功能示例
Jun 07 PHP
PHP实现对数字分隔加千分号的方法
Mar 18 PHP
PHP 技巧 * SVG 保存为图片(分享图生成)
Apr 02 PHP
php 模拟post_验证页面的返回状态(实例讲解)
Oct 28 #PHP
php操作mysqli(示例代码)
Oct 28 #PHP
php session_start()出错原因分析及解决方法
Oct 28 #PHP
php 强制下载文件实现代码
Oct 28 #PHP
php获取qq用户昵称和在线状态(实例分析)
Oct 27 #PHP
php获取数组长度的方法(有实例)
Oct 27 #PHP
使用淘宝IP库获取用户ip地理位置
Oct 27 #PHP
You might like
php 生成随机验证码图片代码
2010/02/08 PHP
解析使用substr截取UTF-8中文字符串出现乱码的问题
2013/06/20 PHP
PHP+Javascript实现在线拍照功能实例
2015/07/18 PHP
lib.utf.js
2007/08/21 Javascript
javascript中的float运算精度实例分析
2010/08/21 Javascript
vue webpack打包优化操作技巧
2018/02/22 Javascript
vue组件文档(.md)中如何自动导入示例(.vue)详解
2019/01/25 Javascript
解决微信浏览器缓存站点入口文件(IIS部署Vue项目)
2019/06/17 Javascript
Vuex的热更替如何实现
2020/06/05 Javascript
[05:02][DOTA2]DOTA进化论 第一期
2013/09/27 DOTA
python实现的jpg格式图片修复代码
2015/04/21 Python
详解Python中表达式i += x与i = i + x是否等价
2017/02/08 Python
Python读取Pickle文件信息并计算与当前时间间隔的方法分析
2019/01/30 Python
Python异步操作MySQL示例【使用aiomysql】
2019/05/16 Python
python协程gevent案例 爬取斗鱼图片过程解析
2019/08/27 Python
使用Django搭建web服务器的例子(最最正确的方式)
2019/08/29 Python
python2与python3爬虫中get与post对比解析
2019/09/18 Python
python-xpath获取html文档的部分内容
2020/03/06 Python
python 常用日期处理-- datetime 模块的使用
2020/09/02 Python
Python xlrd/xlwt 创建excel文件及常用操作
2020/09/24 Python
Pycharm 设置默认解释器路径和编码格式的操作
2021/02/05 Python
用CSS3的box-reflect来制作倒影效果
2016/11/15 HTML / CSS
Canvas绘制浮动球效果的示例
2017/12/29 HTML / CSS
美国迪克体育用品商店:DICK’S Sporting Goods
2018/07/24 全球购物
英国信箱在线鲜花速递公司:Bloom & Wild
2019/03/10 全球购物
Java面试中常遇到的问题,也是需要注意的几点
2013/08/30 面试题
党的群众教育实践活动实施方案
2014/06/12 职场文书
2014年镇党建工作汇报材料
2014/11/02 职场文书
毕业生就业推荐表导师评语
2014/12/31 职场文书
身份证丢失证明
2015/06/19 职场文书
七年级写作指导之游记作文
2019/10/07 职场文书
想创业成功,需要掌握这些要点
2019/12/06 职场文书
python读取pdf格式文档的实现代码
2021/04/01 Python
HTML通过表单实现酒店筛选功能
2021/05/18 HTML / CSS
Python开发工具Pycharm的安装以及使用步骤总结
2021/06/24 Python
Jackson 反序列化时实现大小写不敏感设置
2021/06/29 Java/Android