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

Ram*_*tte 60 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));
Run Code Online (Sandbox Code Playgroud)

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

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

ZZ *_*der 82

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

 cipherLen = (clearLen/16 + 1) * 16;
Run Code Online (Sandbox Code Playgroud)

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

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

  • @Durin的问题很好.原因在于没有方法可以将"10 0F 0E ... 02 01"的明文与"10 0F 0E ... 02"+填充"01"的填充明文区分开来.这就是为什么总是执行填充的原因.如果明文大小已知为"带外",或者如果已知该值在末尾不包含"00"(例如对于ASCII字符串),则有时使用零填充到块大小. (7认同)
  • 为什么有必要为16字节的明文添加一个全新的块.它已经是16的倍数.提前感谢 (6认同)
  • 如果没有至少一位填充,则该块没有端点. (6认同)
  • 使用零填充和使用空格填充不是标准化模式.有弹性总是垫,即使是零.PHP没有.无论是用零填充还是用空格填充都不是*确定性*填充模式.它们工作的原因是明文(作为字节)具有已知长度或明文具有预定格式(例如,仅可打印的ASCII字符).但是,如果不满足这些条件,零填充可能会失败; 例如,如果UTF16LE文本以"00"结束(很可能).换句话说,这些填充模式存在,但它们确实对输入施加了约束 (4认同)
  • @Abraham不,那是因为答案确实是错误的.这只是计算上限的快速方法.对于Java,当然你可以质疑你的`Cipher`实例的正确长度(现在).在stackoverflow upvotes几乎没有任何东西. (3认同)
  • 出于安全原因,@ sleske填充对于例如RSA是必需的,但对于分组密码操作模式则不需要。通常,由于oracle的填充攻击,padding使协议的安全性降低了。建议使用经过认证的操作模式(例如GCM):1)不需要填充,2)为密文提供完整性和真实性。 (2认同)

Rem*_*anu 31

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

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

  • @usr不,有*操作模式*不需要改变数据大小(尽管通常需要IV和/或认证标签作为开销).根据定义,填充模式使得密码的数据输入更大. (5认同)
  • 有一些填充方案不需要更改数据大小。 (2认同)

Jer*_*fin 8

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


Zaf*_*Zaf 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相应地表示密文的大小和纯文本的大小.