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

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

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

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

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

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

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

Ответ 1

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

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

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

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

Вообще говоря, для шифрования блочного шифрования:

CipherText = PlainText + Block - (PloneText MOD Block)

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

AES использует размер блока 16 байтов, который производит:

CipherText = PlainText + 16 - (PlainText MOD 16)

Источник: http://www.obviex.com/articles/CiphertextSize.pdf

Примечание:

  • CipherText и PlainText представляют размер текста шифрования и размер обычного текста.

Ответ 5

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

Ответ 6

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

Ответ 7

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

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

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