PHP - Openssl_decrypt错误:最终块长度错误(AES 256 CBC模式加密/解密)

时间:2016-05-10 19:12:18

标签: android ios encryption aes php-openssl

这是我的代码:

 function decrypt($code)
{

    $key = '3552ef55ecdf04324..'; // 64 bytes length
    $iv = 'd20818af907b59c3b15d258dd3969770'; // 32 bytes length
    $key = hash("sha256", $key,true); // 32 bytes length
    $iv = md5($iv,true); // 16 bytes length

    echo strlen(base64_decode($code)); // 80 bytes
   //return openssl_decrypt(base64_decode($code), 'aes-256-cbc', $key, 0 ,$iv); // return false
    $output = openssl_decrypt(base64_decode($code), 'aes-256-cbc', $key, 0 ,$iv);
    return openssl_error_string(); 

}

我使用swift / android进行加密,并使用php解密。

openssl_error_string()方法返回“错误:0606506D:数字包络例程:EVP_DecryptFinal_ex:错误的最终块长度”。

请注意,加密swift / android中的密钥和iv是相同的。 我在这里找不到问题。任何人?感谢。

1 个答案:

答案 0 :(得分:1)

我解决了这个问题。事实是我在Android端URLEncoding params,然后使用我的PHP脚本对它们进行URL解码。

不幸的是,' +'是Android中的空白,但在ios中它是正确的(' +')。

所以在PHP方面,我用' +'替换了空格字符。在解码之前。 我删除了base64_decode函数。

更新的代码:

  function decrypt($code)
{

$key = '3552ef55ecdf04324d0fe72343...';
$iv  = 'd20818af907b59c3b15d258dd3969770';

$key = hash("sha256", $key, true);
$iv  = md5($iv, true);
if (preg_match('/\s/', trim($code))) {
    $code = str_replace(' ', '+', trim($code));
}

$output = openssl_decrypt($code, 'aes-256-cbc', $key, 0, $iv);
return $output;

}