Java CipherとAESを使用して暗号化/復号化を実装しています。 doFinal()の呼び出しで5バイトの余分なバイトが書き込まれていることを除いて、すべてうまくいっています。だから、私は5つの余分なバイトが追加された正しく復号された文字列で終わる。Java cipher.doFinal()余分なバイトを書き込む
私は、16バイトのブロック全体が書き込まれていると考えています。私は3つの16バイトのブロックが最後のものを含めて書かれているのを見る。入力暗号化ファイルは64バイトです。暗号化されていないテキストは43バイトでなければなりません。
doFinalのドキュメントは、出力バッファに書き込まれたバイト数を返すことができることを示しています。しかし、0,16,16,16です。私はdoFinalのすべてのフォームを試して更新し、動作に変更はありません。
これらのアルゴリズムのほとんどがどのように動作するのかという点で、フルブロックを書き出していることは意味があります。しかし、出力データのサイズを教えてくれない場合は、余分なデータをどうやって防ぐのですか?
別のアルゴリズムを使用しているはずですか? AES256は必須ですが、別のブロックタイプまたはパディングタイプで正しいバイト数を書き込めるかどうかは疑問です。
ガイダンスはありますか? (いくつかの)簡潔にするために切り取ら
:解読ルーチンの
decryptCipher = Cipher.getInstance("AES");
decryptCipher.init(Cipher.DECRYPT_MODE, aesKey);
ビジネス一環。すべてのブロック暗号れるように
long bytesToRead = inputFile.length();
while ((inLen = in.read(buffer)) > 0) {
int bytesOut = 0;
byte[] cryptBytes = null;
int outLen = cipher.getOutputSize(inLen);
cryptBytes = new byte[outLen];
if (bytesToRead <= buffer.length) {
try {
bytesOut = cipher.doFinal(buffer, 0, inLen, cryptBytes, 0);
} catch (ShortBufferException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else
try {
bytesOut = cipher.update(buffer, 0, inLen, cryptBytes, 0);
} catch (ShortBufferException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
out.write(cryptBytes, 0, bytesOut);
bytesToRead -= inLen;
}
try {
out.flush();
in.close();
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
すごく、ありがとう。それがそれを解決しました。私はあなたがAESのみを指定した場合、デフォルトでECBブロックモードとPCKS5Paddingを取得したという印象を受けました。間違っていると思います。 – wadesworld
は、Java以外のすべてのAESエンジンにも同じことが適用されます。 – Cheeso