标签:数据有效性 base64 运算 UNC font 原因 固定 bsp 有效期
方法一:
1 /** 2 3 * @param $string 要加密/解密的字符串 4 5 * @param string $operation 类型,ENCODE 加密;DECODE 解密 6 7 * @param string $key 密匙 8 9 * @param int $expiry 有效期 10 11 * @return string 12 13 */ 14 15 function authcode($string, $operation = ‘DECODE‘, $key = ‘encrypt‘, $expiry = 0) 16 17 { 18 19 // 动态密匙长度,相同的明文会生成不同密文就是依靠动态密匙 20 21 $ckey_length = 4; 22 23 // 密匙 24 25 $key = md5($key ? $key : $GLOBALS[‘discuz_auth_key‘]); 26 27 // 密匙a会参与加解密 28 29 $keya = md5(substr($key, 0, 16)); 30 31 // 密匙b会用来做数据完整性验证 32 33 $keyb = md5(substr($key, 16, 16)); 34 35 // 密匙c用于变化生成的密文 36 37 $keyc = $ckey_length ? ($operation == ‘DECODE‘ ? substr($string, 0, $ckey_length) : 38 39 substr(md5(microtime()), -$ckey_length)) : ‘‘; 40 41 // 参与运算的密匙 42 43 $cryptkey = $keya . md5($keya . $keyc); 44 45 $key_length = strlen($cryptkey); 46 47 // 明文,前10位用来保存时间戳,解密时验证数据有效性,10到26位用来保存$keyb(密匙b), 48 49 //解密时会通过这个密匙验证数据完整性 50 51 // 如果是解码的话,会从第$ckey_length位开始,因为密文前$ckey_length位保存 动态密匙,以保证解密正确 52 53 $string = $operation == ‘DECODE‘ ? base64_decode(substr($string, $ckey_length)) : 54 55 sprintf(‘%010d‘, $expiry ? $expiry + time() : 0) . substr(md5($string . $keyb), 0, 16) . $string; 56 57 $string_length = strlen($string); 58 59 $result = ‘‘; 60 61 $box = range(0, 255); 62 63 $rndkey = array(); 64 65 // 产生密匙簿 66 67 for ($i = 0; $i <= 255; $i++) { 68 69 $rndkey[$i] = ord($cryptkey[$i % $key_length]); 70 71 } 72 73 // 用固定的算法,打乱密匙簿,增加随机性,好像很复杂,实际上对并不会增加密文的强度 74 75 for ($j = $i = 0; $i < 256; $i++) { 76 77 $j = ($j + $box[$i] + $rndkey[$i]) % 256; 78 79 $tmp = $box[$i]; 80 81 $box[$i] = $box[$j]; 82 83 $box[$j] = $tmp; 84 85 } 86 87 // 核心加解密部分 88 89 for ($a = $j = $i = 0; $i < $string_length; $i++) { 90 91 $a = ($a + 1) % 256; 92 93 $j = ($j + $box[$a]) % 256; 94 95 $tmp = $box[$a]; 96 97 $box[$a] = $box[$j]; 98 99 $box[$j] = $tmp; 100 101 // 从密匙簿得出密匙进行异或,再转成字符 102 103 $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256])); 104 105 } 106 107 if ($operation == ‘DECODE‘) { 108 109 // 验证数据有效性,请看未加密明文的格式 110 111 if ((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && 112 113 substr($result, 10, 16) == substr(md5(substr($result, 26) . $keyb), 0, 16) 114 115 ) { 116 117 return substr($result, 26); 118 119 } else { 120 121 return ‘‘; 122 123 } 124 125 } else { 126 127 // 把动态密匙保存在密文里,这也是为什么同样的明文,生产不同密文后能解密的原因 128 129 // 因为加密后的密文可能是一些特殊字符,复制过程可能会丢失,所以用base64编码 130 131 return $keyc . str_replace(‘=‘, ‘‘, base64_encode($result)); 132 133 } 134 135 }
使用:
1 $string = ‘加密字符串‘; 2 3 // 加密 4 5 $encode = authcode($string, ‘ENCODE‘); 6 7 echo $encode . ‘</br>‘; // a2f4bSYyUrTum1nAAA9X9BrC4Z3DZazcSa4eLcvDoCnmYc1LTdvtqS4aCds 8 9 // 解密 10 11 $decode = authcode($encode, ‘DECODE‘); 12 13 echo $decode; // 加密字符串
方法二:
1 /** 2 3 * @param $string 要加密/解密的字符串 4 5 * @param $operation 类型,E 加密;D 解密 6 7 * @param string $key 密钥 8 9 * @return mixed|string 10 11 */ 12 13 function encrypt($string, $operation, $key = ‘encrypt‘) 14 15 { 16 17 $key = md5($key); 18 19 $key_length = strlen($key); 20 21 $string = $operation == ‘D‘ ? base64_decode($string) : substr(md5($string . $key), 0, 8) . $string; 22 23 $string_length = strlen($string); 24 25 $rndkey = $box = array(); 26 27 $result = ‘‘; 28 29 for ($i = 0; $i <= 255; $i++) { 30 31 $rndkey[$i] = ord($key[$i % $key_length]); 32 33 $box[$i] = $i; 34 35 } 36 37 for ($j = $i = 0; $i < 256; $i++) { 38 39 $j = ($j + $box[$i] + $rndkey[$i]) % 256; 40 41 $tmp = $box[$i]; 42 43 $box[$i] = $box[$j]; 44 45 $box[$j] = $tmp; 46 47 } 48 49 for ($a = $j = $i = 0; $i < $string_length; $i++) { 50 51 $a = ($a + 1) % 256; 52 53 $j = ($j + $box[$a]) % 256; 54 55 $tmp = $box[$a]; 56 57 $box[$a] = $box[$j]; 58 59 $box[$j] = $tmp; 60 61 $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256])); 62 63 } 64 65 if ($operation == ‘D‘) { 66 67 if (substr($result, 0, 8) == substr(md5(substr($result, 8) . $key), 0, 8)) { 68 69 return substr($result, 8); 70 71 } else { 72 73 return ‘‘; 74 75 } 76 77 } else { 78 79 return str_replace(‘=‘, ‘‘, base64_encode($result)); 80 81 } 82 83 }
使用:
1 $string = ‘加密字符串‘; 2 3 // 加密 4 5 $encode = encrypt($string, ‘E‘); 6 7 echo $encode . ‘</br>‘; // 0Jzym5UzkRKH726U7Pyt7ixzLz9YEEA 8 9 // 解密 10 11 $decode = encrypt($encode, ‘D‘); 12 13 echo $decode; // 加密字符串
方法三:
1 /** 2 3 * @param $data 要加密的字符串 4 5 * @param $key 密钥 6 7 * @return string 8 9 */ 10 11 function encrypt($data, $key = ‘encrypt‘) 12 13 { 14 15 $key = md5($key); 16 17 $x = 0; 18 19 $len = strlen($data); 20 21 $l = strlen($key); 22 23 $char = ‘‘; 24 25 for ($i = 0; $i < $len; $i++) { 26 27 if ($x == $l) { 28 29 $x = 0; 30 31 } 32 33 $char .= $key{$x}; 34 35 $x++; 36 37 } 38 39 $str = ‘‘; 40 41 for ($i = 0; $i < $len; $i++) { 42 43 $str .= chr(ord($data{$i}) + (ord($char{$i})) % 256); 44 45 } 46 47 return base64_encode($str); 48 49 } 50 51 52 53 54 55 /** 56 57 * @param $data 要解密的字符串 58 59 * @param $key 密钥 60 61 * @return string 62 63 */ 64 65 function decrypt($data, $key = ‘encrypt‘) 66 67 { 68 69 $key = md5($key); 70 71 $x = 0; 72 73 $data = base64_decode($data); 74 75 $len = strlen($data); 76 77 $l = strlen($key); 78 79 $char = ‘‘; 80 81 for ($i = 0; $i < $len; $i++) { 82 83 if ($x == $l) { 84 85 $x = 0; 86 87 } 88 89 $char .= substr($key, $x, 1); 90 91 $x++; 92 93 } 94 95 $str = ‘‘; 96 97 for ($i = 0; $i < $len; $i++) { 98 99 if (ord(substr($data, $i, 1)) < ord(substr($char, $i, 1))) { 100 101 $str .= chr((ord(substr($data, $i, 1)) + 256) - ord(substr($char, $i, 1))); 102 103 } else { 104 105 $str .= chr(ord(substr($data, $i, 1)) - ord(substr($char, $i, 1))); 106 107 } 108 109 } 110 111 return $str; 112 113 }
使用:
1 $string = ‘加密字符串‘; 2 3 // 加密 4 5 $encode = encrypt($string); 6 7 echo $encode . ‘</br>‘; // Gr0DHeHrRw7KGBLcSOzj 8 9 // 解密 10 11 $decode = decrypt($encode); 12 13 echo $decode; // 加密字符串
标签:数据有效性 base64 运算 UNC font 原因 固定 bsp 有效期
原文地址:https://www.cnblogs.com/sgm4231/p/9773658.html