首页 > 代码库 > 几种类型加解密
几种类型加解密
1 <?php 2 /** 3 * $name authcode加密 4 * @param string $string 明文或密文 5 * @param string $operation DECODE表示解密,其它表示加密; 6 * @param string $key 密匙 7 * @param int $expiry 密文有效期 8 * @return string 9 */ 10 function authcode($string, $operation = ‘DECODE‘, $key = ‘‘, $expiry = 0) 11 { 12 // 动态密匙长度,相同的明文会生成不同密文就是依靠动态密匙 13 $ckey_length = 4; 14 15 // 密匙 16 $key = md5($key ? $key : $GLOBALS[‘discuz_auth_key‘]); 17 18 // 密匙a会参与加解密 19 $keya = md5(substr($key, 0, 16)); 20 // 密匙b会用来做数据完整性验证 21 $keyb = md5(substr($key, 16, 16)); 22 // 密匙c用于变化生成的密文 23 $keyc = $ckey_length ? ($operation == ‘DECODE‘ ? substr($string, 0, $ckey_length) : 24 substr(md5(microtime()), -$ckey_length)) : ‘‘; 25 // 参与运算的密匙 26 $cryptkey = $keya . md5($keya . $keyc); 27 $key_length = strlen($cryptkey); 28 // 明文,前10位用来保存时间戳,解密时验证数据有效性,10到26位用来保存$keyb(密匙b), 29 //解密时会通过这个密匙验证数据完整性 30 // 如果是解码的话,会从第$ckey_length位开始,因为密文前$ckey_length位保存 动态密匙,以保证解密正确 31 $string = $operation == ‘DECODE‘ ? base64_decode(substr($string, $ckey_length)) : 32 sprintf(‘%010d‘, $expiry ? $expiry + time() : 0) . substr(md5($string . $keyb), 0, 16) . $string; 33 $string_length = strlen($string); 34 $result = ‘‘; 35 $box = range(0, 255); 36 $rndkey = array(); 37 // 产生密匙簿 38 for ($i = 0; $i <= 255; $i++) { 39 $rndkey[$i] = ord($cryptkey[$i % $key_length]); 40 } 41 // 用固定的算法,打乱密匙簿,增加随机性,好像很复杂,实际上对并不会增加密文的强度 42 for ($j = $i = 0; $i < 256; $i++) { 43 $j = ($j + $box[$i] + $rndkey[$i]) % 256; 44 $tmp = $box[$i]; 45 $box[$i] = $box[$j]; 46 $box[$j] = $tmp; 47 } 48 // 核心加解密部分 49 for ($a = $j = $i = 0; $i < $string_length; $i++) { 50 $a = ($a + 1) % 256; 51 $j = ($j + $box[$a]) % 256; 52 $tmp = $box[$a]; 53 $box[$a] = $box[$j]; 54 $box[$j] = $tmp; 55 // 从密匙簿得出密匙进行异或,再转成字符 56 $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256])); 57 } 58 if ($operation == ‘DECODE‘) { 59 // 验证数据有效性,请看未加密明文的格式 60 if ((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26) . $keyb), 0, 16)) { 61 return substr($result, 26); 62 } else { 63 return ‘‘; 64 } 65 } else { 66 // 把动态密匙保存在密文里,这也是为什么同样的明文,生产不同密文后能解密的原因 67 // 因为加密后的密文可能是一些特殊字符,复制过程可能会丢失,所以用base64编码 68 return $keyc . str_replace(‘=‘, ‘‘, base64_encode($result)); 69 } 70 } 71 $str = ‘abcdef‘; 72 $key = ‘www.test.com‘; 73 $authcode = authcode($str,‘ENCODE‘,$key,0); //加密 74 echo $authcode; 75 echo authcode($authcode,‘DECODE‘,$key,0); //解密 76 77 //encrypt加解密 78 /** 79 * @param string $string 明文或密文 80 * @param string $operation 判断是加密还是解密,E表示加密,D表示解密 81 * @param string $key 密匙 82 * @return mixed|string 83 */ 84 function encrypt($string, $operation, $key = ‘‘) 85 { 86 $key = md5($key); 87 $key_length = strlen($key); 88 $string = $operation == ‘D‘ ? base64_decode($string) : substr(md5($string . $key), 0, 8) . $string; 89 $string_length = strlen($string); 90 $rndkey = $box = array(); 91 $result = ‘‘; 92 for ($i = 0; $i <= 255; $i++) { 93 $rndkey[$i] = ord($key[$i % $key_length]); 94 $box[$i] = $i; 95 } 96 for ($j = $i = 0; $i < 256; $i++) { 97 $j = ($j + $box[$i] + $rndkey[$i]) % 256; 98 $tmp = $box[$i]; 99 $box[$i] = $box[$j]; 100 $box[$j] = $tmp; 101 } 102 for ($a = $j = $i = 0; $i < $string_length; $i++) { 103 $a = ($a + 1) % 256; 104 $j = ($j + $box[$a]) % 256; 105 $tmp = $box[$a]; 106 $box[$a] = $box[$j]; 107 $box[$j] = $tmp; 108 $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256])); 109 } 110 if ($operation == ‘D‘) { 111 if (substr($result, 0, 8) == substr(md5(substr($result, 8) . $key), 0, 8)) { 112 return substr($result, 8); 113 } else { 114 return ‘‘; 115 } 116 } else { 117 return str_replace(‘=‘, ‘‘, base64_encode($result)); 118 } 119 120 } 121 $str = ‘abc‘; 122 $key = ‘www.test.com‘; 123 $token = encrypt($str, ‘E‘, $key); 124 echo ‘加密:‘.encrypt($str, ‘E‘, $key); 125 echo ‘解密:‘.encrypt($str, ‘D‘, $key); 126 127 /** 128 * 用DES算法加密字符串 129 * @param string $string 数组可以转化成json格式的字符串 130 * @param string $key 131 * @return string 132 */ 133 function des_encrypt($string, $key) 134 { 135 $size = mcrypt_get_block_size(‘des‘, ‘ecb‘); 136 $string = mb_convert_encoding($string, ‘GBK‘, ‘UTF-8‘); 137 $pad = $size - (strlen($string) % $size); 138 $string = $string . str_repeat(chr($pad), $pad); 139 $td = mcrypt_module_open(‘des‘, ‘‘, ‘ecb‘, ‘‘); 140 $iv = @mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_DEV_URANDOM); 141 @mcrypt_generic_init($td, $key, $iv); 142 $data = mcrypt_generic($td, $string); 143 mcrypt_generic_deinit($td); 144 mcrypt_module_close($td); 145 $data = base64url_encode($data); 146 return $data; 147 } 148 149 /** 150 * 用DES算法解密字符串 151 * @param string $string 152 * @param string $key 153 * @return mixed 154 */ 155 function des_decrypt($string, $key) 156 { 157 $string = base64url_decode($string); 158 $td = mcrypt_module_open(‘des‘, ‘‘, ‘ecb‘, ‘‘); 159 $iv = @mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_DEV_URANDOM); 160 //$ks = mcrypt_enc_get_key_size($td); 161 @mcrypt_generic_init($td, $key, $iv); 162 $decrypted = mdecrypt_generic($td, $string); 163 mcrypt_generic_deinit($td); 164 mcrypt_module_close($td); 165 $pad = ord($decrypted{strlen($decrypted) - 1}); 166 if ($pad > strlen($decrypted)) { 167 return false; 168 } 169 if (strspn($decrypted, chr($pad), strlen($decrypted) - $pad) != $pad) { 170 return false; 171 } 172 $result = substr($decrypted, 0, -1 * $pad); 173 $result = mb_convert_encoding($result, ‘UTF-8‘, ‘GBK‘); 174 return $result; 175 } 176 function base64url_encode($data) { 177 return rtrim(strtr(base64_encode($data), ‘+/‘, ‘-_‘), ‘=‘); 178 } 179 180 function base64url_decode($data) { 181 return base64_decode(str_pad(strtr($data, ‘-_‘, ‘+/‘), strlen($data) % 4, ‘=‘, STR_PAD_RIGHT)); 182 }
几种类型加解密
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。