/**
* $string plain text or cipher text
* $operation encryption ENCODE or decryption DECODE
* $key key
* $expiry key validity period
*/
function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) {
// Dynamic key length, the same plaintext will generate different ciphertext, relying on the dynamic key
// Adding a random key can make the ciphertext irregular, even if the original text and the key are exactly the same, the encryption The results will also be different every time, increasing the difficulty of cracking.
// The larger the value, the greater the ciphertext change pattern. Ciphertext change = 16 to the power of $ckey_length
// When this value is 0, no random key is generated
$ckey_length = 4;
// Key
// $GLOBALS['discuz_auth_key'] You can modify it according to your needs
$key = md5($key ? $key : $GLOBALS[' discuz_auth_key']);
// Key a will participate in encryption and decryption
$keya = md5(substr($key, 0, 16));
// Key b will be used Do data integrity verification
$keyb = md5(substr($key, 16, 16));
// Key c is used to change the generated ciphertext
$keyc = $ckey_length? ($ operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : '';
// Keys involved in the operation
$ cryptkey = $keya.md5($keya.$keyc);
$key_length = strlen($cryptkey);
// Plain text, the first 10 bits are used to save the timestamp, and verify the data validity when decrypting, 10 The 26th bit is used to save $keyb (key b). This key will be used to verify data integrity during decryption
// If it is decoding, it will start from the $ckey_length bit because the ciphertext precedes the $ckey_length bit. Save the dynamic key to ensure correct decryption
$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();
// Generate key book
for($i = 0; $i <= 255; $i++) {
$rndkey[$i] = ord($cryptkey[$i % $key_length]);
}
// Use a fixed algorithm to scramble the key book and increase randomness. It seems very complicated, but in fact It will not increase the strength of the ciphertext
for($j = $i = 0; $i < 256; $i++) {
$j = ($j + $box[$i] + $ rndkey[$i]) % 256;
$tmp = $box[$i];
$box[$i] = $box[$j];
$box[$j] = $ tmp;
}
// Core encryption and decryption part
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] using using XOR with the key from the keybook . ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
}
if($operation == 'DECODE ') {
// substr($result, 0, 10) == 0 Verify data validity
// substr($result, 0, 10) - time() > 0 Verify data validity
// substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16) Verify data integrity
// Verify data validity, please Look at the format of unencrypted plaintext
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 {
} // Save the dynamic key in the ciphertext. This is why the same plaintext can be decrypted after producing different ciphertexts
// Because of encryption The final ciphertext may contain some special characters and may be lost during the copying process, so use base64 encoding
using base64 encoding use using using using ' ’ ’ ’ ‐ ’ ‐ ‐ return $keyc.str_replace('=', '', ′ '', base64_encode($result)); }
$a = www.jb51.net;
$b = authcode($a, "ENCODE", "abc123");
echo $b."
" ;
echo authcode($b, "DECODE", "abc123");?>
http://www.bkjia.com/PHPjc/726030.htmlwww.bkjia.comtruehttp: //www.bkjia.com/PHPjc/726030.htmlTechArticleCopy the code as follows: ?php /*** $string plain text or cipher text * $operation encryption ENCODE or decryption DECODE * $key key * $expiry key validity period*/ function authcode($string, $operat. ..