android - PHP - Openssl_decrypt 错误 : wrong final block length (AES 256 CBC mode encryption/decryption)

标签 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() 方法返回“error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length”。

注意加密swift/android中的key和iv是一样的。 我在这里找不到问题。任何人?谢谢。

最佳答案

我解决了这个问题。事实上,我在 Android 端使用 URLEncoding 参数,然后使用我的 PHP 脚本对它们进行 URLDecoding。

不幸的是,“+”的 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;

}

关于android - PHP - Openssl_decrypt 错误 : wrong final block length (AES 256 CBC mode encryption/decryption),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37147049/

相关文章:

objective-c - 返回指向不同对象的指针的方法是否会自动分配和初始化其他对象?

java - javascript中的AES加密和java中的解密

java - 如何使用 Spring Security 识别 guest 用户

ios - CABasicAnimation 的 toValue 是否相对于初始位置?

c# - DES 加密不工作 C#

java - 当我在另一个应用程序 Intent 上调用 startIntent 时抛出 SecurityException

php - 如何在 PHP 和 MySql 中保存和管理 session ID 和用户 ID

android - 我怎样才能刷新 Activity ?

c# - $(TargetFrameworkVersion) (v9.0) 小于 Xamarin.Forms (10.0) 所需的最低 $(TargetFrameworkVersion)

ios - 从 Realm List<> 获取数据