PHP
PHP7.2 openssl代替mcrypt加解密
PHP7.2 openssl代替mcrypt aes-128-cbc加解密
最近接到一个需求,因为线上环境使用的是PHP7.2版本,但是demo使用的mcrypt加解密已经在PHP7后被淘汰了,所以需要对代码进行改造,转化成适用PHP7.2版本,网上查询相关资料看到使用openssl来代替mcrypt进行加解密,然后根据demo改成适用PHP7.2版本的代码,在这里跟大家分享。
这里是mcrypt加解密代码:
/**
* 加密方法
* @param string $str
* @return string
*/
function encrypt($str, $screct_key)
{
//AES, 128 模式加密数据 CBC
$screct_key = base64_decode($screct_key);
$str = trim($str);
$str = addPKCS7Padding($str);
//设置全0的IV
$iv_size = @mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$iv = str_repeat("\0", $iv_size);
$encrypt_str = @mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $screct_key, $str, MCRYPT_MODE_CBC, $iv);
return base64_encode($encrypt_str);
}
/**
* 解密方法
* @param $str
* @param $screct_key
* @return string
*/
function decrypt($str, $screct_key)
{
//AES, 128 模式加密数据 CBC
$str = base64_decode($str);
$screct_key = base64_decode($screct_key);
//设置全0的IV
$iv_size = @mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$iv = str_repeat("\0", $iv_size);
echo $iv."\n";
$decrypt_str = @mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $screct_key, $str, MCRYPT_MODE_CBC, $iv);
$decrypt_str = stripPKSC7Padding($decrypt_str);
return $decrypt_str;
}
/**
* 填充算法
* @param string $source
* @return string
*/
function addPKCS7Padding($source)
{
$source = trim($source);
$block = @mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$pad = $block - (strlen($source) % $block);
if ($pad <= $block) {
$char = chr($pad);
$source .= str_repeat($char, $pad);
}
return $source;
}
/**
* 移去填充算法
* @param string $source
* @return string
*/
function stripPKSC7Padding($source)
{
$char = substr($source, -1);
$num = ord($char);
if ($num == 62) return $source;
$source = substr($source, 0, -$num);
return $source;
}这里是修改后,适配PHP7.2的代码
/**
* 解密方法
* @param $str
* @param $key
* @return string
*/
function desDecrypt($str, $key)
{
//AES, 128 模式加密数据 CBC
$str = base64_decode($str);
$key = base64_decode($key);
//设置全0的IV
$iv_size = openssl_cipher_iv_length('aes-256-cbc');
$iv = str_repeat("\0", $iv_size);
//解密
$decrypt_str = openssl_decrypt($str, 'aes-256-cbc', $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $iv);
//返回
return $decrypt_str;
}
/**
* 加密方法
* @param $str
* @param $key
* @return string
*/
function desEncrypt($str, $key)
{
//AES, 128 模式加密数据 CBC
$key = base64_decode($key);
$str = addPKCS7Padding($str);
//设置全0的IV
$iv_size = openssl_cipher_iv_length('aes-256-cbc');
$iv = str_repeat("\0", $iv_size);
//加密
$decrypt_str = openssl_encrypt($str, 'aes-256-cbc', $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $iv);
//返回
return base64_encode($decrypt_str);
}
/**
* 填充算法
* @param string $source
* @return string
*/
function addPKCS7Padding($source)
{
$source = trim($source);
$block = openssl_cipher_iv_length('aes-256-cbc');
$pad = $block - (strlen($source) % $block);
if ($pad <= $block) {
$char = chr($pad);
$source .= str_repeat($char, $pad);
}
return $source;
}经过试验,最终是成功的加解密。
0条评论