使用流解密和解压缩以限制内存使用?

时间:2014-04-28 16:44:27

标签: java android encryption cryptography zip

我有一个非常大的zip文件,2.5gb,已加密。我无法将整个文件解密到内存中并解压缩到那里进行生产。所以我正在尝试使用流来限制使用的内存量。

我已经连接了以下内容(为了清晰起见,错误处理和流关闭):

SecretKeySpec keySpec = new SecretKeySpec(myKey "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

FileInputStream fis = new FileInputStream(new File(pathToEncryptedFile));
CipherInputStream cis = new CipherInputStream(fis, cipher);

ZipInputStream zis = new ZipInputStream(new BufferedInputStream(cis));
ZipEntry ze = null;
while ((ze = zis.getNextEntry()) != null) {
    String filename = ze.getName();
    System.out.println("Found zip entry: " + filename);
}

这适用于大约50%的文件,即使它们都以相同的方式压缩和加密。我将在解压缩部分的while()循环中获得异常:

java.util.zip.ZipException: unknown format (EXTSIG=f23f1090)
  at java.util.zip.ZipInputStream.readAndVerifyDataDescriptor(ZipInputStream.java:196)
  ...

如果我将整个文件解密为字节缓冲区并将其写入磁盘,则在文件上使用ZipInputStream,它适用于我的所有测试文件。

似乎加密文件末尾的额外填充在尝试使用流时会引起一些问题,但我认为“PKCS5Padding”规范会处理这个问题。

由于

1 个答案:

答案 0 :(得分:1)

解密的文件上使用ZipInputStream,而不用将其读入内存。如果失败了,那么无论如何都无法读取您的文件,并且需要重新创建(可能是它略微不标准)。如果成功,请写出解密流的结果(在将其传递给ZipInputStream之前)并检查二进制差异。