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

2022-08-31 13:08:22

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

我使用128位AES和和进行加密。javax.crypto.Cipherjavax.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(初始向量)与密文一起存储。在这种情况下,您需要为 IV 再添加 16 个字节。


答案 2

AES 作为块密码,不会更改大小。输入大小始终是输出大小。

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


推荐