我有一个非常大的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”规范会处理这个问题。
由于
答案 0 :(得分:1)
在解密的文件上使用ZipInputStream,而不用将其读入内存。如果失败了,那么无论如何都无法读取您的文件,并且需要重新创建(可能是它略微不标准)。如果成功,请写出解密流的结果(在将其传递给ZipInputStream之前)并检查二进制差异。