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下一个阿拉伯数字转中文数字的函数
Jul 16 PHP
php daddslashes()和 saddslashes()有哪些区别分析
Oct 26 PHP
php批量更改数据库表前缀实现方法
Oct 26 PHP
PHP中使用sleep函数实现定时任务实例分享
Aug 21 PHP
五款PHP代码重构工具推荐
Oct 14 PHP
php导入excel文件到mysql数据库的方法
Jan 14 PHP
php定义参数数量可变的函数用法实例
Mar 16 PHP
php实现网站留言板功能
Nov 04 PHP
PHP的PDO常用类库实例分析
Apr 07 PHP
YII视图整合kindeditor扩展的方法
Jul 13 PHP
PHP自定义函数格式化json数据示例
Sep 14 PHP
PHP小程序支付功能完整版【基于thinkPHP】
Mar 26 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中autoload的用法总结
2013/11/08 PHP
PHP中迭代器的简单实现及Yii框架中的迭代器实现方法示例
2020/04/26 PHP
javascript编程起步(第五课)
2007/01/10 Javascript
js自定义方法通过隐藏iframe实现文件下载
2013/02/21 Javascript
nodejs中使用多线程编程的方法实例
2015/03/24 NodeJs
jquery UI Datepicker时间控件的使用及问题解决
2016/04/28 Javascript
jQuery实现查找链接文字替换属性的方法
2016/06/27 Javascript
JavaScript登录记住密码操作(超简单代码)
2017/03/22 Javascript
win系统下nodejs环境安装配置
2017/05/04 NodeJs
详解webpack进阶之插件篇
2017/07/06 Javascript
详解10分钟学会vue滚动行为
2017/09/21 Javascript
详解Vue-cli代理解决跨域问题
2017/09/27 Javascript
js实现京东秒杀倒计时功能
2019/01/21 Javascript
uni-app之APP和小程序微信授权方法
2019/05/09 Javascript
JavaScript Math对象和调试程序的方法分析
2019/05/13 Javascript
深入理解JavaScript 箭头函数
2019/05/30 Javascript
Vue.js实现可编辑的表格
2019/12/11 Javascript
Python函数嵌套实例
2014/09/23 Python
浅谈django2.0 ForeignKey参数的变化
2019/08/06 Python
python:目标检测模型预测准确度计算方式(基于IoU)
2020/01/18 Python
Python基于os.environ从windows获取环境变量
2020/06/09 Python
Matplotlib中rcParams使用方法
2021/01/05 Python
详解CSS3实现响应式手风琴效果
2020/06/10 HTML / CSS
Foot Locker意大利官网:全球领先的运动鞋和服装零售商
2017/05/30 全球购物
英国最受欢迎的在线隐形眼镜商店:VisionDirect.co.uk
2018/12/06 全球购物
Brasty波兰:香水、化妆品、手表网上商店
2019/04/15 全球购物
美国饼干礼物和美食甜点购买网站:Cheryl’s
2020/05/28 全球购物
中学运动会广播稿
2014/01/19 职场文书
《果园机器人》教学反思
2014/04/13 职场文书
教室标语大全
2014/06/21 职场文书
信息管理与信息系统专业求职信
2014/06/21 职场文书
夫妻房产协议书的格式
2014/10/11 职场文书
2015年六一儿童节演讲稿
2015/03/19 职场文书
跟班学习心得体会(共6篇)
2016/01/23 职场文书
个人职业生涯规划之自我评估篇
2019/09/03 职场文书
服务器SVN搭建图文安装过程
2022/06/21 Servers