PHP — ошибка Openssl_decrypt: неправильная длина конечного блока (шифрование/дешифрование в режиме AES 256 CBC)

Это мой код:

 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: неправильная длина конечного блока».

Обратите внимание, что ключ и iv в шифровании swift/android одинаковы. Я не могу найти проблему здесь. Кто угодно? Спасибо.


person Jad.h94    schedule 10.05.2016    source источник
comment
Вы указываете заполнение PKCS # 7 (урожденный PKCS # 5)? Зашифрованные данные кратны длине блока (16 байтов для AES)? Я всегда рекомендую не комбинировать шаги, это усложняет отладку. Шестнадцатеричный дамп зашифрованных данных (base64_decode($code)), возможно, это не то, что вы думаете.   -  person zaph    schedule 10.05.2016
comment
Я указываю заполнение PKCS # 7. Зашифрованные данные кратны длине блока (80 байт). Вот Hexdump: ‹pre›0000 ab bc ea d5 22 1a 56 dd eb ad 30 17 96 c8 84 6d .V 0.m 0010 16 c8 c3 1f e6 6f f1 71 1b 63 f3 71 85 18 b0 b8 ..oq .cq. 0020 d1 9b fa 3e df a0 a3 c3 45 d2 62 76 dc cc 94 53 EBvS 0030 85 ac 88 77 11 60 d6 12 b4 52 db d2 2d e9 bd 3b w.. R-; 0040 f6 a1 46 5a ec 54 55 54 04 8f 00 60 09 cf af c2 FZTUT ...‹/pre› @zaph   -  person Jad.h94    schedule 11.05.2016
comment
The encrypted data ($code) is : q7zq1SIaVt3rrTAXlsiEbRbIwx/mb/FxG2PzcYUYsLjRm/o+36Cjw0XSYnbczJRThayIdxFg1hK0UtvSLem9O/ahRlrsVFVUBI8AYAnPr8I= The plaintext must be : a18ac4e6fbd3fc024a07a21dafbac37d828ca8a04a0e34f368f1ec54e0d4fffb @zaph   -  person Jad.h94    schedule 11.05.2016
comment
Пожалуйста, добавляйте дополнительную информацию к вопросу, а не к комментариям. Также комментарии практически не имеют возможности форматирования. Вы можете редактировать свои вопросы.   -  person zaph    schedule 11.05.2016
comment
$code в комментарии не является допустимой кодировкой Base64 из-за ее длины, 109 символов, в ней есть невидимый символ. Простой текст состоит из 64 символов и будет дополнен 16 байтами 0x10, что составит 80 байтов.   -  person zaph    schedule 11.05.2016
comment
Спасибо @zaph за советы. Они привели меня к поиску проблемы.   -  person Jad.h94    schedule 11.05.2016


Ответы (1)


Я решаю проблему. Дело в том, что я использую параметры URLEncoding на стороне Android, а затем URLDecoding с помощью моего 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;

}
person Jad.h94    schedule 11.05.2016