IT技术博客大学习 共学习 共进步

具有时效性的PHP字符串加密解密函数

排头兵-互联网开发实践 2010-05-22 13:04:30 浏览 4,102 次

范围:单点登录传递,临时密码,原创在这里
最近, 从discuz里面发现了一个很牛的加密解密函数。

此函数的厉害之处在于可以在指定时间内加密还原字符串,超时无法还原

这样我们就可以拿此函数来做很多用途了,比如:单点登录的token加密传输啦,临时密码啦等等

 
以下是代码片段:
< ?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 = 3600) {
 $ckey_length = 4;
 // 随机密钥长度 取值 0-32;
 // 加入随机密钥,可以令密文无任何规律,即便是原文和密钥完全相同,加密结果也会每次不同,增大破解难度。
 // 取值越大,密文变动规律越大,密文变化 = 16 的 $ckey_length 次方
 // 当此值为 0 时,则不产生随机密钥
 
 $key = md5($key ? $key : EABAX::getAppInf(’KEY’));
 $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));
 }
 
}

建议继续学习

  1. 代理的加密部分 (阅读 8,245)
  2. 网址加密(URL加密)(RC4、PHP、密钥长度可变) (阅读 8,001)
  3. 使用bcompiler对PHP文件进行加密 (阅读 5,383)
  4. 在浏览器中加密Cookie (阅读 5,383)
  5. 使用系统命令实现文件的压缩与加密 (阅读 5,185)
  6. 公钥私钥加密解密数字证书数字签名详解 (阅读 5,124)
  7. 加密你的shell (阅读 4,845)
  8. 可逆的加密方法(Mcrypt Encryption Functions) (阅读 4,725)
  9. 跨越千年的RSA算法 (阅读 4,184)
  10. 如何“加密”你的email地址 (阅读 4,164)