Это зависит от режима работы, поэтому сам поток не скажет вам этого. Однако, как правило, при использовании симметричного шифра 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
для шифрования. Таким образом, вы точно знаете, когда все заканчивается: когда последний блок исходного входного потока был зашифрован. В конце концов, вам не нужен зашифрованный зашифрованный текст в вашем приложении, верно? См. связанный ответ о кодировании / декодировании.