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 相关文章推荐
Email+URL的判断和自动转换函数
Oct 09 PHP
PHP spl_autoload_register实现自动加载研究
Dec 06 PHP
php 操作数组(合并,拆分,追加,查找,删除等)
Jul 20 PHP
IIS+fastcgi下PHP运行超时问题的解决办法详解
Jun 20 PHP
关于zend studio 出现乱码问题的总结
Jun 23 PHP
php $_SERVER windows系统与linux系统下的区别说明
Feb 14 PHP
php判断页面是否是微信打开的示例(微信打开网页)
Apr 25 PHP
PHP中多维数组的foreach遍历示例
Jun 13 PHP
php准确计算复活节日期的方法
Apr 18 PHP
PHP将英文数字转换为阿拉伯数字实例讲解
Jan 28 PHP
PHP常见字符串操作函数与用法总结
Mar 04 PHP
php 实现银联商务H5支付的示例代码
Oct 12 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
留言板翻页的实现详解
2006/10/09 PHP
解析php做推送服务端实现ios消息推送
2013/07/01 PHP
Codeigniter实现多文件上传并创建多个缩略图
2014/06/12 PHP
php转换颜色为其反色的方法
2015/04/27 PHP
PHP面向对象程序设计内置标准类,普通数据类型转为对象类型示例
2019/06/12 PHP
基于laravel belongsTo使用详解
2019/10/18 PHP
Gambit vs CL BO3 第三场 2.13
2021/03/10 DOTA
jQuery 动态酷效果实现总结
2009/12/27 Javascript
javascript+css 网页每次加载不同样式的实现方法
2009/12/27 Javascript
jQuery延迟加载图片插件Lazy Load使用指南
2015/03/25 Javascript
javascript控制图片播放的实现代码
2020/07/29 Javascript
AngularJs定制样式插入到ueditor中的问题小结
2016/08/01 Javascript
BootStrap中
2016/12/10 Javascript
jQuery基于ajax操作json数据简单示例
2017/01/05 Javascript
Vue.js组件tab实现选项卡切换
2020/03/23 Javascript
d3.js入门教程之数据绑定详解
2017/04/28 Javascript
浅谈JS如何实现真正的对象常量
2017/06/25 Javascript
JavaScript文件的同步和异步加载的实现代码
2017/08/19 Javascript
jQuery+vue.js实现的九宫格拼图游戏完整实例【附源码下载】
2017/09/12 jQuery
详解在vue-cli项目中使用mockjs(请求数据删除数据)
2017/10/23 Javascript
你应该了解的JavaScript Array.map()五种用途小结
2018/11/14 Javascript
vue多层嵌套路由实例分析
2019/03/19 Javascript
Vue双向数据绑定(MVVM)的原理
2020/10/03 Javascript
ant design vue中表格指定格式渲染方式
2020/10/28 Javascript
[43:24]VG vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
Python 获取指定文件夹下的目录和文件的实现
2019/08/30 Python
Python属性和内建属性实例解析
2020/01/14 Python
python如何判断IP地址合法性
2020/04/05 Python
python中Pexpect的工作流程实例讲解
2021/03/02 Python
CSS3的calc()做响应模式布局的实现方法
2017/09/06 HTML / CSS
公司董事长职责
2013/12/12 职场文书
求职者怎样写自荐信
2014/04/13 职场文书
结婚仪式主持词
2015/06/29 职场文书
pytorch中的numel函数用法说明
2021/05/13 Python
详解Oracle数据库中自带的所有表结构(sql代码)
2021/11/20 Oracle
总结三种用 Python 作为小程序后端的方式
2022/05/02 Python