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实现分页的一个示例
Oct 09 PHP
推荐个功能齐全的发送PHP邮件类
Jan 03 PHP
php执行sql语句的写法
Mar 10 PHP
UTF8编码内的繁简转换的PHP类
Jul 09 PHP
php 获取一个月第一天与最后一天的代码
May 16 PHP
php数组中包含中文的排序方法
Jun 03 PHP
一个图片地址分解程序(用于PHP小偷程序)
Aug 23 PHP
PHP实现AES256加密算法实例
Sep 22 PHP
PHP制作用户注册系统
Oct 23 PHP
PHP 自动加载的简单实现(推荐)
Aug 12 PHP
PHP实现浏览器中直接输出图片的方法示例
Mar 14 PHP
PDO::quote讲解
Jan 29 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写入WRITE编码为UTF8的文件的实现代码
2008/07/07 PHP
克隆一个新项目的快捷方式
2013/04/10 PHP
基于php常用正则表达式的整理汇总
2013/06/08 PHP
Laravel框架在本地虚拟机快速安装的方法详解
2018/06/11 PHP
Laravel框架自定义公共函数的引入操作示例
2019/04/16 PHP
xtree.js 代码
2007/03/13 Javascript
没有document.getElementByName方法
2013/08/19 Javascript
javascript完美拖拽的实现方法
2013/09/29 Javascript
JS使用for循环遍历Table的所有单元格内容
2014/08/21 Javascript
JavaScript中ES6 Babel正确安装过程
2016/07/18 Javascript
基于JS实现二维码图片固定在右下角某处并跟随滚动条滚动
2017/02/08 Javascript
JS实现控制图片显示大小的方法【图片等比例缩放功能】
2017/02/18 Javascript
Ionic + Angular.js实现图片轮播的方法示例
2017/05/21 Javascript
详解vee-validate的使用个人小结
2017/06/07 Javascript
jquery版轮播图效果和extend扩展
2017/07/18 jQuery
layui的table单击行勾选checkbox功能方法
2018/08/14 Javascript
超简单的微信小程序轮播图
2019/11/22 Javascript
python计算最大优先级队列实例
2013/12/18 Python
Python+Selenium自动化实现分页(pagination)处理
2017/03/31 Python
python脚本爬取字体文件的实现方法
2017/04/29 Python
详解Pycharm与anaconda安装配置指南
2020/08/25 Python
canvas绘制太极图的实现示例
2020/04/29 HTML / CSS
AmazeUI 导航条的实现示例
2020/08/14 HTML / CSS
阿拉伯世界最大的电子卖场:Souq埃及
2016/08/01 全球购物
Skip Hop官网:好莱坞宝宝挚爱品牌
2018/06/17 全球购物
Optimalprint加拿大:在线打印服务
2020/04/03 全球购物
七年级政治教学反思
2014/02/03 职场文书
12月小学生校园广播稿
2014/02/04 职场文书
六年级学生评语
2014/04/22 职场文书
网络优化专员求职信
2014/05/04 职场文书
离职感谢信
2015/01/21 职场文书
幼儿园托班教育随笔
2015/08/14 职场文书
干货:企业内部人才推荐奖励方案!
2019/07/09 职场文书
新手,如何业余时间安排好写作、提高写作能力?
2019/10/21 职场文书
i5-10400f处理相当于i7多少水平
2022/04/19 数码科技
JS轻量级函数式编程实现XDM二
2022/06/16 Javascript