discuz程序的PHP加密函数原理分析


Posted in PHP onAugust 05, 2011

原理如下,假如:

加密

明文: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 If Else(elsefi) 语句
Apr 07 PHP
探讨:如何使用PHP实现计算两个日期间隔的年、月、周、日数
Jun 13 PHP
php 邮件发送问题解决
Mar 22 PHP
php5.2 Json不能正确处理中文、GB编码的解决方法
Mar 28 PHP
ThinkPHP CURD方法之data方法详解
Jun 18 PHP
php基础设计模式大全(注册树模式、工厂模式、单列模式)
Aug 31 PHP
PHP的openssl加密扩展使用小结(推荐)
Jul 18 PHP
Yii2针对游客、用户防范规则和限制的解决方法分析
Oct 08 PHP
php基于curl实现随机ip地址抓取内容的方法
Oct 11 PHP
php中curl和soap方式请求服务超时问题的解决
Jun 11 PHP
TP5框架页面跳转样式操作示例
Apr 05 PHP
yii框架结合charjs实现统计30天数据的方法
Apr 04 PHP
PHP源码之explode使用说明
Aug 05 #PHP
PHP在获取指定目录下的目录,在获取的目录下面再创建文件,多平台
Aug 03 #PHP
php中获取远程客户端的真实ip地址的方法
Aug 03 #PHP
用PHP实现的四则运算表达式计算实现代码
Aug 02 #PHP
PHP5 的对象赋值机制介绍
Aug 02 #PHP
利用PHP实现智能文件类型检测的实现代码
Aug 02 #PHP
10条PHP高级技巧[修正版]
Aug 02 #PHP
You might like
分页详解 从此分页无忧(PHP+mysql)
2007/11/23 PHP
PHP 数字左侧自动补0
2008/03/31 PHP
php5.2 Json不能正确处理中文、GB编码的解决方法
2014/03/28 PHP
php实现httpRequest的方法
2015/03/13 PHP
CI框架简单邮件发送类实例
2016/05/18 PHP
PHP中STDCLASS用法实例分析
2016/11/11 PHP
php合并数组并保留键值的实现方法
2018/03/12 PHP
jQuery获取地址栏参数插件(模仿C#)
2010/10/26 Javascript
javascript模拟的Ping效果代码 (Web Ping)
2011/03/13 Javascript
JavaScript 原型继承
2011/12/26 Javascript
JavaScript异步调用定时方法并停止该方法实现代码
2012/03/16 Javascript
jquery遍历之parent()和parents()的区别及parentsUntil()方法详解
2013/12/02 Javascript
JavaScript通过元素索引号删除数组中对应元素的方法
2015/03/18 Javascript
9个让JavaScript调试更简单的Console命令
2016/11/14 Javascript
JS执行控制之节流模式实例分析
2018/12/21 Javascript
JS实现移动端在线签协议功能
2019/08/22 Javascript
python pandas 对时间序列文件处理的实例
2018/06/22 Python
对Python发送带header的http请求方法详解
2019/01/02 Python
解决Ubuntu18中的pycharm不能调用tensorflow-gpu的问题
2020/09/17 Python
一款利用纯css3实现的win8加载动画的实例分析
2014/12/11 HTML / CSS
浅谈HTML5新增及移除的元素
2016/06/27 HTML / CSS
伦敦所有西区剧院演出官方票务代理:Theatre Tickets Direct
2017/05/26 全球购物
美国新兴城市生活方式零售商:VILLA
2017/12/06 全球购物
廉价航班、机票和酒店:JustFly
2018/02/07 全球购物
Myprotein法国官网:欧洲第一运动营养品牌
2019/03/26 全球购物
销售副总经理岗位职责
2013/12/11 职场文书
好家长事迹材料
2014/01/23 职场文书
毕业典礼主持词大全
2014/03/26 职场文书
伊索寓言教学反思
2014/05/01 职场文书
党员学习中共十八大报告思想汇报
2014/09/15 职场文书
护士先进个人总结
2015/02/13 职场文书
2015年母亲节寄语
2015/03/23 职场文书
高中家长意见怎么写
2015/06/03 职场文书
简爱电影观后感
2015/06/10 职场文书
什么是创业计划书?什么是商业计划书?这里一一解答
2019/07/12 职场文书
「月刊Action」2022年5月号封面公开
2022/03/21 日漫