博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Dz经典加密解密方法。
阅读量:7189 次
发布时间:2019-06-29

本文共 2877 字,大约阅读时间需要 9 分钟。

一个非常经典的加密方法,DZ所有产品都在使用这个方法进行加密。

注释非常详细,大家可以研究研究,但切不可拿来直接用于商业用途啊。

因为dz对改方法持有版权。

 
1: 
2:     // $string: 明文 或 密文
3:     // $operation:DECODE表示解密,其它表示加密
4:     // $key: 密匙
5:     // $expiry:密文有效期
6:      authcode($string, $operation = 'DECODE', $ = '', $expiry = 0) {
7:         // 动态密匙长度,相同的明文会生成不同密文就是依靠动态密匙
8:         $ckey_length = 4;
9:
10:         // 密匙
11:         $ = md5($ ? $ : $GLOBALS['discuz_auth_key']);
12:
13:         // 密匙a会参与加解密
14:         $keya = md5(($, 0, 16));
15:         // 密匙b会用来做数据完整性验证
16:         $keyb = md5(($, 16, 16));
17:         // 密匙c用于变化生成的密文
18:         $keyc = $ckey_length ? ($operation == 'DECODE' ? ($string, 0, $ckey_length): (md5(()), -$ckey_length)) : '';
19:         // 参与运算的密匙
20:         $cryptkey = $keya.md5($keya.$keyc);
21:         $key_length = ($cryptkey);
22:         // 明文,前10位用来保存时间戳,解密时验证数据有效性,10到26位用来保存$keyb(密匙b),解密时会通过这个密匙验证数据完整性
23:         // 如果是解码的话,会从第$ckey_length位开始,因为密文前$ckey_length位保存 动态密匙,以保证解密正确
24:         $string = $operation == 'DECODE' ? base64_decode(($string, $ckey_length)) : ('%010d', $expiry ? $expiry + () : 0).(md5($string.$keyb), 0, 16).$string;
25:         $string_length = ($string);
26:         $result = '';
27:         $box = (0, 255);
28:         $rndkey = ();
29:         // 产生密匙簿
30:         ($i = 0; $i <= 255; $i++) {
31:             $rndkey[$i] = ($cryptkey[$i % $key_length]);
32:         }
33:         // 用固定的算法,打乱密匙簿,增加随机性,好像很复杂,实际上对并不会增加密文的强度
34:         ($j = $i = 0; $i < 256; $i++) {
35:             $j = ($j + $box[$i] + $rndkey[$i]) % 256;
36:             $tmp = $box[$i];
37:             $box[$i] = $box[$j];
38:             $box[$j] = $tmp;
39:         }
40:         // 核心加解密部分
41:         ($a = $j = $i = 0; $i < $string_length; $i++) {
42:             $a = ($a + 1) % 256;
43:             $j = ($j + $box[$a]) % 256;
44:             $tmp = $box[$a];
45:             $box[$a] = $box[$j];
46:             $box[$j] = $tmp;
47:             // 从密匙簿得出密匙进行异或,再转成字符
48:             $result .= (($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
49:         }
50:         ($operation == 'DECODE') {
51:             // substr($result, 0, 10) == 0 验证数据有效性
52:             // substr($result, 0, 10) - time() > 0 验证数据有效性
53:             // substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16) 验证数据完整性
54:             // 验证数据有效性,请看未加密明文的格式
55:             ((($result, 0, 10) == 0 || ($result, 0, 10) - () > 0) && ($result, 10, 16) == (md5(($result, 26).$keyb), 0, 16)) {
56:                  ($result, 26);
57:             }  {
58:                  '';
59:             }
60:         }  {
61:             // 把动态密匙保存在密文里,这也是为什么同样的明文,生产不同密文后能解密的原因
62:             // 因为加密后的密文可能是一些特殊字符,复制过程可能会丢失,所以用base64编码
63:              $keyc.('=', '', base64_encode($result));
64:         }
65:     }
本文转自 OH51888 51CTO博客,原文链接:http://blog.51cto.com/rozbo/1285297,如需转载请自行联系原作者
你可能感兴趣的文章
js中call与apply用法
查看>>
HTML入门
查看>>
IIS 7.5 配置伪静态
查看>>
Oracle 11G搭建单实例Active DataGuard
查看>>
整理的Android开发资源
查看>>
测试,请忽略
查看>>
打印html页面出现空白段落问题
查看>>
我的友情链接
查看>>
用按位或解决问题
查看>>
内网地址的网段
查看>>
克隆虚拟机、Linux机器相互登录
查看>>
oracle中使用decode进行数据的列转换为行的试验
查看>>
快速构建Windows 8风格应用23-App Bar概述及使用规范
查看>>
Saltstack系列(二) Saltstack分组
查看>>
.NET的XMPP开发包 MatriX
查看>>
JQuery easyui Datagrid 分页事件
查看>>
MPLS 转发原理
查看>>
android 手机型号,版本号,
查看>>
家庭宽带之IPv6网络测试
查看>>
让宏哥告诉你什么叫做 OO -- 放在博客比较有价值
查看>>