我正在尝试解密第三方资源提供的数据。
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
答案 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
选项创建了相同的问题。