代码之家  ›  专栏  ›  技术社区  ›  ineersa

无法使用openssl正确解密AES-256-CBC加密的数据

  •  -1
  • ineersa  · 技术社区  · 7 年前

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

    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 回复  |  直到 7 年前
        1
  •  1
  •   Afshin    7 年前

    将您的标志更改为:

    OPENSSL_ZERO_PADDING
    

    收件人:

    OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING
    

    Based on documents ,输入应为Base64编码,如果 OPENSSL_RAW_DATA 未指定。代码应如下所示:

    $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 选项

    推荐文章