2012-05-14 140 views
0

我运行AES加密此Java代码:AES加密输出长度

byte[] iv = new byte[16]; 

SecretKey aesKey = new SecretKeySpec("hex key here", "AES"); 

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
cipher.init(Cipher.ENCRYPT_MODE, aesKey, new IvParameterSpec(iv)); 

return cipher.doFinal("32 characters here ...".getBytes()); 

我总是得到一个48个字节输出,但我具有被期待一个32个字节的输入的遗留系统。如何控制输出长度?

注:我必须使用AES CBC

+0

所以你运行上面的代码和doFinal的结果是96字节? –

+1

为什么你期望64个字节的输出? “某些文本”将生成带有PKCS#5填充的单个块输出,并且假设您使用的是AES-256,则它将是32个字节。 – vhallac

+0

通过使用'getBytes()'而不指定字符集,您依赖于默认值,这通常是一个错误。此外,没有编码,我知道哪些“一些文本”将导致多达64个字节的输出,更不用说96. –

回答

5

你得到,因为你正在使用的填充的32 + 16个字节。

填充通常只填充剩余的字节,直到下一个密码块已满为止。但在你的情况下,明文已经使用了2个块(2 * 16字节)。在这种情况下,没有空间来编码信息“无需填充”。因此必须添加一个仅包含填充数据的附加密码块。

可能是遗留系统不使用填充。尝试“AES/CBC/NoPadding”

+0

谢谢,这样做! –