Я разрабатываю приложение для Android, которое требует распаковки зашифрованных zip-файлов AES-256. Существуют ли какие-либо библиотеки, которые я могу использовать для этого?
Я очень признателен за любое руководство или помощь.
Я разрабатываю приложение для Android, которое требует распаковки зашифрованных zip-файлов AES-256. Существуют ли какие-либо библиотеки, которые я могу использовать для этого?
Я очень признателен за любое руководство или помощь.
zip4j, библиотека Java для обработки Zip-файлов (с открытым исходным кодом, лицензия Apache v2.0).
Вы можете скачать бинарники, исходники и примеры.
В итоге я использовал внешнюю библиотеку по адресу http://code.google.com/p/winzipaes/
он ограничен сжатием/распаковкой Zip-файлов, зашифрованных с помощью AES-256 ТОЛЬКО
но, по крайней мере, это соответствует моей потребности.
Это зависит от вашей кодировки зашифрованных zip-файлов. Будьте более конкретными, пожалуйста. Если он сжимается, а затем шифруется, вы распаковываете, а затем расшифровываете файл, используя java.util.zip.GZIPInputStream
Насколько я помню, ZIP-файлы, зашифрованные AES, впервые были представлены WinZip несколько лет назад. На домашней странице WinZip есть подробное объяснение того, чем ZIP-файлы, зашифрованные AES, отличаются от стандартных ZIP-файлов:
http://www.winzip.com/aes_info.htm
Я работаю над обычной JRE. Используя http://www.lingala.net/zip4j/, следующий код работает для расшифровки почтового индекса. файл:
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
}
У меня похожая проблема, я много искал и тестировал все эти решения, но они мне не помогли. Наконец, я нашел решение и хочу поделиться им здесь, возможно, оно поможет другим.
В моем случае у меня есть зашифрованный zip-файл AES-256.
Когда я использовал последнюю версию zip4j, я столкнулся с этим исключением:
Zip4j не поддерживает сильное шифрование
zip4j код:
net.lingala.zip4j.ZipFile zipFile = new ZipFile("sourceAddress", "password".toCharArray());
zipFile.extractAll("destinationAddress");
После этого я протестировал winzipaes и столкнулся с этой ошибкой:
дополнительное поле имеет длину 0 - это, вероятно, не зашифрованная запись WinZip AES
код винзипа:
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);
}
}
}
Я еще не тестировал его, но некоторое время назад нашел это.
Я надеюсь, что это может помочь вам