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 相关文章推荐
基于initPHP的框架介绍
Apr 18 PHP
深入PHP异步执行的详解
Jun 03 PHP
ubuntu下编译安装xcache for php5.3 的具体操作步骤
Jun 18 PHP
html静态页面调用php文件的方法
Nov 13 PHP
帝国cms目录结构分享
Jul 06 PHP
PHP文件及文件夹操作之创建、删除、移动、复制
Jul 13 PHP
Yii中srbac权限扩展模块工作原理与用法分析
Jul 14 PHP
php版微信公众平台实现预约提交后发送email的方法
Sep 26 PHP
php正则去除网页中所有的html,js,css,注释的实现方法
Nov 03 PHP
php实现36进制与10进制转换功能示例
Jan 10 PHP
Windows下php+mysql5.7配置教程
May 16 PHP
PHP实现单条sql执行多个数据的insert语句方法
Oct 11 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 Class&amp;Object -- PHP 自排序二叉树的深入解析
2013/06/25 PHP
PHP实现简单数字分页效果
2015/07/26 PHP
Zend Framework教程之Bootstrap类用法概述
2016/03/14 PHP
Yii框架中jquery表单验证插件用法示例
2016/10/18 PHP
PHP实现正则表达式分组捕获操作示例
2018/02/03 PHP
Yii框架连表查询操作示例
2019/09/06 PHP
七个很有意思的PHP函数
2014/05/12 Javascript
Css3制作变形与动画效果
2015/07/24 Javascript
JavaScript实现的CRC32函数示例
2016/11/23 Javascript
微信小程序富文本渲染引擎的详解
2017/09/30 Javascript
微信小程序支付功能 php后台对接完整代码分享
2018/06/12 Javascript
JavaScript 2018 中即将迎来的新功能
2018/09/21 Javascript
Vue将页面导出为图片或者PDF
2020/08/17 Javascript
js通过循环多张图片实现动画效果
2019/12/19 Javascript
Python获取Windows或Linux主机名称通用函数分享
2014/11/22 Python
python3 发送任意文件邮件的实例
2018/01/23 Python
python利用跳板机ssh远程连接redis的方法
2019/02/19 Python
Python将列表数据写入文件(txt, csv,excel)
2019/04/03 Python
将python运行结果保存至本地文件中的示例讲解
2019/07/11 Python
django2笔记之路由path语法的实现
2019/07/17 Python
pandas中read_csv的缺失值处理方式
2019/12/19 Python
Python使用Numpy模块读取文件并绘制图片
2020/05/13 Python
Python Merge函数原理及用法解析
2020/09/16 Python
详解CSS3 用border写 空心三角箭头 (两种写法)
2017/09/29 HTML / CSS
HTML5 canvas 基本语法
2009/08/26 HTML / CSS
美国领先的家居装饰和礼品商店:Kirkland’s
2017/01/30 全球购物
全球烹饪课程的领先预订平台:Cookly
2020/01/28 全球购物
英国名牌男装店:Standout
2021/02/17 全球购物
股权投资意向书
2014/04/01 职场文书
幼儿园家长评语大全
2014/04/16 职场文书
党员批评与自我批评思想汇报
2014/10/08 职场文书
甲乙双方合作协议书
2014/10/13 职场文书
村官2015年度工作总结
2015/10/14 职场文书
CSS3实现的文字弹出特效
2021/04/16 HTML / CSS
吉利入股戴姆勒后smart“长大了”
2022/04/21 数码科技
JAVA springCloud项目搭建流程
2022/05/11 Java/Android