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代码优化及php相关问题总结
Oct 09 PHP
php md5下16位和32位的实现代码
Apr 09 PHP
简单的PHP多图上传小程序代码
Jul 17 PHP
PHP图片等比缩放类SimpleImage使用方法和使用实例分享
Apr 10 PHP
yii实现创建验证码实例解析
Jul 31 PHP
PHP使用json_encode函数时不转义中文的解决方法
Nov 12 PHP
PHP判断来访是搜索引擎蜘蛛还是普通用户的代码小结
Sep 14 PHP
初识PHP中的Swoole
Apr 05 PHP
thinkphp框架下404页面设置 仅三步
May 14 PHP
php获取POST数据的三种方法实例详解
Dec 20 PHP
PHP设计模式之策略模式原理与用法实例分析
Apr 04 PHP
PHP使用Redis实现Session共享的实现示例
May 12 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
在数据量大(超过10万)的情况下
2007/01/15 PHP
php 指定范围内多个随机数代码实例
2016/07/18 PHP
PHP7常量数组用法分析
2016/09/26 PHP
JS面向对象编程之对象使用分析
2010/08/19 Javascript
js中call与apply的用法小结
2013/12/28 Javascript
js中settimeout方法加参数的使用实例
2014/02/27 Javascript
完美兼容各大浏览器的jQuery仿新浪图文淡入淡出间歇滚动特效
2014/11/12 Javascript
IE6/IE7中JavaScript json提示缺少标识符、字符串或数字问题处理
2014/12/16 Javascript
javascript 中的 delete及delete运算符
2015/11/15 Javascript
Angular 根据 service 的状态更新 directive
2016/04/03 Javascript
微信小程序实现锚点定位楼层跳跃的实例
2017/05/18 Javascript
深入理解JavaScript 中的匿名函数((function() {})();)与变量的作用域
2018/08/28 Javascript
JS数组实现分类统计实例代码
2018/09/30 Javascript
mocha的时序规则讲解
2019/02/16 Javascript
JS使用iView的Dropdown实现一个右键菜单
2019/05/06 Javascript
微信小程序3D轮播实现代码
2019/09/19 Javascript
JavaScript canvas绘制折线图
2020/02/18 Javascript
微信小程序 scroll-view的使用案例代码详解
2020/06/11 Javascript
Python进阶篇之字典操作总结
2016/11/16 Python
python的random模块及加权随机算法的python实现方法
2017/01/04 Python
python的paramiko模块实现远程控制和传输示例
2017/10/13 Python
你真的了解Python的random模块吗?
2017/12/12 Python
小白如何入门Python? 制作一个网站为例
2018/03/06 Python
Python代码实现http/https代理服务器的脚本
2019/08/12 Python
Django url,从一个页面调到另个页面的方法
2019/08/21 Python
pandas中的ExcelWriter和ExcelFile的实现方法
2020/04/24 Python
Python SMTP配置参数并发送邮件
2020/06/16 Python
python request 模块详细介绍
2020/11/10 Python
linux系统下pip升级报错的解决方法
2021/01/31 Python
英国最受信任的在线眼镜商之一:Fashion Eyewear
2019/10/31 全球购物
4S店售后客服自我评价
2014/04/09 职场文书
护士节演讲稿开场白
2014/08/25 职场文书
幼儿园感恩节活动方案
2014/10/06 职场文书
2014年医药代表工作总结
2014/11/22 职场文书
文员岗位职责范本
2015/04/16 职场文书
求职自我评价参考范文
2019/05/16 职场文书