当前位置:首页 > 叨叨念念 > PHP里实现AES的加密解密功能

PHP里实现AES的加密解密功能

叨叨念念 / 星之宇 / 2021-8-29 22:37 / 浏览:2099 / 评论:0

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 条评论

    • 昵称
    • 邮箱
    • 网址