Размер данных после AES/CBC и шифрования AES/ЕЦБ

Я хотел бы знать размер данных после Шифрования AES так, чтобы я мог постараться не буферизовать свои данные пост-AES (на диске или памяти) главным образом для знания размера.

Я использую AES на 128 битов и javax.crypto.Cipher и javax.crypto.CipherInputStream для шифрования.

Несколько тестов, выполненных с различными входными размерами, показывают, что, размер шифрования сообщения, вычисленный как ниже, корректен:

long size = input_Size_In_Bytes; 
long post_AES_Size = size + (16 - (size % 16));

Но я не уверен, применима ли вышеупомянутая формула для всех возможных входных размеров.

Существует ли способ вычислить размер данных после применения Шифрования AES – заранее, не имея необходимость буферизовать зашифрованные данные (на диске или памяти) для знания ее размера постшифрования?

60
задан Maarten Bodewes 22 December 2014 в 18:32
поделиться

6 ответов

AES имеет фиксированный размер блока в 16 байт независимо от размера ключа. Предполагая, что вы используете заполнение PKCS 5/7, используйте эту формулу,

 cipherLen = (clearLen/16 + 1) * 16;

Обратите внимание, что если открытый текст кратен размеру блока, для заполнения требуется целый новый блок. Допустим, у вас открытый текст 16 байт. Зашифрованный текст займет 32 байта.

Возможно, вы захотите сохранить IV (исходный вектор) с зашифрованным текстом. В этом случае вам нужно добавить еще 16 байтов для IV.

82
ответ дан 24 November 2019 в 17:40
поделиться

AES работает с 128-битными (16 байтами) блоками и преобразует блоки открытого текста в блоки шифротекста той же длины. Он дополняет последний блок, если он короче 16 байт, поэтому ваша формула выглядит правильно.

1
ответ дан 24 November 2019 в 17:40
поделиться

Это зависит от режима, в котором вы используете AES. То, что вы имеете, точно для большинства режимов, ориентированных на блоки, таких как ECB и CBC. В то же время, в режиме CFB (для примера) вы, по сути, просто используете AES для создания потока байтов, который вы XORируете с байтами входа. В этом случае размер выходного файла может оставаться размером входного, а не округляться до размера следующего блока, как вы приводили выше.

8
ответ дан 24 November 2019 в 17:40
поделиться

Шифр ​​AES всегда работает с 16-байтовыми (128-битными) блоками. Если количество входных байтов не является точным кратным 16, оно дополняется. Вот почему 16 оказывается «магическим числом» в ваших расчетах. То, что у вас есть, должно работать для всех размеров ввода.

3
ответ дан 24 November 2019 в 17:40
поделиться

Существуют подходы к хранению зашифрованной информации, которые исключают необходимость в любом заполнении, при условии, что размер данных по крайней мере равен размеру блока. Одна небольшая трудность заключается в том, что если разрешено, чтобы размер данных был меньше размера блока, и если должна быть возможность восстановить точный размер данных, даже для небольших блоков, выход должен быть по крайней мере на один бит больше, чем размер блока. input, [i] независимо от [/ i] размера данных.

Чтобы понять проблему, имейте в виду, что существует 256 ^ N возможных файлов длиной N байтов, а количество возможных файлов, длина которых не превышает N байтов, составляет 256 ^ N плюс количество возможных файлов, которые не являются длиннее N-1 байта (есть один возможный файл длиной ноль байтов и 257 возможных файлов длиной не более одного байта).

Если размер блока составляет 16 байт, будет 256 ^ 16 + 256 ^ 14 + 256 ^ 13 и т. Д. Возможных входных файлов, длина которых не превышает 16 байт, но только 256 ^ 16 возможных выходных файлов, которые не являются длиной более 16 байт (поскольку выходные файлы не могут быть короче 16 байт). Так что по крайней мере некоторые возможные 16-байтовые входные файлы должны увеличиваться. Предположим, они станут 17 байтами. Имеется 256 ^ 17 возможных семнадцатибайтовых выходных файлов; если какой-либо из них используется для обработки входных данных размером 16 или менее байтов, их будет недостаточно для обработки всех возможных 17-байтовых входных файлов. Независимо от того, насколько большим может быть ввод, некоторые файлы этого или большего размера должны увеличиваться.

-1
ответ дан 24 November 2019 в 17:40
поделиться

AES, как блочный шифр, не меняет размер. Размер входа всегда равен размеру выхода.

Но AES, будучи блочным шифром, требует, чтобы входной размер был кратен размеру блока (16 байт). Для этого используются схемы набивки, такие как популярный PKCS5. Итак, ответ таков: размер зашифрованных данных зависит от используемой схемы набивки. Но в то же время все известные схемы набивки будут округлять до следующего по модулю 16 размера (размер блока AES составляет 16 байт).

31
ответ дан 24 November 2019 в 17:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: