现在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’,
],
当然随你改