我的目标是将整个文件解密为另一个文件。
如果cypherBufStream(读取输入文件的BufferedInputStream(太小,即大约128字节,则出于某种原因,此输出循环将不会写入addmsgOut。当引入38kb及以上的较大文件时,效果很好。我一直用头撞墙想弄清楚,我很想得到一些帮助。
// Decrypt M and H using RSA encryption
OutputStream addmsgOut = new BufferedOutputStream(new FileOutputStream("message.add-msg"));
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] piece = new byte[128];
int e;
ByteArrayOutputStream out4 = new ByteArrayOutputStream();
while ((e = cypherBufStream.read(piece)) != -1) {
out4.write(piece, 0, e);
addmsgOut.write(cipher.doFinal(out4.toByteArray()));
out4.reset();
}
BufferedOutputStream
按照名称执行。它缓冲数据。。。以避免在小型写入请求上浪费CPU周期、系统调用等。
但这意味着,只有在以下情况下,数据才会写入输出(在本例中(文件:
- 当流的缓冲区填满时
- 当您在流上调用
flush()
时,或者 - 当您在流上调用
close()
时
另一件需要注意的事情是,您执行的write(byte[], ...)
大于流的缓冲区,缓冲区中的任何内容都会被刷新,然后绕过缓冲区执行整个写入。(注意,这是特定于实现的行为…(
然而,从您的代码来看,您似乎是在(大约(128字节的块中写入BufferedOutputStream
。所以我的猜测是,即使在大文件的情况下,你也不会用这段代码写出整个文件。