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脚本
Nov 26 PHP
PHP下几种删除目录的方法总结
Aug 19 PHP
ThinkPHP php 框架学习笔记
Oct 30 PHP
php smarty模版引擎中变量操作符及使用方法
Dec 11 PHP
php设计模式之命令模式的应用详解
May 21 PHP
提高PHP编程效率的方法
Nov 07 PHP
PHP清除字符串中所有无用标签的方法
Dec 01 PHP
简单了解将WordPress中的工具栏移到底部的小技巧
Dec 31 PHP
PHP生成短网址方法汇总
Jul 12 PHP
Yii2基于Ajax自动获取表单数据的方法
Aug 10 PHP
PHP多进程之pcntl_fork的实例详解
Oct 15 PHP
ThinkPHP实现的rsa非对称加密类示例
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 echo, print, print_r, sprintf, var_dump, var_expor的使用区别
2013/06/20 PHP
php采用curl访问域名返回405 method not allowed提示的解决方法
2014/06/26 PHP
Yii框架数据模型的验证规则rules()被执行的方法
2016/12/02 PHP
jscript之Open an Excel Spreadsheet
2007/06/13 Javascript
javscript对象原型的一些看法
2010/09/19 Javascript
setTimeout()与setInterval()方法区别介绍
2013/12/24 Javascript
js校验表单后提交表单的三种方法总结
2014/02/28 Javascript
jquery的attr方法禁用表单元素禁用输入内容
2014/06/23 Javascript
javascript手工制作悬浮菜单
2015/02/12 Javascript
javascript自定义in_array()函数实现方法
2015/08/03 Javascript
javascript实现保留两位小数的多种方法
2015/12/18 Javascript
详谈js使用in和hasOwnProperty获取对象属性的区别
2017/04/25 Javascript
小程序红包雨的实现示例
2019/02/19 Javascript
koa-router路由参数和前端路由的结合详解
2019/05/19 Javascript
基于vue写一个全局Message组件的实现
2019/08/15 Javascript
Vue中跨域及打包部署到nginx跨域设置方法
2019/08/26 Javascript
JS实现的碰撞检测与周期移动完整示例
2019/09/02 Javascript
解决axios post 后端无法接收数据的问题
2019/10/29 Javascript
vue中keep-alive,include的缓存问题
2019/11/26 Javascript
JS实现的雪花飘落特效示例
2019/12/03 Javascript
python实现矩阵乘法的方法
2015/06/28 Python
Python实现截屏的函数
2015/07/25 Python
Python3多线程爬虫实例讲解代码
2018/01/05 Python
python绘制BA无标度网络示例代码
2019/11/21 Python
Python numpy.zero() 初始化矩阵实例
2019/11/27 Python
django模型动态修改参数,增加 filter 字段的方式
2020/03/16 Python
解决Jupyter NoteBook输出的图表太小看不清问题
2020/04/16 Python
Keras使用ImageNet上预训练的模型方式
2020/05/23 Python
就业表自我评价分享
2014/02/06 职场文书
“学雷锋活动月”总结
2014/03/09 职场文书
超市中秋节促销方案
2014/03/21 职场文书
爱国卫生月活动总结范文
2014/04/25 职场文书
2014党员学习兰辉先进事迹思想汇报
2014/09/17 职场文书
检讨书怎么写
2015/05/07 职场文书
pytorch常用数据类型所占字节数对照表一览
2021/05/17 Python
element tree树形组件回显数据问题解决
2022/08/14 Javascript