无法使用openssl

时间:2018-04-13 14:49:31

标签: php encryption openssl aes

我正在尝试解密第三方资源提供的数据。

Openssl无法解密数据错误:

error:0606508A:digital envelope routines:EVP_DecryptFinal_ex:data not multiple of block length

我尝试过在线解密,但它有效,这里是link

代码示例:

    $result = openssl_decrypt(
        $bin,
        'AES-256-CBC',
        hex2bin($this->key),
        OPENSSL_ZERO_PADDING,
        hex2bin($this->iv)
    );

    if (!$result) {
        while ($msg = openssl_error_string())
        {
            echo "ERROR: " . $msg;
        }
    }

数据:

Input:673826A18BAA1F18F70E89523F8CCA7F
Key:1313131313131313131313131313131313131313131313131313131313131313
IV:00000000000000000000000000000000

解密与零填充一起使用,根据我的理解,它不应该添加任何PKCS填充。

输入长度为16字节,这是AES(128位)的块大小

系统 - Windows 10 OpenSSL 1.0.2k 2017年1月26日 PHP 7.1.1

我无法弄清楚错误在哪里。请帮忙。

更新1

在控制台中收到相同的错误:

openssl aes-256-cbc -base64 -in .\in -out .\out -K 1313131313131313131313131313131313131313131313131313131313131313 -iv 00000000000000000000000000000000 -nopad

    bad decrypt
2820:error:0607F08A:digital envelope routines:EVP_EncryptFinal_ex:data not multiple of block length:evp_enc.c:412:

数据是16个字节:

>>> strlen(base64_decode('ZzgmoYuqHxj3DolSP4zKfw=='));
=> 16

1 个答案:

答案 0 :(得分:1)

从以下地址更改您的旗帜:

OPENSSL_ZERO_PADDING

为:

OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING

Based on documents,如果未指定OPENSSL_RAW_DATA,则输入应为Base64编码。代码应该是这样的:

$result = openssl_decrypt(
        $bin,
        'AES-256-CBC',
        hex2bin($this->$key),
        OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING,
        hex2bin($this->$iv)
    );

    if (!$result) {
        while ($msg = openssl_error_string())
        {
            echo "ERROR: " . $msg;
        }
    }

您的输入数据不是Base64编码的。在命令行中,您通过指定-base64选项创建了相同的问题。