JavaCipherとAESを使用して暗号化/復号化を実装しています。doFinal()の呼び出しで5バイト余分に書き込まれることを除いて、すべてが正常に機能しています。したがって、5バイトが追加された正しくデコードされた文字列になります。
その理由は、16バイトのブロック全体が書き込まれているためだと思います。最後のブロックを含めて、3つの16バイトブロックが書き込まれています。入力暗号化ファイルは64バイトです。暗号化されていないテキストは43バイトである必要があります。
doFinalのドキュメントには、出力バッファーに書き込まれたバイト数を返すことができることが示されています。ただし、0、16、16、16です。あらゆる形式のdoFinalとupdateを試しましたが、動作に変化はありません。
これらのアルゴリズムのほとんどが動作する方法であるため、フルブロックを書き出すことは理にかなっています。ただし、出力データのサイズがわからない場合は、過剰なデータを防ぐにはどうすればよいですか?
おそらく私は別のアルゴリズムを使用する必要がありますか?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();
}