/ / javax.crypto.Cipher update(byte [])およびdoFinal()、vs doFinal(byte [])-java、暗号化、aes

javax.crypto.Cipherの更新(byte [])とdoFinal()、vs doFinal(byte []) - java、暗号化、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は4

cipher.update(block) 返す byte[] アレイ。あなたはそれを捨てています。それを送信するか、ファイルに書き込むか、またはあなたがそれを行うことになっているものは何でも。 cipher.doFinal() 最後のハウスキーピングです byte[] 配列。送信、書き込み、その他何でも必要です。暗号化全体ではありません。