本文共 5373 字,大约阅读时间需要 17 分钟。
普通hash函数如md5、sha1、base64等都是不可逆函数。虽然我们利用php可以利用这些函数写出可逆函数来。但是跨语言时这类可逆函数非常难搞定。所以这时尽量使用AES DES RC4 Rabbit TripleDes这些方法。
1 /** 2 * 加密 3 * @param string $string 要加密或解密的字符串 4 * @param string $operation 加密 '' 解密 DECODE 5 * @param string $key 密钥,加密解密时保持一致 6 * @param int $expiry 有效时长,单位:秒 7 * @return string 8 */ 9 function encrypt_code($string, $expiry = 0, $key = 'abc12345') { 10 $ckey_length = 7; 11 $key = md5($key ? $key : UC_KEY); //加密解密时这个是不变的 12 $keya = md5(substr($key, 0, 16)); //加密解密时这个是不变的 13 $keyb = md5(substr($key, 16, 16)); //加密解密时这个是不变的 14 $keyc = $ckey_length ? substr(md5(microtime()), -$ckey_length) : ''; 15 $cryptkey = $keya . md5($keya . $keyc); //64 16 $key_length = strlen($cryptkey); //64 17 18 $string =sprintf('%010d', $expiry ? $expiry + time() : 0) . substr(md5($string . $keyb), 0, 16) . $string; 19 $string_length = strlen($string); 20 21 $result = ''; 22 $box = range(0, 255); 23 24 $rndkey = array(); 25 for ($i = 0; $i <= 255; $i++) { //字母表 64位后重复 数列 范围为48~122 26 $rndkey[$i] = ord($cryptkey[$i % $key_length]); 27 } 28 29 for ($j = $i = 0; $i < 256; $i++) { //这里是一个打乱算法 30 $j = ($j + $box[$i] + $rndkey[$i]) % 256; 31 $tmp = $box[$i]; 32 $box[$i] = $box[$j]; 33 $box[$j] = $tmp; 34 } 35 for ($a = $j = $i = 0; $i < $string_length; $i++) { 36 $result .= chr(ord($string[$i]) ^ ($box[$i])); 37 38 } 39 $str = $keyc . str_replace('=', '', urlsafe_b64encode($result)); 40 // $str =htmlentities($str, ENT_QUOTES, "UTF-8"); // curl 访问出错 41 return $str ; 42 } 43 44 45 /** 46 * 解密 47 * @param string $string 要加密或解密的字符串 48 * @param string $operation 加密 '' 解密 DECODE 49 * @param string $key 密钥,加密解密时保持一致 50 * @param int $expiry 有效时长,单位:秒 51 * @return string 52 */ 53 function encrypt_decode($string, $expiry = 0,$key = 'abc12345') { 54 // $string = html_entity_decode($string, ENT_QUOTES, "UTF-8") ; //curl 访问出错 55 $ckey_length = 7; 56 $key = md5($key ? $key : UC_KEY); //加密解密时这个是不变的 57 $keya = md5(substr($key, 0, 16)); //加密解密时这个是不变的 58 $keyb = md5(substr($key, 16, 16)); //加密解密时这个是不变的 59 60 $keyc = $ckey_length ? substr($string, 0, $ckey_length) : ''; 61 62 $cryptkey = $keya . md5($keya . $keyc); //64 63 $key_length = strlen($cryptkey); //64 64 $string = urlsafe_b64decode(substr($string, $ckey_length)) ; 65 $string_length = strlen($string); 66 $result = ''; 67 $box = range(0, 255); 68 69 $rndkey = array(); 70 for ($i = 0; $i <= 255; $i++) { //字母表 64位后重复 数列 范围为48~122 71 $rndkey[$i] = ord($cryptkey[$i % $key_length]); 72 } 73 for ($j = $i = 0; $i < 256; $i++) { //这里是一个打乱算法 74 $j = ($j + $box[$i] + $rndkey[$i]) % 256; 75 76 $tmp = $box[$i]; 77 $box[$i] = $box[$j]; 78 $box[$j] = $tmp; 79 } 80 for ($a = $j = $i = 0; $i < $string_length; $i++) { 81 $result .= chr(ord($string[$i]) ^ ($box[$i])); 82 } 83 if ((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26) . $keyb), 0, 16)) { 84 return substr($result, 26); 85 } else { 86 return false; 87 } 88 89 }
最简单的往往是最好用的。
1 //加密函数 2 function lock_url($txt,$key='www.zhuoyuexiazai.com'){ 3 $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-=+"; 4 $nh = rand(0,64); 5 $ch = $chars[$nh]; 6 $mdKey = md5($key.$ch); 7 $mdKey = substr($mdKey,$nh%8, $nh%8+7); 8 $txt = base64_encode($txt); 9 $tmp = ''; 10 $i=0;$j=0;$k = 0; 11 for ($i=0; $i
1
测试方法:
1 "; 8 echo $decrypt.""; 9 ?>
1 299 ? gzcompress($result) : $result)) : substr($result, 20, -20); 30 } 31 32 ?>
1 "; 25 /** 26 *解密函数 27 *$input 要被解密的字符串 28 *$key 密钥 29 */ 30 $input1 = do_mencrypt($input, $key); 31 function do_mdecrypt($input1, $key) 32 { 33 $input1 = base64_decode(trim($input1)); 34 $td = mcrypt_module_open('des', '', 'ecb', ''); 35 //$key = substr(md5($key), 0, 4); 36 $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND); 37 mcrypt_generic_init($td, $key, $iv); 38 $decrypted_data = mdecrypt_generic($td, $input1); 39 mcrypt_generic_deinit($td); 40 mcrypt_module_close($td); 41 return trim(base64_decode($decrypted_data)); 42 } 43 print_r(do_mdecrypt($input1, $key)); 44 45 #2.rand key: "CWSTOAYD":生成随机密匙,统一用字母或者数字,长度为8. 46 function randomkeys($length) 47 { 48 $pattern = '1234567890'; 49 for($i=0;$i<$length;$i++) 50 { 51 @$key .= $pattern{ rand(0,9)}; //生成php随机数 52 } 53 return $key; 54 } 55 ?>
如果你感觉这些内容对你有帮助,那就收藏他吧。
转载地址:http://hgexa.baihongyu.com/