javax.crypto.Cipher update(byte [])和doFinal(),vs doFinal(byte [])

时间:2017-03-14 04:58:08

标签: java encryption aes

我有一些使用javax.crypto.Cipher的加密代码,当我像这样加密时工作正常:

byte[] data = cipher.doFinal(srcdata); // srcdata is a byte[]

但是我遇到过多个byte []的情况,我希望将其作为单个块进行加密。所以我尝试了这个:

for (byte[] block : blocks) {
    cipher.update(block);
}

byte[] data = cipher.doFinal();

当我解码该结果时,我收到此错误:

javax.crypto.BadPaddingException: Given final block not properly padded
    at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:811)
    at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:676)
    at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:313)
    at javax.crypto.Cipher.doFinal(Cipher.java:2131)

阅读Cipher的java文档,它似乎应该有效。

我做错了什么?

1 个答案:

答案 0 :(得分:4)

cipher.update(block)返回byte[]数组。你扔掉了。发送,或写入文件,或任何你应该用它做的事情。 cipher.doFinal()的结果只是最终的内务byte[]数组,您还需要发送,写入或其他任何内容。它不是整个加密。