PHP实现AES加解密
PHP在7.1版本开始废弃了原来的mcrypt_decrypt() 函数,改为了
openssl_encrypt()和openssl_decrypt()函数。
以下是官方的介绍
openssl_encrypt ( string
$data
, string$method
, string$key
[, int$options
= 0 [, string$iv
= "" [, string&$tag
= NULL [, string$aad
= "" [, int$tag_length
= 16 ]]]]] ) : string
参数说明:
-
data 待加密的明文信息数据。
-
method 密码学方式。openssl_get_cipher_methods() 可获取有效密码方式列表。key key。
-
options options 是以下标记的按位或:OPENSSL_RAW_DATA 、 OPENSSL_ZERO_PADDING。
-
iv 非 NULL 的初始化向量。
-
tag 使用 AEAD 密码模式(GCM 或 CCM)时传引用的验证标签。
-
aad 附加的验证数据。tag_length 验证 tag 的长度。GCM 模式时,它的范围是 4 到 16。
返回值
成功时返回加密后的字符串, 或者在失败时返回 FALSE。
错误返回
method 传入未知算法时,产生 E_WARNING 级别的错误。
iv 传入空字符串时产生 E_WARNING 级别的错误。
在使用的时候有几点需要注意:
-
options 参数的选择:options 有2个可选参数OPENSSL_RAW_DATA 和OPENSSL_ZERO_PADDING。选择OPENSSL_ZERO_PADDING参数时,待加密的明文字符串需要填充位数,要求输入数据必须是块大小的精确倍数(AES为16字节),因此必须进行填充。通常的方法是通过PKCS7来填充位数,在解密时也需要删除填充位数。
-
IV参数必须是16位。
以下是一个PHP代码的示例
$text = 'bnZpc2libGU9JmZp';
$key = 'aaa'; //自定义一个key
$iv = md5($key,true); //通过MD5将iv参数规定为16位
try {
if (function_exists('openssl_encrypt')) {
$encrypted = openssl_encrypt($text, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv);
} else {
$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, base64_decode($text), MCRYPT_MODE_CBC, $iv);
}
}catch (Exception $e) {
var_dump( array(ErrorCode::$DecryptAESError, null));
}
var_dump($encrypted);
// options 选择OPENSSL_RAW_DATA时 这里直接打印加密后的字符串的时候可能会出现乱码,encode一下就好了
// $newParam = base64_encode($encrypted);
var_dump($newParam);
if (function_exists('openssl_decrypt')) {
$decrypted = openssl_decrypt($encrypted, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv);
} else {
$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, base64_decode($encrypted), MCRYPT_MODE_CBC, $iv);
}
var_dump($decrypted);die;
上一篇: 关于this的一点心得