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 flush类输出缓冲剖析
Oct 19 PHP
php生成短网址示例
May 05 PHP
PHP编程中的常见漏洞和代码实例
Aug 06 PHP
php返回json数据函数实例
Oct 09 PHP
php输入数据统一类实例
Feb 23 PHP
PHP 使用 Imagick 裁切/生成缩略图/添加水印自动检测和处理 GIF
Feb 19 PHP
制作个性化的WordPress登陆界面的实例教程
May 21 PHP
PHP后期静态绑定之self::限制实例分析
Dec 21 PHP
ThinkPHP中图片按比例切割的代码实例
Mar 08 PHP
tp5 实现列表数据根据状态排序
Oct 18 PHP
laravel框架使用FormRequest进行表单验证,验证异常返回JSON操作示例
Feb 18 PHP
php变量与字符串的增删改查操作示例
May 07 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调用VC编写的COM组件实例
2014/03/29 PHP
php使用gettimeofday函数返回当前时间并存放在关联数组里
2015/03/19 PHP
PHP实现RTX发送消息提醒的实例代码
2017/01/03 PHP
关于用Jquery的height()、width()计算动态插入的IMG标签的宽高的问题
2010/12/08 Javascript
Prototype源码浅析 String部分(二)
2012/01/16 Javascript
window.open关于浏览器拦截问题分析及解决方法
2013/02/05 Javascript
jquery提示效果实例分析
2014/11/25 Javascript
javascript实现 百度翻译 可折叠的分享按钮列表
2015/03/12 Javascript
在jQuery中处理XML数据的大致方法
2015/08/14 Javascript
基于JavaScript如何实现ajax调用后台定义的方法
2015/12/29 Javascript
jQuery与Ajax以及序列化
2016/02/01 Javascript
基于MVC5和Bootstrap的jQuery TreeView树形控件(二)之数据支持json字符串、list集合
2016/08/11 Javascript
微信小程序 wxapp视图容器 view详解
2016/10/31 Javascript
原生javascript实现读写CSS样式的方法详解
2017/02/20 Javascript
vue store之状态管理模式的详细介绍
2019/06/13 Javascript
Jquery异步上传文件代码实例
2019/11/13 jQuery
vue组件中节流函数的失效的原因和解决方法
2020/12/02 Vue.js
Python request设置HTTPS代理代码解析
2018/02/12 Python
python调用虹软2.0第三版的具体使用
2019/02/22 Python
Django models filter筛选条件详解
2020/03/16 Python
有趣的Python图片制作之如何用QQ好友头像拼接出里昂
2020/04/22 Python
selenium切换标签页解决get超时问题的完整代码
2020/08/30 Python
学生如何注册Pycharm专业版以及pycharm的安装
2020/09/24 Python
Scrapy+Selenium自动获取cookie爬取网易云音乐个人喜爱歌单
2021/02/01 Python
HTML5 本地存储和内容按需加载的思路和方法
2011/04/07 HTML / CSS
Hammitt官网:设计师手袋
2020/05/23 全球购物
Collection和Collections的区别
2016/05/02 面试题
名词解释WEB SERVICE,SOAP,UDDI,WSDL,JAXP,JAXM;JSWDL开发包的介绍。
2012/10/27 面试题
警察思想汇报
2014/01/04 职场文书
六查六看剖析材料
2014/02/15 职场文书
《富饶的西沙群岛》教学反思
2014/04/09 职场文书
2014年班组长工作总结
2014/11/20 职场文书
商务宴请邀请函范文
2015/02/02 职场文书
茶楼服务员岗位职责
2015/02/09 职场文书
2016年小学圣诞节活动总结
2016/03/31 职场文书
浅谈MySQL user权限表
2021/06/18 MySQL