Ram*_*tte 60 java encryption aes
我想知道AES加密后数据的大小,这样我就可以避免缓冲我的后AES数据(在磁盘或内存上),主要是为了知道大小.
我使用128位AES和javax.crypto.Cipher
和javax.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个字节.
这取决于您使用AES的模式.对于大多数面向块的模式,例如ECB和CBC,你所拥有的是准确的.OTOH,在CFB模式下(例如)你基本上只是使用AES来产生一个字节流,你可以用输入的字节进行异或.在这种情况下,输出的大小可以保持输入的大小,而不是像上面给出的那样向上舍入到下一个块大小.
一般来说,对于分组密码加密:
CipherText = PlainText + Block - (PlainText MOD Block)
密文大小计算为扩展到下一个块的明文的大小.如果使用填充并且明文的大小是块大小的精确倍数,则将添加一个包含填充信息的额外块.
AES使用16字节的块大小,这会产生:
CipherText = PlainText + 16 - (PlainText MOD 16)
资料来源:http: //www.obviex.com/articles/CiphertextSize.pdf
注意: