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
Dec 13 PHP
编译php 5.2.14+fpm+memcached(具体操作详解)
Jun 18 PHP
php中读写文件与读写数据库的效率比较分享
Oct 19 PHP
ThinkPHP3.2.3数据库设置新特性
Mar 05 PHP
PHP中的switch语句的用法实例详解
Oct 21 PHP
php实现阳历阴历互转的方法
Oct 28 PHP
详解PHP的Yii框架的运行机制及其路由功能
Mar 17 PHP
CI框架使用composer安装的依赖包步骤与方法分析
Nov 21 PHP
thinkphp实现把数据库中的列的值存到下拉框中的方法
Jan 20 PHP
php写一个函数,实现扫描并打印出自定目录下(含子目录)所有jpg文件名
May 26 PHP
PHP实现的最大正向匹配算法示例
Dec 19 PHP
Laravel框架路由和控制器的绑定操作方法
Jun 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
如何在PHP程序中防止盗链
2008/04/09 PHP
将数组写入txt文件 var_export
2009/04/21 PHP
PHP动态编译出现Cannot find autoconf的解决方法
2014/11/05 PHP
php导出中文内容excel文件类实例
2015/07/06 PHP
PHP验证码生成原理和实现
2016/01/24 PHP
PHP从二维数组得到N层分类树的实现代码
2016/10/11 PHP
PHP+Ajax实现的无刷新分页功能详解【附demo源码下载】
2017/07/03 PHP
laravel 输出最后执行sql 附:whereIn的使用方法
2019/10/10 PHP
JQuery与Ajax常用代码实现对比
2009/10/03 Javascript
ajax 缓存 问题 requestheader
2010/08/01 Javascript
深入探密Javascript数组方法
2015/01/08 Javascript
JS实现Fisheye效果动感放大菜单代码
2015/10/21 Javascript
JavaScript编写九九乘法表(两种任选)
2017/02/04 Javascript
详解Vue.js基于$.ajax获取数据并与组件的data绑定
2017/05/26 Javascript
js实现图片上传预览原理分析
2017/07/13 Javascript
详解React项目的服务端渲染改造(koa2+webpack3.11)
2018/03/19 Javascript
JS返回页面时自动回滚到历史浏览位置
2018/09/26 Javascript
VUE解决微信签名及SPA微信invalid signature问题(完美处理)
2019/03/29 Javascript
JavaScript面向对象程序设计中对象的定义和继承详解
2019/07/29 Javascript
Vue+penlayers实现多边形绘制及展示
2020/12/24 Vue.js
详解Python验证码识别
2016/01/25 Python
python3中set(集合)的语法总结分享
2017/03/24 Python
Python 窗体(tkinter)按钮 位置实例
2019/06/13 Python
完美解决pyinstaller打包报错找不到依赖pypiwin32或pywin32-ctypes的错误
2020/04/01 Python
Pytorch实现将模型的所有参数的梯度清0
2020/06/24 Python
python3 re返回形式总结
2020/11/20 Python
HTML5 表单验证失败的提示语问题
2017/07/13 HTML / CSS
英国健康和美容技术产品购物网站:CurrentBody
2019/07/17 全球购物
俄罗斯EPL钻石珠宝店:ЭПЛ
2019/10/22 全球购物
简短的公司员工自我评价分享
2013/11/13 职场文书
博士研究生自我鉴定范文
2013/12/04 职场文书
《小蝌蚪找妈妈》教学反思
2014/02/21 职场文书
2014年环境整治工作总结
2014/12/10 职场文书
驳回起诉民事裁定书
2015/05/19 职场文书
2016公务员年度考核评语
2015/12/01 职场文书
vue+spring boot实现校验码功能
2021/05/27 Vue.js