现在php很多加密解密生成的字符串都比较常,比如xxtea把数字1加密都可以生成12位字符串,10000更是高达16位。 如果简单的把产品ID加密生成较短的字符串,xxtea就不太适合的。对于这种简单的,要求不太高的加密解密,下面的函数就可以满足需求了。 经过测试发现,1位生成2位,2生成3位,3位生成4位,4位生成6位,5位生成7位,9位生成12位,还算ok 函数代码如下: if( !function_exists('encrypt') ){ /** * 加密/解密函数 * @param $string 要解密/解密的字符串 * @param int $type 类型类1.产品 2.券 等等,参考app.php * @param bool $operation 加密true/解密false * @return bool|string 返回加密/解密结果 */ function encrypt($string,$type=1,$operation=true){ $key_list = config('encrypt_key_list'); if( !isset($key_list[$type]) ) { return false; }else{ $key=md5($key_list[$type]); } $data = trim($string); if(empty($data)) return ''; $x = 0; $data = $operation ? $data : str_replace('_','+',base64_decode($data)); //加密/解密数据 $len = strlen($data); $l = strlen($key); $char=''; $str=''; if($operation){ //加密 for ($i = 0; $i < $len; $i++) { if ($x == $l) { $x = 0; } $char .= $key{$x}; $x++; } for ($i = 0; $i < $len; $i++) { $str .= chr(ord($data{$i}) + (ord($char{$i})) % 256); } } else { //解密 for ($i = 0; $i < $len; $i++) { if ($x == $l) { $x = 0; } $char .= substr($key, $x, 1); $x++; } for ($i = 0; $i < $len; $i++) { if (ord(substr($data, $i, 1)) < ord(substr($char, $i, 1))) { $str .= chr((ord(substr($data, $i, 1)) + 256) - ord(substr($char, $i, 1))); } else { $str .= chr(ord(substr($data, $i, 1)) - ord(substr($char, $i, 1))); } } } return $operation ? str_replace(['+','='],['_',''],base64_encode($str)) : $str; //返回结果 } } 由于此函数用的thinkphp 5.1 所以 $key_list = config('encrypt_key_list'); 在config/app.php 配置如下 retrun [ //省略很多代码 'encrypt_key_list' => [ 1 => 'gDVPwZr7iPWGISwX', 2 => 'JfKBdyfgfsRhTPXx', ], ]; 如果你用的不是此框架 对应的改成 $key_list = [ 1 => 'gDVPwZr7iPWGISwX', 2 => 'JfKBdyfgfsRhTPXx', ], 当然随你改