blocktoDo = new byte[block];
fos = new FileOutputStream(file_dpt);
fis = new FileInputStream(file_ct);
Cipher.getInstance(algorithm, "BC"); // Initiate the cipher in decrypt mode
cipher.init(Cipher.DECRYPT_MODE, key); // Run decryption in single mode
totalT = (long) 0;
while (fis.available() > 0) {
fis.read(blocktoDo);
startT = System.nanoTime();
byte[] decryBytes = cipher.doFinal(blocktoDo);
endT = System.nanoTime();
fos.write(decryBytes);
totalT += (endT - startT);
}
fis.close();
fos.close();
我正在加密和解密不同大小的文件。同时也很难估计实际加密和解密过程需要多长时间。
我在doFinal
行上遇到了pad block corrupted错误。
我错过了什么/完全错了?
答案 0 :(得分:0)
您不应该依赖available()
来检测流的结尾。它现在可以工作(对于文件),但将来可能不会。而是使用read()
的输出。
更重要的是,你打电话给cipher.doFinal()
。 doFinal()
的一个特性是它检查填充需要它的密码(主要是CBC和ECB)。现在填充仅应用于明文消息的末尾,因此如果您尝试在中间取消填充,则软件实现将失败。
解决方案:
CipherInputStream
; update()
方法后跟doFinal()
(超过零字节),连接更新和doFinal()
调用的结果并遵循一些关于Java流的教程。