#java #zip #truezip #truevfs
#java #zip #truezip #truevfs
Вопрос:
import net.java.truevfs.comp.zip.ZipOutputStream;
...
ZipOutputStream zos = new ZipOutputStream(outPipe);
zos.setCryptoParameters( ## How to create those Crypto Parameters ### );
Криптопараметры должны быть интерфейса. ZipCryptoParameters
Класс KeyManagerZipCryptoParameters
реализует это, но мне не нужен keymanager, я просто хочу просто жестко закодировать определенный пароль.
Как я могу это сделать?
Редактировать
Я попытался
private static final class CustomWinZipAesParameters
implements WinZipAesParameters {
final byte[] password;
CustomWinZipAesParameters(final byte[] password) {
this.password = password.clone();
}
@Override
public byte[] getWritePassword(String name)
throws ZipKeyException {
return password.clone();
}
@Override
public byte[] getReadPassword(String name, boolean invalid)
throws ZipKeyException {
if (invalid)
throw new ZipKeyException(name " (invalid password)");
return password.clone();
}
@Override
public AesKeyStrength getKeyStrength(String arg0)
throws ZipKeyException {
return AesKeyStrength.BITS_128;
}
@Override
public void setKeyStrength(String name, AesKeyStrength keyStrength)
throws ZipKeyException {
// We have been using only 128 bits to create archive entries.
assert AesKeyStrength.BITS_128 == keyStrength;
}
} // CustomWinZipAesParameters
а затем
byte[] ba = {64, 64, 64, 64, 64};
zos.setCryptoParameters(new CustomWinZipAesParameters(ba));
Но полученный ZIP-файл просто не зашифрован.
Ответ №1:
Я просто установил зашифрованный флаг для каждого файла. (в дополнение к моему редактированию выше). Тогда это сработает.
Осторожно: я могу извлечь файл только с 7z
помощью — не с unzip
помощью команды в Linux (в противном случае я получаю «неподдерживаемый метод сжатия 99»)
File file = new File(contentManager.getOsmAndFilePlain());
ZipEntry ze = new ZipEntry(ContentManager.PRO_APP_FILENAME);
ze.setEncrypted(true); ## this line inserted
zos.putNextEntry(ze);