-
-
// Parameter explanation - // $string: plain text or cipher text
- // $operation: DECODE means decryption, others means encryption
- // $key: key
- // $expiry: ciphertext validity period
- function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) {
- // Dynamic key length, the same plaintext will generate different passwords The article relies on dynamic keys
- $ckey_length = 4;
// Key
- $key = md5($key ? $key : $GLOBALS['discuz_auth_key']); p>
// Key a will participate in encryption and decryption
- $keya = md5(substr($key, 0, 16));
- // Key b will be used for 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)) : '';
- // The key 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 during decryption. Bits 10 to 26 are used to save $keyb (key b). This key will be used during decryption. Verify data integrity
- // If decoding, it will start from the $ckey_length bit, because the dynamic key is stored in the $ckey_length bit before the ciphertext 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 seems very complicated, but in fact it does 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] = $tmp;
- // Get the key from the key book, perform XOR, and then convert it into characters
- $result .= chr(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 see 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 {
- return '';
- }
- } else {
- // Save the dynamic key in the ciphertext. This is why the same plaintext can be decrypted after producing different ciphertexts
- // Because the encrypted ciphertext may contain some special characters and may be lost during the copying process, it is encoded with base64
- return $keyc.str_replace('=', '', base64_encode($result));
- }
- } //edit bbs.it-home.org
- ?>> .
Reminder: The ownership of this function belongs to Kangsheng Chuangxiang and cannot be used freely, haha.
-
|