关于用于压缩文件的免费库的建议

我需要压缩和密码保护一个文件。有一个好的(免费)库为此?

这需要由第三方打开,因此密码保护需要使用标准工具。

77619 次浏览

有没有一个很好的(免费的)图书馆?

Zip 将执行压缩,但不执行密码。没有,我不知道有哪个免费的。我见过的开发商座位是150美元。

7-Zip 可以选择在命令行模式下添加密码。也许您可以执行它来得到这个结果(它也有很好的压缩比)。

缺点: 外部进程,难以使便携式(即使7-Zip 是便携式本身) ,不确定的发行许可证。

注意,InfoZip 的 Zip 实用程序也是高度可移植的,它还支持密码。

如果您提供了一个更好的使用场景,那么还有其他选择。

  1. 是否需要使用能够处理 Zip 密码的标准 Zip 工具来打开 Zip?
  2. 同样的问题,您是否要将这个 zip 传递给一个必须打开这个 zip 的外部实体?
  3. 它只是内部的,你只是想保护内容的拉链?

对于3,那么你可以只使用 java 来加密的压缩文件的流内容作为一个正常的文件,可能最好的文件扩展名改为。Ezip 之类的。

对于1和2,你可以使用上面提到的 奇尔卡特解决方案,或者等价的解决方案。 但是请注意,chillkat 不是纯 Java 解决方案,它使用 JNI。

附加信息: 我谷歌了一下,确实,这是一个相当普遍的问题,似乎没有免费的解决方案(还没有?).

现在,Zip 加密的标准算法已经得到了很好的定义: 请参见 PKWARE 的 申请须知。ZIP 文件格式。看起来像是加密了的数据流。如果有人想编码..。

现在,我想知道为什么 Sun 没有把它包含在它的库中?缺乏标准?专利/法律问题?太虚弱了,不能用吗?

这不是一个答案,但是在评估可能的解决方案时要谨记这一点。

关于压缩加密,有一点很重要:

有几种类型的压缩加密。旧的类型(原始压缩标准的一部分)根本不值得费心(它可以在不到10分钟破解与应用程序很容易在线)。

如果您正在对压缩文件进行任何类型的加密,请确保您使用的是强大的加密标准之一(我相信 WinZip 的128位和256位 AES 标准是最好的支持)。下面是 技术规格-我们在开发我们自己的 Java 加密压缩系统时使用了它(不能提供源代码-抱歉-它只是内部使用)

唯一比没有加密更糟糕的是认为自己有加密,结果却错了: -)

2020年更新: 现在还有其他选择,特别是 Zip4J


经过反复研究,我发现了三种方法:

一组免费提供的源代码,适用于单个压缩文件。但是,没有许可证。使用方法是层叠加密(...)。 Http://merkert.de/de/info/zipaes/src.zip (https://forums.oracle.com/forums/thread.jspa?threadID=1526137)

更新: 这段代码现在是 Apache 许可的,并在 https://github.com/mobsandgeeks/winzipaes发布(从原来的家中导出,在 谷歌代码)。它对我很有效(zip 中的一个文件) ,并且很好地填补了 Java 打开源代码库的一个空白。

一个商业产品(在写这篇文章的时候是500美元)。我无法验证这是否有效,因为他们的试用许可方法很复杂。它也是一个移植的。NET 应用程序: Http://www.nsoftware.com/ipworks/zip/default.aspx

一个商业产品(写这篇文章的时候是290美元)。只适用于 Windows,因为它使用了 dll: Http://www.example-code.com/java/zip.asp

您可以尝试使用 Zip4j,这是一个处理 zip 文件的纯 Java 库。它支持 PKWare 和 AES 加密方法的加密/解密。

主要特点:

  • 从 Zip 文件中创建、添加、提取、更新、删除文件
  • 读/写受密码保护的 Zip 文件
  • 支持 AES 128/256加密
  • 支持标准压缩加密
  • 支持 Zip64格式
  • 支持存储(无压缩)和收缩压缩方法
  • 从 Split Zip 文件(Ex: z01,z02,... Zip)创建或解压缩文件
  • 支持 Unicode 文件名
  • 进度监视器

驾照:

下面是一个使用 winzipaes 1.0.1的例子。 请注意,这只是一个要点,我还没有测试这个代码的确切形式。

import de.idyl.winzipaes.AesZipFileEncrypter;
import de.idyl.winzipaes.impl.AESEncrypterBC;


File aNewZipFile = new File("/tmp/foo.zip");
File existingUnzippedFile = new File("/tmp/src.txt");


// We use the bouncy castle encrypter, as opposed to the JCA encrypter
AESEncrypterBC encrypter = new AESEncrypterBC();
encrypter.init("my-password", 0);  // The 0 is keySize, it is ignored for AESEncrypterBC


AesZipFileEncrypter zipEncrypter = new AesZipFileEncrypter(aNewZipFile, encrypter);
zipEncrypter.add(existingUnzippedFile, "src.txt", "my-password");


// remember to close the zipEncrypter
zipEncrypter.close();

您可以使用 Winzip (v9 +)或7za (即7zip)在 Mac 上解压缩“/tmp/foo.zip”,使用密码“ my-password”。

注意: 我不清楚为什么需要在上面的代码中指定两次密码。我不知道如果你在这两个地方使用不同的密码会发生什么。