PHP加密解密函数authcode的具体使用方法

2025-3-26 / 0 评论 / 3 阅读

<?php

/**

  \* 字符串加密以及解密函数

  \*

  \* @param string \$string 原文或者密文

  \* @param string \$operation 操作(ENCODE | DECODE), 默认为 DECODE

  \* @param string \$key 密钥

  \* @param int \$expiry 密文有效期, 加密时候有效, 单位 秒,0 为永久有效

  \* @return string 处理后的 原文或者 经过 base64\_encode 处理后的密文

  \*

  \* @example

  \*

  \*     \$a = authcode('abc', 'ENCODE', 'key');

  \*     \$b = authcode(\$a, 'DECODE', 'key'); // \$b(abc)

  \*

  \*     \$a = authcode('abc', 'ENCODE', 'key', 3600);

  \*     \$b = authcode('abc', 'DECODE', 'key'); // 在一个小时内,\$b(abc),否则 \$b 为空

  \*/

function authcode(\$string, \$operation = 'DECODE', \$key = '', \$expiry = 0) {

\$ckey_length = 4;

//getglobal('authkey') 方法是获取全局的秘钥函数

\$key = md5(\$key != '' ? \$key : getglobal('authkey'));

\$keya = md5(substr(\$key, 0, 16));

\$keyb = md5(substr(\$key, 16, 16));

\$keyc = \$ckey_length ? (\$operation == 'DECODE' ? substr(\$string, 0, \$ckey_length): substr(md5(microtime()), -\$ckey_length)) : '';

\$cryptkey = \$keya.md5(\$keya.\$keyc);

\$key_length = strlen(\$cryptkey);

\$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') {

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 {

return \$keyc.str_replace('=', '', base64_encode(\$result));

}

}

?>

<?php

\$username='testuser';

\$password='123456';

\$uid=1;

//1.设置登录cookie

setcookie('auth',authcode("\$username\t\$password\t\$uid", 'ENCODE','miyaokey123'), time() + 60 * 60 * 24, "/", ".phpff.com");

//2.退出 删除cookie

setcookie('auth', '', -86400 * 365, '/', '.phpff.com');

//3.验证登录

if(isset(\$_COOKIE['auth'])){

\$auth = explode("\t", authcode(\$_COOKIE['auth'], 'DECODE','miyaokey123'));

//获取 COOKIE 中的用户名、密码、uid

@list(\$username,\$password, \$uid) = \$auth;

if(\$uid) {

//登录成功

}

}

?>