CipherInputStream和CipherOutputStream不生成文件

我有以下代码。 但是文件b.xlsxc.xlsx是0字节。 为什么CipherOuputSteam不工作?

 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的实现中掩盖了一个非常重要的exception – IllegalBlockSizeException

问题是您无法使用RSA密钥加密长度大于密钥大小的数据(在您的示例中为128字节)。 您应该对大型数据块使用对称加密算法 – 例如AES

如果您想使用非对称密钥(例如安全传输数据) – 您可以在此SO答案中找到一个很好的示例。