两个 PHP 可逆加密函数
第一个
这是我自己写的一个简单的PHP可逆加密函数
function rehiy_authcode1($str, $opt = 'encode', $key = 'rehiy') {
$result = '';
$self = __FUNCTION__;
if($opt == 'mcrypt') {
$key = md5($key);
$key_length = strlen($key);
$str_length = strlen($str);
for($i = $m = 0; $i < $str_length; $i++, $m++) {
$m = $m == $key_length ? 0 : $m;
$result .= $str[$i] ^ $key[$m];
}
} elseif($opt == 'encode') {
$rnd = md5(mt_rand().$key);
$rnd_length = strlen($rnd);
$str_length = strlen($str);
for($i = $m = 0;$i < $str_length; $i++, $m++) {
$m = $m == $rnd_length ? 0 : $m;
$result .= $rnd[$m].($str[$i] ^ $rnd[$m]);
}
$result = base64_encode($self($result, 'mcrypt', $key));
$result = str_replace('==', '', $result);
$result = str_replace('+', '*', $result);
} elseif($opt == 'decode') {
$str = str_replace('*', '+', $str);
$str = $self(base64_decode($str), 'mcrypt', $key);
$str_length = strlen($str);
for($i = 0; $i < $str_length; $i++) {
$md5 = $str[$i];
$result .= $str[++$i] ^ $md5;
}
}
return $result;
}
第二个
这是我根据Discux!X的函数改写的一个较为复杂的PHP可逆加密函数
function rehiy_authcode2($str, $opt = 'encode', $key = 'rehiy', $expiry = 0, $length = 4) {
//define some key
$key = md5(defined(AUTH_KEY) ? AUTH_KEY : $key);
$keya = $length > 0 ? substr($opt == 'encode' ? md5(microtime()) : $str, 0, $length) : '';
$keyb = md5(substr($key, 0, 16)).md5($key.$keya);
$keyc = md5(substr($key, 16, 16).$keya.$keyb);
//
set $rnd
$rnd = array();
for($i = 0, $j = strlen($keyb); $i < 256; $i++) {
$rnd[$i] = ord($keyb[$i%$j]);
}
//set $box
$box = range(0, 255);
for($j = $i = 0; $i < 256; $i++) {
$j = ($j + $box[$i] + $rnd[$i]) % 256;
list($box[$i], $box[$j]) = array($box[$j], $box[$i]);
}
//get $result
$result = '';
$expiry = $expiry ? $expiry + time() : 0;
$str = $opt == 'encode' ? sprintf('%010d', $expiry).substr(md5($str.$keyc), 0, 16).$str : base64_decode(substr($str, $length));
for($a = $i = $j = 0, $l = strlen($str); $i < $l; $i++) {
$a = ($a + 1) % 256;
$j = ($j + $box[$a]) % 256;
list($box[$a], $box[$j]) = array($box[$j], $box[$a]);
$result .= chr(ord($str[$i]) ^ ($box[($box[$a]+$box[$j]) % 256]));
}
//return $str
if($opt == 'encode') {
return $keya.str_replace('=', '', base64_encode($result));
}
else {
$str = substr($result, 26);
$expiry = substr($result, 0, 10);
if(($expiry == 0 || $expiry > time()) && substr($result, 10, 16) == substr(md5($str.$keyc), 0, 16)) {
return $str;
}
else return '';
}
}