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 相关文章推荐
人尽可用的Windows技巧小贴士之下篇
Mar 22 PHP
谨慎使用PHP的引用原因分析
Sep 06 PHP
PHP超级全局变量数组小结
Oct 04 PHP
php对数组排序的简单实例
Dec 25 PHP
浅谈php和.net的区别
Sep 28 PHP
PHP中mysql_field_type()函数用法
Nov 24 PHP
php验证码的制作思路和实现方法
Nov 12 PHP
PHP程序中使用adodb连接不同数据库的代码实例
Dec 19 PHP
PHP 实现人民币小写转换成大写的方法及大小写转换函数
Nov 17 PHP
php递归函数怎么用才有效
Feb 24 PHP
thinkphp5框架API token身份验证功能示例
May 21 PHP
数据结构之利用PHP实现二分搜索树
Oct 25 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中检查PHP文件是否有语法错误的方法
2009/12/23 PHP
PHP合并数组+与array_merge的区别分析
2010/08/01 PHP
php递归法读取目录及文件的方法
2015/01/30 PHP
JS启动应用程序的一个简单例子
2008/05/11 Javascript
模拟jQuery ajax服务器端与客户端通信的代码
2011/03/28 Javascript
javascript学习笔记(四) Number 数字类型
2012/06/19 Javascript
js模拟hashtable的简单实例
2014/03/06 Javascript
JS实现从表格中动态删除指定行的方法
2015/03/31 Javascript
简介JavaScript中的italics()方法的使用
2015/06/08 Javascript
Jquery全选与反选点击执行一次的解决方案
2015/08/14 Javascript
Javascript使用uploadify来实现多文件上传
2016/11/16 Javascript
Bootstrap CSS布局之列表
2016/12/15 Javascript
JS 在数组指定位置插入/删除数据的方法
2017/01/12 Javascript
Bootstrap模态框使用详解
2017/02/15 Javascript
基于JavaScript实现类名的添加与移除
2017/04/23 Javascript
Js自定义多选框效果的实例代码
2017/07/05 Javascript
js基于FileSaver.js 浏览器导出Excel文件的示例
2017/08/15 Javascript
简述ES6新增关键字let与var的区别
2019/08/23 Javascript
ant design vue中日期选择框混合时间选择器的用法说明
2020/10/27 Javascript
[34:39]Secret vs VG 2018国际邀请赛淘汰赛BO3 第二场 8.23
2018/08/24 DOTA
[05:09]DOTA2-DPC中国联赛2月22日Recap集锦
2021/03/11 DOTA
python网络编程学习笔记(二):socket建立网络客户端
2014/06/09 Python
python3判断url链接是否为404的方法
2018/08/10 Python
Python中的取模运算方法
2018/11/10 Python
python生成带有表格的图片实例
2019/02/03 Python
Python scrapy爬取小说代码案例详解
2020/07/09 Python
CSS3制作Dropdown下拉菜单的方法
2015/07/18 HTML / CSS
HTML5中form如何关闭自动完成功能的方法
2018/07/02 HTML / CSS
Lookfantastic瑞典:英国知名美妆购物网站
2018/04/06 全球购物
三星英国官网:Samsung英国
2018/09/25 全球购物
德国亚马逊官方网站:Amazon.de
2020/11/15 全球购物
大学本科毕业生求职简历的自我评价
2013/10/09 职场文书
房地产经营管理专业自荐信
2014/09/02 职场文书
大学生职业生涯十年规划书范文
2014/09/17 职场文书
党员评议自我评价
2015/03/03 职场文书
清洁工个人工作总结
2015/03/05 职场文书