php加密解密函数authcode的用法详细解析
来源:互联网 发布:java用scanner取绝对值 编辑:程序博客网 时间:2024/05/16 08:04
核心提示:康盛的 authcode 函数可以说对中国的PHP界作出了重大贡献。包括康盛自己的产品,以及大部分中国使用PHP的公司都用这个函数进行加密,authcode 是使用异或运算进行加密和解密。
康盛的 authcode 函数可以说对中国的PHP界作出了重大贡献。包括康盛自己的产品,以及大部分中国使用PHP的公司都用这个函数进行加密,authcode 是使用异或运算进行加密和解密。
原理如下,假如:
加密
明文:1010 1001
密匙:1110 0011
密文:0100 1010
得出密文0100 1010,解密之需和密匙异或下就可以了
解密
密文:0100 1010
密匙:1110 0011
明文:1010 1001
并没有什么高深的算法,密匙重要性很高,所以,关键在于怎么生成密匙。
那我们一起看下康盛的authcode怎么做的吧
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
// 参数解释
// $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
));
}
}
0 0
- php加密解密函数authcode的用法详细解析
- php加密解密函数authcode的用法详细解析
- php加密解密函数authcode的用法详细解析
- discuz 经典php加密解密函数 authcode 解析
- discuz 经典php加密解密函数 authcode 解析
- discuz 经典php加密解密函数 authcode 解析
- discuz 经典php加密解密函数 authcode 解析
- discuz 经典php加密解密函数 authcode 解析
- discuz 经典php加密解密函数 authcode 解析
- 加密与解密函数authcode解析
- Discuz 的加密与解密函数authcode
- php authcode 混淆加密和解密
- 解析discuz authcode(加,解密函数)
- Discuz!开发之核心加密解密函数authcode()介绍
- JS authcode 加密解密算法
- php的加密解密函数
- PHP 实现 注册等的邮箱验证 (一)—— 加密函数 authcode
- PHP 加密解密函数
- Python -- 数字
- Atitit.跨语言 文件夹与文件的io操作集合 草案
- JAX-WS Web 服务开发调用和数据传输分析
- How Broswers Work<二>渲染引擎-script解析(上)
- MongoDB学习笔记(四)使用Java进行实时监控与数据收集(空间使用量、连接数)
- php加密解密函数authcode的用法详细解析
- 虚拟机Ubuntu上安装sonarqube
- 跨域请求补充
- Flume入门
- TOMCAT 配置
- Lab颜色空间及其应用
- Android应用开发异常整理
- 腾讯广点通到底是做什么的
- 【任我行】Deb一体包安装步骤