CipherInputStream和CipherOutputStream不生成文件
我有以下代码。 但是文件b.xlsx
和c.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答案中找到一个很好的示例。
- Spring core 3.2.2 + Spring security 3.1.4:java.lang.IncompatibleClassChangeError:org.springframework.asm.ClassVisitor
- 从字节数组创建文件
- 如何创建开发/调试和生产设置
- java将列表字符串写入csv文件
- Spring集成 – Queue / Poller似乎在没有任何动作的情况下耗尽线程池
- Java世界中有没有类似于WPF和MVVM的东西?
- Bulider Design Pattern为具有大量参数的方法制作通用方法
- 缩略图上传YouTube API v3失败
- 在eclipse中禁用java应用程序选项运行