PHP7之后实现AEES加解密功能换成了openssl扩展,PHP之间的加解密相对来说变的简单了,但是对于要和JAVA等其他语言对接的时候就要非常注意了。
openssl_encrypt介绍
openssl_encrypt( string $data, string $method, string $key, int $options = 0, string $iv = "", string &$tag = null, string $aad = "", int $tag_length = 16 ): string|false
参数说明:
data:待加密的明文信息数据。
method:密码学方式。openssl_get_cipher_methods() 可获取有效密码方式列表。
key:密钥。若 key比预期长度短,将静默用 NUL 填充; 若比预期长度更长,将静默截断。
options:是以下标记的按位或: OPENSSL_RAW_DATA 、 OPENSSL_ZERO_PADDING、OPENSSL_NO_PADDING。
0 : 默认值,PKCS#7进行填充, 返回的数据经过 base64 编码;
1 : OPENSSL_RAW_DATA, PKCS#7进行填充, 但返回的结果未经过 base64 编码;
2 : OPENSSL_ZERO_PADDING, openssl不推荐chr(0)填充的方式, 需要开发者自行填充, 返回的结果经过 base64 编码;
3 : OPENSSL_NO_PADDING, 需要开发者自行填充, 返回的结果不经过base64编码;
iv:非 NULL 的初始化向量。
tag:使用 AEAD 密码模式(GCM 或 CCM)时传引用的验证标签。
aad:附加的验证数据。
tag_length:验证 tag 的长度。GCM 模式时,它的范围是 4 到 16。
openssl_decrypt介绍
openssl_decrypt( string $data, string $method, string $key, int $options = 0, string $iv = "", string $tag = "", string $aad = "" ): string
参数说明:
data:将被解密的密文。
method:加密算法,使用openssl_get_cipher_methods()函数获取可用的加密算法列表。
key:密钥。
options:是以下标记的按位或: OPENSSL_RAW_DATA 、 OPENSSL_ZERO_PADDING、OPENSSL_NO_PADDING。
0 : 默认值,PKCS#7进行填充, 返回的数据经过 base64 编码;
1 : OPENSSL_RAW_DATA, PKCS#7进行填充, 但返回的结果未经过 base64 编码;
2 : OPENSSL_ZERO_PADDING, openssl不推荐chr(0)填充的方式, 需要开发者自行填充, 返回的结果经过 base64 编码;
3 : OPENSSL_NO_PADDING, 需要开发者自行填充, 返回的结果不经过base64编码;
iv:非空的初始化向量。
tag:AEAD密码模式中的身份验证标签。 如果是错误的,验证失败,函数返回false.
aad:额外的认证数据。
加解密函数事例
在java加密选择无填充模式如果不足128字节的话,调用方法会自动填充至128字节再进行加密,但php跟java中没有统一的填充标准,所以openssl_encrypt并没有默认填充,openssl_encrypt加密对数据长度有要求,从而导致加密失败,所以需要手动填充。
//加密 function aes_encrypt($str,$key){ $str_padded = $str; if (strlen($str_padded) % 16) { $str_padded = str_pad($str_padded,strlen($str_padded) + 16 - strlen($str_padded) % 16, "\0"); } return bin2hex(openssl_encrypt($str_padded, 'AES-128-CBC',md5($key),OPENSSL_NO_PADDING,substr(md5($key), 0, 16))); } //解密 function aes_decrypt($str,$key){ $str = preg_replace( '/[^a-f0-9 ]/i', '', $str); $str = strlen($str) % 2 ? pack("H*", $str) : hex2bin($str); return openssl_decrypt($str, 'AES-128-CBC', md5($key),OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING,substr(md5($key), 0, 16)); }
目前有 0 条评论