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 页面编码声明方法详解(header或meta)
Mar 12 PHP
PHP输出时间差函数代码
Jan 28 PHP
php生成扇形比例图实例
Nov 06 PHP
四种php中webservice实现的简单架构方法及实例
Feb 03 PHP
PHP多文件上传类实例
Mar 07 PHP
php实现的数字验证码及数字运算验证码
Jul 30 PHP
详细解读PHP的Yii框架中登陆功能的实现
Aug 21 PHP
PHP的AES加密算法完整实例
Jul 20 PHP
php+resumablejs实现的分块上传 断点续传功能示例
Apr 18 PHP
thinkphp5 migrate数据库迁移工具
Feb 20 PHP
php获取目录下所有文件及目录(多种方法)(推荐)
May 14 PHP
详解Laravel服务容器的优势
May 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操作sqlserver关于时间日期读取的小小见解
2009/11/29 PHP
PHP中for与foreach的区别分析
2011/03/09 PHP
destoon实现调用热门关键字的方法
2014/07/15 PHP
关于php几种字符串连接的效率比较(详解)
2017/02/22 PHP
利用php生成验证码
2017/02/23 PHP
Yii 实现数据加密和解密
2021/03/09 PHP
JavaScript插入动态样式实现代码
2012/02/22 Javascript
jQuery表格插件datatables用法详解
2020/11/23 Javascript
Javascript动画效果(4)
2016/10/11 Javascript
javascript iframe跨域详解
2016/10/26 Javascript
vuejs开发组件分享之H5图片上传、压缩及拍照旋转的问题处理
2017/03/06 Javascript
vue.js组件之间传递数据的方法
2017/07/10 Javascript
layui点击导航栏刷新tab页的示例代码
2018/08/14 Javascript
vue中axios请求的封装实例代码
2019/03/23 Javascript
详解服务端预渲染之Nuxt(介绍篇)
2019/04/07 Javascript
微信小程序事件流原理解析
2019/11/27 Javascript
详解Python中映射类型(字典)操作符的概念和使用
2015/08/19 Python
python编程开发之textwrap文本样式处理技巧
2015/11/13 Python
详解Python中contextlib上下文管理模块的用法
2016/06/28 Python
Python使用pylab库实现画线功能的方法详解
2017/06/08 Python
Python Selenium 之关闭窗口close与quit的方法
2019/02/13 Python
啥是佩奇?使用Python自动绘画小猪佩奇的代码实例
2019/02/20 Python
windows下python虚拟环境virtualenv安装和使用详解
2019/07/16 Python
python中图像通道分离与合并实例
2020/01/17 Python
Python web框架(django,flask)实现mysql数据库读写分离的示例
2020/11/18 Python
CSS3实现时间轴效果
2016/07/11 HTML / CSS
HTML5移动开发图片压缩上传功能
2016/11/09 HTML / CSS
什么造成了Java里面的异常
2016/04/24 面试题
大学生个人实习的自我评价
2014/02/15 职场文书
棉花姑娘教学反思
2014/02/15 职场文书
优秀护士获奖感言
2014/02/20 职场文书
市场营销专业大学生职业生涯规划文
2014/03/06 职场文书
2014年作风建设工作总结
2014/10/29 职场文书
2014离婚协议书范文(3篇)
2014/11/29 职场文书
银行文明优质服务培训心得体会
2016/01/09 职场文书
python munch库的使用解析
2021/05/25 Python