discuz加密解密函数使用方法和中文注释


Posted in PHP onJanuary 21, 2014
<?php
/**
 * $string 明文或密文
 * $operation 加密ENCODE或解密DECODE
 * $key 密钥
 * $expiry 密钥有效期
 */ 
function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) {
    // 动态密匙长度,相同的明文会生成不同密文就是依靠动态密匙
    // 加入随机密钥,可以令密文无任何规律,即便是原文和密钥完全相同,加密结果也会每次不同,增大破解难度。
    // 取值越大,密文变动规律越大,密文变化 = 16 的 $ckey_length 次方
    // 当此值为 0 时,则不产生随机密钥
    $ckey_length = 4;    // 密匙
    // $GLOBALS['discuz_auth_key'] 这里可以根据自己的需要修改
    $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));
    }
}


$a = 3water.com;
$b = authcode($a, "ENCODE", "abc123");
echo $b."<br/>";
echo authcode($b, "DECODE", "abc123");
?>
PHP 相关文章推荐
十天学会php(3)
Oct 09 PHP
PHP设计模式之装饰者模式
Feb 29 PHP
完美解决PHP中的Cannot modify header information 问题
Aug 12 PHP
人脸识别测颜值、测脸龄、测相似度微信接口
Apr 07 PHP
PHP模板引擎Smarty之配置文件在模板变量中的使用方法示例
Apr 11 PHP
php mysql实现mysql_select_db选择数据库
Dec 30 PHP
php使用gd2绘制基本图形示例(直线、圆、正方形)
Feb 15 PHP
在 Laravel 中 “规范” 的开发短信验证码发送功能
Oct 26 PHP
关于php支持的协议与封装协议总结(推荐)
Nov 17 PHP
Laravel框架分页实现方法分析
Jun 12 PHP
PHP后期静态绑定之self::限制实例分析
Dec 21 PHP
laravel 根据不同组织加载不同视图的实现
Oct 14 PHP
php加密算法之实现可逆加密算法和解密分享
Jan 21 #PHP
检查用户名是否已在mysql中存在的php写法
Jan 20 #PHP
php设计模式之单例模式使用示例
Jan 20 #PHP
php实现图形显示Ip地址的代码及注释
Jan 20 #PHP
php判断手机访问还是电脑访问示例分享
Jan 20 #PHP
利用中国天气预报接口实现简单天气预报
Jan 20 #PHP
php日历制作代码分享
Jan 20 #PHP
You might like
php设计模式 Command(命令模式)
2011/06/26 PHP
laravel实现分页样式替换示例代码(增加首、尾页)
2017/09/22 PHP
PHP利用百度ai实现文本和图片审核
2019/05/08 PHP
浅谈laravel-admin form中的数据,在提交后,保存前,获取并进行编辑
2019/10/21 PHP
JS获取IUSR_机器名和IWAM_机器名帐号的密码
2006/12/06 Javascript
15个款优秀的 jQuery 图片特效插件推荐
2011/11/21 Javascript
防止xss和sql注入:JS特殊字符过滤正则
2013/04/18 Javascript
Node.js(安装,启动,测试)
2014/06/09 Javascript
Angular2中Bootstrap界面库ng-bootstrap详解
2016/10/18 Javascript
使用JS和canvas实现gif动图的停止和播放代码
2017/09/01 Javascript
为什么我们要做三份 Webpack 配置文件
2017/09/18 Javascript
微信小程序-form表单提交代码实例
2019/04/29 Javascript
JavaScript中AOP的实现与应用
2019/05/06 Javascript
Vue移动端用淘宝弹性布局lib-flexible插件做适配的方法
2020/05/26 Javascript
JavaScript实现筛选数组
2021/03/02 Javascript
[01:38]完美世界DOTA2联赛PWL S3 集锦第四期
2020/12/21 DOTA
从零学python系列之数据处理编程实例(一)
2014/05/22 Python
python之virtualenv的简单使用方法(必看篇)
2017/11/25 Python
django上传图片并生成缩略图方法示例
2017/12/11 Python
django js实现部分页面刷新的示例代码
2018/05/28 Python
python3读取csv和xlsx文件的实例
2018/06/22 Python
python retrying模块的使用方法详解
2019/09/25 Python
Django框架之中间件MiddleWare的实现
2019/12/30 Python
HTML5 标准将把互联网视频扔回到黑暗时代
2010/02/10 HTML / CSS
韩国流行时尚女装网站:Dintchina(中文)
2018/07/19 全球购物
德国自然时尚和有机产品购物网站:Waschbär
2019/05/29 全球购物
西雅图电动自行车公司:Rad Power Bikes
2020/02/02 全球购物
英语翻译系毕业生求职信
2013/09/29 职场文书
初三学习计划书范文
2014/04/30 职场文书
公司募捐倡议书
2014/05/14 职场文书
新疆民族团结演讲稿
2014/08/27 职场文书
2014年党务公开工作总结
2014/12/09 职场文书
2014年个人工作总结模板
2014/12/15 职场文书
2016年助残日旅游活动总结
2016/04/01 职场文书
七年级之家长会发言稿范文
2019/09/04 职场文书
Nginx HTTP跳转至HTTPS
2022/05/15 Servers