Tworzenie archiwum zip z hasłem

0

Cześć
Potrzebuję utworzyć archiwum zip z hasłem, plik potem chcę rozpakować np. 7zip-em. Próbowałem rozwiązania ze strony http://java.sys-con.com/node/1258827 , ale nie mogę znaleźć wszystkich opisanych tam plików *.jar aby to przetestować. Próbowałem korzystać z zip4j ale kod:

public void create()
    {
        try {
            
            ZipFile zipFile = new ZipFile("D:\\plik.zip");
            File fileToAdd = new File("D:\\test.txt");
            
            ZipParameters parameters = new ZipParameters();
            parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
            parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
            parameters.setEncryptFiles(true);
            parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_STANDARD);
            parameters.setPassword("mdmd");
            zipFile.addFile(fileToAdd, parameters);
        } catch (ZipException e) {
            e.printStackTrace();
        }
    }
   

Zwraca wyjątek:

net.lingala.zip4j.exception.ZipException: Probably not a zip file or a corrupted zip file
	at net.lingala.zip4j.core.HeaderReader.readEndOfCentralDirectoryRecord(HeaderReader.java:179)
	at net.lingala.zip4j.core.HeaderReader.readAllHeaders(HeaderReader.java:78)
	at net.lingala.zip4j.core.ZipFile.readZipInfo(ZipFile.java:425)
	at net.lingala.zip4j.core.ZipFile.checkZipModel(ZipFile.java:935)
	at net.lingala.zip4j.core.ZipFile.addFiles(ZipFile.java:263)
	at net.lingala.zip4j.core.ZipFile.addFile(ZipFile.java:250)
	at pl.zus.moral.zip.Zip.create(Zip.java:37)
	at pl.zus.moral.zip.ZipMain.main(ZipMain.java:19)
Caused by: java.io.IOException: Negative seek offset
	at java.io.RandomAccessFile.seek(Native Method)
	at net.lingala.zip4j.core.HeaderReader.readEndOfCentralDirectoryRecord(HeaderReader.java:117)
	... 7 more

Polećcie jakieś książki (mogą być anglojęzyczne) lub strony gdzie opisane jest tworzenie archiwum z hasłem. Najlepszym rozwiązaniem by było "dodanie hasła" do istniejącego pliku zip.

0

Problem rozwiązany, może komuś się przyda. Korzystając z artykułu wspomnianego wcześniej (http://java.sys-con.com/node/1258827) zmieniłem oryginalną metodę "zipDirWithPassword" na:

public void zipDirWithPassword( String dirName , String zipFileName , String password)
{
if( zipFileName == null )
{
File tempFile = new File(dirName);
zipFileName = tempFile.getAbsoluteFile().getParent() +File.separator+tempFile.getName()+".zip";
}
zipDir(dirName, zipFileName);
String tempZipFileName = new File( dirName ).getAbsoluteFile() .getParent()+File.separator+"tempencrypted.zip";
try
{
    /*
AesZipFileEncrypter enc = new AesZipFileEncrypter (tempZipFileName);
enc.addEncrypted( new File(zipFileName), password);
*/
    AESEncrypter aesEncrypter = new AESEncrypterBC();
    aesEncrypter.init(password, 0);
    AesZipFileEncrypter ze = new AesZipFileEncrypter(tempZipFileName,aesEncrypter);
    ze.addAll(new File(zipFileName),password);
    
    ze.close();
new File(zipFileName).delete();
new File( tempZipFileName ).renameTo( new File (zipFileName));
}
catch (IOException e) 
{
e.printStackTrace();
}
}

W moim przypadku jest to rozwiązanie wystarczające ze względu na to, że pliki rozpakowywane będą zewnętrznym programem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1