2013-10-10 3 views
1

Я знаю, что заданы подобные вопросы, но я не могу исправить свою проблему ни с одним из них.Расшифровка файла: IllegalBlockSizeException: последний незавершенный блок в дешифровке

У меня есть зашифрованный файл, который был создан с помощью следующей команды Unix:

tar cf FILES | gzip | openssl enc -k PASSWORD -aes-256-cbc -e > OUTPUT.tar.gz.enc 

Я могу успешно расшифровать файл с соответствующей командой.

Мне нужно расшифровать этот файл в процессе Java. Я использовал код, представленный в this SO answer.

Я использую ту же функцию EVP_BytesToKey, но s немного отличается main функция.

Это, как я загрузить зашифрованный файл:

byte[] headerSaltAndCipherText = IOUtils.toByteArray(new 
InputStreamReader(new FileInputStream(f))); 

В примере кода, кажется, что данные закодированы в base64. Тем не менее, когда я прочитал мой файл, это не так (я могу видеть в ясный заголовок «Salted__»)

Я создал easCBC объект таким образом:

Cipher aesCBC = Cipher.getInstance("AES/CBC/PKCS5Padding", "BC"); 

И я добавил Security.addProvider(new BouncyCastleProvider()); в верхней части функция main. Я начал использовать BouncyCastle, поскольку я застрял, но это ничего не изменило.

Я также пробовал с PKCS7Padding и NoPadding, но не повезло.

Общие проблемы, которые я обнаружил, когда используется неправильное поведение дополнения или зашифрованные данные, которые не кодируются/загружаются должным образом.

Как я не делаю точно так, как в примере, я полагаю, что ответ является вторым решением: я попытался загрузить файл, как в примере, но у меня есть это исключение java.nio.charset.MalformedInputException: Input length = 1 и так или иначе, я не могу использовать функции из JDK 1.7.

Что я делаю неправильно?

+1

Чтобы лучше помочь, разместите свой код как [SSCCE] (http://www.sscce.org), который продемонстрирует вашу проблему. Это позволяет пользователям копировать/вставлять и воспроизводить вашу проблему. –

ответ

0

Если входной файл не является символьным (то есть Base64 закодирован), вы не должны использовать InputStreamReader, просто прочитайте байты непосредственно с FileInputStream. Если вход кодируется Base64, вам необходимо прочитать его в качестве символьных данных и преобразовать его в байт [] с помощью декодера Base64.

Для заполнения, команда OpenSSL enc использует PKCS5PADDING для блочных шифров.

Другой проблемой может быть то, как вы генерируете свой ключевой материал и вектор инициализации. Вы должны сделать это так же, как OpenSSL дал пароль ввода.

Наконец-то (хотя, похоже, вы еще не успели это сделать), если вы используете Oracle Runtime Environment или JDK, вам придется установить файлы политики JCE Unlimited Strength для вашей JRE, чтобы использовать AES256.

+0

Удаление 'InputStreamReader' решило мою проблему благодаря! Я не мог найти, какой пробел использовался OpenSSL. – Flanfl

+0

@Flanfl Чтобы узнать, какое дополнение используется, расшифруйте с помощью «NoPadding» (или эквивалент) и посмотрите на конец последнего блока. Это покажет, какое добавление добавлено. – rossum

+0

Хорошо, спасибо, я сделаю это в следующий раз :) – Flanfl

Смежные вопросы