"BadPaddingException: блок pad поврежден" при расшифровке с использованием AES/ECB

В приложении для Android/ Java

byte[] data = ":ʺ$jhk¨ë‹òºÃ"; // fetched from php server..
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, mKeyspec);
return new String(cipher.doFinal(data));

Приведенный выше код всегда выдает BadPaddingException: pad block corrupted для следующих 16-байтовых данных

data = ":ʺ$jhk¨ë‹òºÃ" (данные 16 символов)

Ключ длиной 16 байт.

Почему выдается это исключение, когда данные уже имеют размер блока? и никаких дополнений не требуется.

Примечание. Зашифрованные данные извлекаются с php-сервера.

Редактировать:

После изменения на
Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");
от
Cipher cipher = Cipher.getInstance("AES");

метод расшифровки успешен, но дает этот вывод

2 ответа

В большинстве случаев, с которыми я имел дело BadPaddingException это было, когда я пытался расшифровать что-то, что было зашифровано на стороне сервера с другим заполнением, или в некоторых случаях это даже не расшифровывалось. Итак, прежде всего, я предлагаю вам посмотреть на путь и быть уверенным, что сервер возвращает вашу строку не только Base64 закодированы, но зашифрованы с AES тоже. Еще одна вещь, которую нужно быть осторожным, это то, что при шифровании на стороне сервера используется какой-то тип заполнения: AES/CBC/NoPadding, AES/CBC/PKCS5Padding или же AES/CBC/PKCS7Padding, В этом случае вы должны использовать тот же отступ в Android, чтобы вы могли расшифровать строку.

Для шифрования фиксированной длины только 16 байтов данных, используя метод, который не требует вектора инициализации, Изменить AES в AES/ECB/NoPadding,

Другие вопросы по тегам