AES / CBC和AES / ECB加密后的数据大小

时间:2010-07-19 18:14:49

标签: java encryption aes

我想知道AES加密后数据的大小,这样我就可以避免缓存我的AES后数据(在磁盘或内存上),主要是为了知道大小。

我使用128位AES,javax.crypto.Cipherjavax.crypto.CipherInputStream进行加密。

使用各种输入大小执行的一些测试表明,如下计算的后加密大小是正确的:

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

但我不确定上述公式是否适用于所有可能的输入尺寸。

有没有办法在应用AES加密后计算数据大小 - 事先无需缓冲加密数据(在磁盘或内存上)以了解其加密后大小?

9 个答案:

答案 0 :(得分:76)

无论密钥大小如何,AES都具有16字节的固定块大小。假设您使用PKCS 5/7填充,请使用此公式

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

请注意,如果明文是块大小的倍数,则填充需要一个全新的块。比如说明文是16个字节。密文将占用32个字节。

您可能希望使用密文存储IV(初始向量)。在这种情况下,您需要为IV添加16个字节。

答案 1 :(得分:30)

AES作为分组密码,不会改变大小。输入大小始终是输出大小。

但作为分组密码的AES要求输入为块大小的倍数(16字节)。为此,使用填充方案,就像流行的PKCS5一样。所以答案是加密数据的大小取决于使用的填充方案。但同时所有已知的填充方案将向下舍入到下一个模块16大小(大小AES具有16字节块大小)。

答案 2 :(得分:8)

这取决于您使用AES的模式。对于大多数面向块的模式,例如ECB和CBC,你所拥有的是准确的。 OTOH,在CFB模式下(例如)你基本上只是使用AES来产生一个字节流,你可以用输入的字节进行异或。在这种情况下,输出的大小可以保持输入的大小,而不是像上面给出的那样向上舍入到下一个块大小。

答案 3 :(得分:5)

一般来说,对于分组密码加密:

  

CipherText = PlainText + Block - (PlainText MOD Block)

     

密文大小计算为扩展到的明文的大小   下一个街区。如果使用填充并且明文的大小是   块大小的精确倍数,一个包含填充的额外块   信息将被添加。

AES使用16字节的块大小,产生:

CipherText = PlainText + 16 - (PlainText MOD 16)

来源: http://www.obviex.com/articles/CiphertextSize.pdf

注意:

  1. CipherText和PlainText相应地表示密文的大小和纯文本的大小。

答案 4 :(得分:3)

AES密码始终适用于16字节(128位)块。如果输入字节数不是16的精确倍数,则填充它。这就是为什么16似乎是你计算中的“神奇数字”。你所拥有的东西应适用于所有输入尺寸。

答案 5 :(得分:1)

AES工作在128位(16字节)块中,并将明文块转换为相同长度的密文块。如果它短于16个字节,它会填充最后一个块,因此您的公式看起来是正确的。

答案 6 :(得分:0)

如果您的输入长度小于int的最大大小,则可以使用Cipher.getOutputSize(int)

答案 7 :(得分:0)

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

cipherLen = (clearLen/16 + 1) * 16

@ zz-coder和@OP相同。

int(clearLen/16) + 1) * 16
= ((clearLen - clearLen % 16) / 16 + 1) * 16
= clearLen - clearLen % 16 + 16;
= clearLen + (16  - clearLen % 16)

答案 8 :(得分:-1)

存在加密信息的存储方法,只要数据大小至少等于块大小,就可以避免任何填充。一个小难点是,如果允许数据大小小于块大小,并且必须能够重建数据的精确大小,即使对于小块,输出必须至少比块大一位。输入,[i]无论[/ i]数据大小。

要理解这个问题,请认识到有两个N字节长的256 ^ N个可能的文件,并且不超过N个字节长的可能文件的数量是256 ^ N加上可能的非文件数量长度超过N-1个字节(有一个可能的文件是零字节长,257个可能的文件长度不超过一个字节)。

如果块大小为16字节,则会有256 ^ 16 + 256 ^ 14 + 256 ^ 13等可能的输入文件长度不超过16个字节,但只有256 ^ 16个可能的输出文件为no超过16个字节(因为输出文件不能短于16个字节)。因此,至少一些可能的16字节输入文件必须增长。假设它们将变为17个字节。有256 ^ 17个可能的17字节输出文件;如果其中任何一个用于处理16字节或更少的输入,则没有足够的可用来处理所有可能的17字节输入文件。无论输入有多大,一些或更大的文件都必须增长。