本资源提供修复后的经典PHP加密解密函数Authcode()代码版本,适用于需要安全传输和存储敏感信息的开发者。
在PHP编程中,加密解密是确保数据安全的重要手段,特别是在传输敏感信息或存储用户数据时。`authcode()`函数就是一个经典的PHP加密解密函数,它源于著名的Discuz! 论坛系统,用于对字符串进行加密和解密操作。这个函数允许设置一个密钥(key)和一个过期时间,增加了数据的安全性和时效性。
原版的`authcode()`函数的一个问题是,它可能会生成如`+`、`` 和 `&` 等特殊字符,在通过URL传递时容易被自动转义,导致解密失败。为了解决这个问题,开发者进行了优化,将这些特殊字符替换为其他字符(例如 `[a]`, `[b]`, `[c]`),并在解码过程中再将其换回原始的特殊字符。
下面是修复版 `authcode()` 函数的代码:
```php
function authcode($string, $operation = DECODE, $key = , $expiry = 0) {
if ($operation == DECODE) {
// 解码时替换字符
$string = str_replace([a], +, $string);
$string = str_replace([b], &, $string);
$string = str_replace([c], =, $string);
}
// 密钥相关处理
$ckey_length = 4;
if ($key == ) {
$key = livcmsencryption;
}
$keya = md5(substr($key, 0, 16));
$keyb = md5(substr($key, 16, 16));
// 随机串
if ($ckey_length) {
if ($operation == DECODE) {
$keyc = substr($string, 0, $ckey_length);
$string = substr($string, $ckey_length);
} else {
$keyc = substr(md5(microtime()), -$ckey_length);
}
} else {
$keyc = ;
}
// 加密密钥构造
$cryptkey = $keya . md5($keya . $keyc);
// 字符串处理
if ($operation == DECODE) {
$string = base64_decode(substr($string, 0, -strlen($ckey_length)));
} else {
$string = sprintf(%010d, $expiry ? $expiry + time() : 0) . substr(md5($string . $keyb), 0, 16) . $string;
}
// XOR运算加密
$result = ;
for ($i = 0; $i <= 255; ++$i) {
$box[$i] = $i;
}
for ($j = $k = 0; $k < 256; ++$k) {
$j = ($j + $box[$k] + ord($cryptkey[$k % strlen($cryptkey)])) % 256;
list($box[$k], $box[$j]) = array($box[$j], $box[$k]);
}
for ($a = $j = $i = 0; $i < strlen($string); ++$i) {
$a = ($a + 1) % 256;
$j = ($j + $box[$a]) % 256;
list($box[$a], $box[$j]) = array($box[$j], $box[$a]);
// XOR运算
$result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
}
if ($operation == DECODE) {
// 检查有效期和校验MD5
if ((substr($result, 0, 10) != 0 || substr($result, 10, 19) < time()) && substr(md5(substr($result,26).$keyb), 0, 16) != substr($result, 10, 16)) {
return ;
}
// 返回解码后的字符串
return substr($result, 26);
} else {
$ustr = $ckey_length ? ($keyc . str_replace(=, , base64_encode($result))) : base64_encode($result);
// 编码时替换字符
$ustr = str_replace(+, [a], $ustr);
$ustr = str_replace(&, [b], $ustr);
$ustr = str_replace(=, [c], $ustr);
return $ustr;
}
}
```
这个函数的运作机制主要包括以下几个步骤:
1.