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


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

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

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

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

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

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

8   51  

8 ответов:

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

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

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

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

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

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

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

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

CipherText = PlainText + Block - (PlainText MOD Block)

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

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

CipherText = PlainText + 16 - (PlainText MOD 16)

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

Примечание:

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

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

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

Если ваша длина входного сигнала меньше максимального размера int, вы можете использовать шифр.getOutputSize (int)

существуют подходы к хранению зашифрованной информации, которые позволяют избежать необходимости в любом заполнении при условии, что размер данных по крайней мере равен размеру блока. Одна небольшая трудность заключается в том, что если размер данных может быть меньше размера блока, и если должна быть возможность восстановить точный размер данных, даже для небольших блоков, выход должен быть по крайней мере на один бит больше, чем вход, [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-байтовых входных файлов. Независимо от того, насколько большой вход может получить, некоторые файлы такого размера или больше должны расти.