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

Cas*_*ato -2 java encryption aes

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

byte[] data = cipher.doFinal(srcdata); // srcdata is a byte[]
Run Code Online (Sandbox Code Playgroud)

但是我遇到了多个字节[]想要作为一个块加密的情况。所以我尝试了这个:

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

byte[] data = cipher.doFinal();
Run Code Online (Sandbox Code Playgroud)

当我解码该结果时,出现以下错误:

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)
Run Code Online (Sandbox Code Playgroud)

阅读Cipher的Java文档,看来应该可以使用。

我究竟做错了什么?

use*_*421 5

cipher.update(block)返回一个byte[]数组。你把它扔掉了。发送它,或将其写入文件,或与之相关的任何事情。的结果cipher.doFinal()只是一个最终的管家byte[]阵列,您还需要发送或写入该阵列,或执行其他操作。这不是全部加密。