目录

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

目录

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/**
 *
 * @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