2010-07-19 2 views
49

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

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

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

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

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

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

ответ

64

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

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

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

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

+4

Почему необходимо добавить целый новый блок для открытого текста из 16 байтов. Его уже кратное 16. заранее заблаговременно – Durin

+6

Без хотя бы одного бита прокладки блок не имеет конечной точки. –

+3

Зачем нужно + 1? – Deyang

2

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

+0

Обратите внимание, что по крайней мере один байт заполнения всегда добавляется, даже если длина входной кратен 16. –

29

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

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

+1

Есть которые не требуют изменения размера данных. – usr

+5

@usr Нет, есть * режимы работы *, которые не требуют изменения размера данных (хотя обычно в качестве служебных данных требуются теги IV и/или аутентификации). Режимы заполнения по определению делают ввод данных большим для шифра. –

+0

@ MaartenBodewes-owlstead, вы правы. – usr

1

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

8

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

-1

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

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

4

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

шифротекста = PlainText + блок - (PlainText MOD Блок)

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

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

шифротекста = PLAINTEXT + 16 - (PlainText MOD 16)

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

Примечание:

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