Является ли зашифрованный текст, заданный шифрованием файла с помощью CipherInputStream, той же длины, что и сам файл? - PullRequest
2 голосов
/ 09 февраля 2020

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

Проблема в том, что зашифрованный текст не имеет такую ​​же длину, как файл. Это означает, что я не могу знать, когда cipherInputStream.read (bytes) вернет -1.

Как узнать это заранее?

1 Ответ

1 голос
/ 09 февраля 2020

Это зависит от режима работы, поэтому сам поток не скажет вам этого. Однако, как правило, при использовании симметричного шифра c размер зашифрованного текста должен быть максимум на один блок больше. Таким образом, в целом для длинного зашифрованного текста может возникнуть проблема только с отображением полных 100% (но тогда все готово, верно?).

Для режима CTR нет накладных расходов.

Для режима ECB или CB C с заполнением PKCS # 7 ("PKCS5Padding" в Java) служебная информация составляет не более одного полного блока и не менее одного байта. Вы можете рассчитать величину заполнения, используя:

int n = cipher.getBlockSize();
int pad = n - plaintextSize % n;

Для режима GCM включен тег аутентификации, который по умолчанию равен 16 байтам.

Для всех режимов, кроме ECB, IV может быть с префиксом к зашифрованному тексту.


Отлично, это мой прямой ответ. Давайте сделаем его недействительным.

Не используйте CipherInputStream для шифрования . Используйте CipherOutputStream для шифрования. Таким образом, вы точно знаете, когда все заканчивается: когда последний блок исходного входного потока был зашифрован. В конце концов, вам не нужен зашифрованный зашифрованный текст в вашем приложении, верно? См. связанный ответ о кодировании / декодировании.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...