我正在开发一个Android应用程序,需要解压缩 AES-256 加密的zip文件,有没有我可以用来完成它的库?
我非常感谢任何指导或帮助。
答案 0 :(得分:6)
zip4j ,用于处理Zip文件的java库(开源,Apache License v2.0)。
您可以下载二进制文件,来源和示例。
答案 1 :(得分:5)
答案 2 :(得分:1)
这取决于您对加密zip文件的编码。请更具体一点。 如果其压缩然后加密,则解压缩然后使用java.util.zip.GZIPInputStream
解密文件答案 3 :(得分:0)
据我所知,AES加密的ZIP文件是WinZip第一次推出的。 在WinZip主页上,详细说明了AES加密的ZIP文件与标准ZIP文件的不同之处:
答案 4 :(得分:0)
我正在使用普通的JRE。使用http://www.lingala.net/zip4j/,以下代码可解密zip文件:
ZipFile zipFile = new ZipFile(zipFile);
zipFile.setPassword(password);
for (Object fileHeaderObj : zipFile.getFileHeaders()) {
FileHeader fileHeader = (FileHeader) fileHeaderObj;
String fileName = fileHeader.getFileName();
ZipInputStream zipIn = zipFile.getInputStream(fileHeader);
// do whatever with the input stream
}
答案 5 :(得分:0)
我遇到了类似的问题,进行了很多搜索并测试了所有这些解决方案,但它们并没有帮助我。 最后,我找到了一个解决方案,我想在这里分享它,也许可以帮助其他人。
就我而言,我有一个AES-256加密的zip文件。
当我使用最新版本的zip4j时,我遇到了以下异常:
Zip4j不支持强加密
zip4j代码:
net.lingala.zip4j.ZipFile zipFile = new ZipFile("sourceAddress", "password".toCharArray());
zipFile.extractAll("destinationAddress");
此后,我测试了winzipaes,然后遇到此错误:
额外字段的长度为0-这可能不是WinZip AES加密条目
winzipaes代码:
final File dbFile = new File("destinationFile");
AesZipFileDecrypter ze = null;
try {
ze = new AesZipFileDecrypter(new File("sourceAddress"), new AESDecrypterBC());
ExtZipEntry entry = ze.getEntry(dbFile.getName());
ze.extractEntry(entry, dbFile, "password");
} catch (DataFormatException | IOException e) {
e.printStackTrace();
} finally {
if (ze != null) {
try {
ze.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
最后,我找到了sevenzipjbind,它对我有用。
最终代码:
RandomAccessFile randomAccessFile = null;
IInArchive inArchive = null;
try {
randomAccessFile = new RandomAccessFile(fileAddress, "r");
inArchive = SevenZip.openInArchive(null, // autodetect archive type
new RandomAccessFileInStream(randomAccessFile));
// Getting simple interface of the archive inArchive
ISimpleInArchive simpleInArchive = inArchive.getSimpleInterface();
System.out.println(" Hash | Size | Filename");
System.out.println("----------+------------+---------");
for (ISimpleInArchiveItem item : simpleInArchive.getArchiveItems()) {
final int[] hash = new int[] { 0 };
if (!item.isFolder()) {
ExtractOperationResult result;
result = item.extractSlow(new ISequentialOutStream() {
public int write(byte[] data) throws SevenZipException {
InputStream myInputStream = new ByteArrayInputStream(data);
try {
byte[] buffer = new byte[myInputStream.available()];
myInputStream.read(buffer);
File targetFile = new File(destinationAddress + item.getPath());
OutputStream outStream = new FileOutputStream(targetFile);
outStream.write(buffer);
} catch (IOException e) {
e.printStackTrace();
}
return data.length; // Return amount of consumed data
}
},password);
if (result == ExtractOperationResult.OK) {
System.out.printf("%9X | %s%n",
hash[0], item.getPath());
} else {
System.err.println("Error extracting item: " + result);
}
}
}
} catch (Exception e) {
System.err.println("Error occurs: " + e);
} finally {
if (inArchive != null) {
try {
inArchive.close();
} catch (SevenZipException e) {
System.err.println("Error closing archive: " + e);
}
}
if (randomAccessFile != null) {
try {
randomAccessFile.close();
} catch (IOException e) {
System.err.println("Error closing file: " + e);
}
}
}
答案 6 :(得分:-2)
我还没有测试过,但前段时间我找到了this。
我希望它可以帮到你