关于PHP7 AES-256-CBC +PKCS5填充对称加密

PHP
简介个人博客,用来做什么?我刚开始就把它当做一个我吐槽心情的地方,也就相当于一个网络记事本,写上一些关于自己生活工作中的小情小事,也会放上一些照片,音乐。每天工作回家后就能访问自己的网站,一边听着音乐,一边写写文章,回想之前踩过的坑。

最近要给一个APP提供一些接口,之前给的接口都是给微信端或者PC端使用的,问了下APP的开发人员,大部分都是用对称加密做数据保护,所以写了下相关的方法。
其中PHP7.2之后,弃用了mcrypt_encrypt方法,所以下面提供的是PHP7的对称加密写法。

/**
 *
 * @param string $string 需要加密的字符串
 * @param string $key 密钥
 * @param string $iv 偏移量
 * @return string
 */
public static function encrypt($string, $key, $iv)
{
    //$en_data = openssl_encrypt($string, "aes-256-cbc", $key, OPENSSL_RAW_DATA, $iv);
    return bin2hex(base64_decode(openssl_encrypt($string, 'AES-256-CBC', $key, 0, $iv)));
}


/**
 * @param string $string 需要解密的字符串
 * @param string $key 密钥
 * @param string $iv 偏移量
 * @return string
 */
public static function decrypt($string, $key, $iv)
{
    //$decrypted = openssl_decrypt(pack("H*",   $string), "aes-256-cbc", $key, OPENSSL_RAW_DATA, $iv);
    return openssl_decrypt(base64_decode(hex2bin($string)), 'AES-256-CBC', $key, 0, $iv);
    return $decrypted;
}


注意

1、与128位的相比,AES-256-CBC的key要求32位,偏移量iv要求16位。
2、openssl_decrypt第四个参数表示填充方式,如果填OPENSSL_RAW_DATA,表示用PKCS7做填充的,对接的APP用的是PKCS5,所以该参数我填的是0
3、PHP7中,openssl_encrypt默认返回的是base64编码,APP端当时要求的是返回16进制的,所以要base64解码,然后在用bin2hex转16进制
4、这个是一个测试链接,可以校验下加密解密是否正确:https://tool.lmeee.com/jiami/aes

Top