Вообще говоря, небезопасно предполагать, что буферизация предназначена только для одного блока; и когда вы посмотрите на детали, вы можете увидеть, что это зависит от типа заполнения. При обычном заполнении "PKCS # 5" добавляется как минимум один байт и максимум n байтов (для блоков размером n ), поэтому система дешифрования может ограничиться n байт буферизации. Некоторые другие типы отступов немного сложнее, например, CTS требует 2n байтов буферизации. Похоже, что криптографический уровень Java не поддерживает CTS, но это может быть добавлено в будущей версии.
Cipher.getOutputSize(len)
даст вам максимальный размер вывода, учитывая len
дополнительные входные байты. Возвращаемое значение может быть несколько больше, чем будет возвращено, особенно при расшифровке, поскольку оно зависит от того, какие байты заполнения будут фактически найдены при расшифровке.
Можно с уверенностью предположить, что общая длина дешифрованного сообщения не превышает общую длину зашифрованного сообщения (симметричное шифрование не включает сжатие данных). Таким образом, вы можете поддерживать два счетчика, один для байтов входных данных (зашифрованные блоки) и один для полученных байтов выходных данных; разница будет максимальной оценкой того, что можно получить из doFinal()
. Но это то, что getOutputSize()
делает в любом случае.