"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
,