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 相关文章推荐
用ADODB来让PHP操作ACCESS数据库的方法
Dec 31 PHP
php SQL之where语句生成器
Mar 24 PHP
php smarty模版引擎中的缓存应用
Dec 11 PHP
php用数组返回无限分类的列表数据的代码
Aug 08 PHP
关于二级目录拖拽排序的实现(源码示例下载)
Apr 26 PHP
php mysql_real_escape_string函数用法与实例教程
Sep 30 PHP
php数组中包含中文的排序方法
Jun 03 PHP
ThinkPHP3.1新特性之动态设置自动完成及自动验证示例代码
Jun 23 PHP
ThinkPHP实现非标准名称数据表快速创建模型的方法
Nov 29 PHP
ThinkPHP连接数据库的方式汇总
Dec 05 PHP
php中有关合并某一字段键值相同的数组合并的改进
Mar 10 PHP
详解PHP中的Traits
Jul 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
声音就能俘获人心,蕾姆,是哪个漂亮小姐姐配音呢?
2020/03/03 日漫
经典PHP加密解密函数Authcode()修复版代码
2015/04/05 PHP
php中使用in_array() foreach array_search() 查找数组是否包含时的性能对比
2015/04/14 PHP
在Windows系统下使用PHP生成Word文档的教程
2015/07/03 PHP
PHP 9 大缓存技术总结
2015/09/17 PHP
php判断是否为ajax请求的方法
2016/11/29 PHP
php+redis实现商城秒杀功能
2020/11/19 PHP
PHP中str_split()函数的用法讲解
2019/04/11 PHP
15个款优秀的 jQuery 图片特效插件推荐
2011/11/21 Javascript
javascript 保存文件到本地实现方法
2012/11/29 Javascript
Jquery刷新页面背景图片随机变换的实现方法
2013/03/15 Javascript
bootstrap table 服务器端分页例子分享
2015/02/10 Javascript
javascript中返回顶部按钮的实现
2015/05/05 Javascript
JavaScript中使用指数方法Math.exp()的简介
2015/06/15 Javascript
vue+vue-validator 表单验证功能的实现代码
2017/11/13 Javascript
Vue中keep-alive的两种应用方式
2020/07/15 Javascript
vue Cli 环境删除与重装教程 - 版本文档
2020/09/11 Javascript
Antd下拉选择,自动匹配功能的实现
2020/10/24 Javascript
python多线程抽象编程模型详解
2019/03/20 Python
pyqt5 实现在别的窗口弹出进度条
2019/06/18 Python
python matplotlib库绘制条形图练习题
2019/08/10 Python
python操作docx写入内容,并控制文本的字体颜色
2020/02/13 Python
Django中的模型类设计及展示示例详解
2020/05/29 Python
Python学习工具jupyter notebook安装及用法解析
2020/10/23 Python
CSS3中新增的对文本和字体的设置
2020/02/03 HTML / CSS
PREMIUM-MALL法国:行李、箱包及配件在线
2019/05/30 全球购物
数据库方面面试题
2012/04/22 面试题
中专生职业生涯规划书范文
2014/01/10 职场文书
回门宴新郎答谢词
2014/01/12 职场文书
写给女朋友的检讨书
2014/01/28 职场文书
电子专业求职信
2014/06/19 职场文书
司机岗位职责说明书
2014/07/29 职场文书
中共广东省委常委会党的群众路线教育实践活动整改方案
2014/09/23 职场文书
普通党员个人剖析材料
2014/10/08 职场文书
2015年远程教育工作总结
2015/05/20 职场文书
体育教师教学随笔
2015/08/15 职场文书