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