PHP string encryption function 'of' encrypts the restore string within the specified time. The timeout cannot be restored

  • 2020-03-31 20:42:47
  • OfStack

This allows us to use this function for many purposes, such as single sign-on token transfers, temporary passwords, and so on
 
/** 
* @param string $string  Original or ciphertext  
* @param string $operation  operation (ENCODE | DECODE),  The default is  DECODE 
* @param string $key  The key  
* @param int $expiry  Ciphertext validity ,  It works when it's encrypted,   unit   Second, 0  For permanent validity  
* @return string  After processing the   The original or   after  base64_encode  Processed ciphertext  
* 
* @example 
* 
* $a = authcode('abc', 'ENCODE', 'key'); 
* $b = authcode($a, 'DECODE', 'key'); // $b(abc) 
* 
* $a = authcode('abc', 'ENCODE', 'key', 3600); 
* $b = authcode('abc', 'DECODE', 'key'); //Within an hour, $b(ABC), otherwise $b is empty
*/ 
function authcode($string, $operation = 'DECODE', $key = '', $expiry = 3600) { 
$ckey_length = 4; 
//The random key length is 0-32;
//Add a random key, can make the ciphertext without any rules, even if the original text and the key are exactly the same, the encryption result will be different each time, increase the crack difficulty.
//The larger the value, the greater the rule of ciphertext change, ciphertext change = 16 to the power of $ckey_length
//When this value is 0, no random key is generated
$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)); 
} 
} 

Related articles: