Java 解密垫块已损坏
我正在加密和解密不同大小的文件。同时,对于实际的加密和解密过程花费了多长时间也有一个粗略的估计 我在Java 解密垫块已损坏,java,exception,encryption,Java,Exception,Encryption,我正在加密和解密不同大小的文件。同时,对于实际的加密和解密过程花费了多长时间也有一个粗略的估计 我在doFinal行中发现一个焊盘块损坏错误 我遗漏了什么/做错了什么?您不应该依靠available()来检测流的结束。它现在可以工作(对于文件),但将来可能不行。相反,请使用read()的输出 更重要的是,您正在调用cipher.doFinal()。doFinal()的一个特性是,它检查需要它的密码的填充(主要是CBC和ECB)。现在填充只在明文消息的末尾应用,所以如果您尝试在中间拆解,则软件实现
doFinal
行中发现一个焊盘块损坏错误
我遗漏了什么/做错了什么?您不应该依靠
available()
来检测流的结束。它现在可以工作(对于文件),但将来可能不行。相反,请使用read()
的输出
更重要的是,您正在调用cipher.doFinal()
。doFinal()
的一个特性是,它检查需要它的密码的填充(主要是CBC和ECB)。现在填充只在明文消息的末尾应用,所以如果您尝试在中间拆解,则软件实现将失败。
解决方案:
- 使用
李>CipherInputStream
- 使用
方法,后跟update()
(超过零字节),将更新结果和doFinal()
调用连接起来doFinal()
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();