[英]Java cipher.doFinal() writing extra bytes
我正在使用Java Cipher和AES實現加密/解密。 除了在調用doFinal()時寫入5個額外字節外,一切都運行良好。 所以,我最終得到一個正確解碼的字符串,附加了5個額外的字節。
我相信原因是正在寫入整個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();
}
調用Cipher.getInstance()時必須指定填充機制 - 顯然在加密和解密時必須相同。 例如:
decryptCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
如果沒有填充機制,解密端就沒有關於明文結尾位置的信息(在最后一個塊內)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.