CipherInputStream 和 CipherOutputStream 不生成文件 [英] CipherInputStream and CipherOutputStream are not generating files
问题描述
我有以下代码.但是文件 b.xlsx
和 c.xlsx
是 0 字节.为什么 CipherOuputSteam
不起作用?
I have the following code. However the files b.xlsx
and c.xlsx
are of 0 bytes. Why is CipherOuputSteam
not working?
public static void main(String[] args) throws Exception {
KeyPair keys = KeyPairGenerator.getInstance("RSA").generateKeyPair();
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, keys.getPublic());
FileInputStream fis;
FileOutputStream fos;
CipherOutputStream cos;
fis = new FileInputStream("C:/temp/a.xlsx");
fos = new FileOutputStream("C:/temp/b.xlsx");
cos = new CipherOutputStream (fos, cipher);
byte[] block = new byte[8];
int i;
while ((i = fis.read(block)) != -1) {
cos.write(block, 0, i);
}
cos.close();
fos.close();
cipher.init(Cipher.DECRYPT_MODE, keys.getPrivate());
CipherInputStream cis1, cis2;
fis = new FileInputStream("c:/temp/b.xlsx");
CipherInputStream cis = new CipherInputStream(fis, cipher);
fos = new FileOutputStream("c:/temp/c.xlsx");
while ((i = cis.read(block)) != -1) {
fos.write(block, 0, i);
}
fos.close();
fis.close();
cis.close();
}
推荐答案
问题在于你的用法 - 这是不正确的,并且在 CipherOutputStream
的实现中掩盖了一个非常重要的异常 - IllegalBlockSizeException
.
The problem lies in your usage - which is incorrect and in the implementation of CipherOutputStream
which masks a very important exception - IllegalBlockSizeException
.
问题是您不能使用 RSA 密钥来加密长度超过密钥大小(在您的示例中为 128 字节)的数据.您应该对大数据块使用对称加密算法 - 例如AES.
The problem is that you cannot use an RSA key to encrypt data which is longer than the size of the key (which is 128 bytes in your example). you should use a symmetric encryption algorithm for large blocks of data - e.g. AES.
如果您出于某种原因想要使用非对称密钥(例如数据的安全传输) - 您可以在此上找到一个很好的示例所以答案.
If you want to use asymmetric keys for a reason (safe transmition of data for example) - you can find a good example on this SO answer.
这篇关于CipherInputStream 和 CipherOutputStream 不生成文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!