欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

PHP实现AES加解密

程序员文章站 2024-03-14 17:13:46
...

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 级别的错误。

 

在使用的时候有几点需要注意:

 

  1. options 参数的选择:options 有2个可选参数OPENSSL_RAW_DATA 和OPENSSL_ZERO_PADDING。选择OPENSSL_ZERO_PADDING参数时,待加密的明文字符串需要填充位数,要求输入数据必须是块大小的精确倍数(AES为16字节),因此必须进行填充。通常的方法是通过PKCS7来填充位数,在解密时也需要删除填充位数。

     

  2. 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;
相关标签: PHP php

上一篇: 关于this的一点心得

下一篇: