Mahlzeit!
Ich will eine Datei (bzw. mehrere) einlesen, dann komprimieren und schlussendlich verschlüsselt an einem anderen Ort ablegen, ohne irgendein Zwischenprodukt zwischen zu speichern. Mein Problem ist, dass die resultierende zip-datei fehlerhaft und auch nicht komprimiert ist (habe eine testdatei mit 350mb die eigentlich auf 45mb schrumpfen sollte)
Verschlüsselung:
Komprimierung:
und der Aufruf:
Ich will eine Datei (bzw. mehrere) einlesen, dann komprimieren und schlussendlich verschlüsselt an einem anderen Ort ablegen, ohne irgendein Zwischenprodukt zwischen zu speichern. Mein Problem ist, dass die resultierende zip-datei fehlerhaft und auch nicht komprimiert ist (habe eine testdatei mit 350mb die eigentlich auf 45mb schrumpfen sollte)
Verschlüsselung:
Java:
public static OutputStream encryptOutputStream(OutputStream os) throws NoSuchAlgorithmException,
NoSuchPaddingException, InvalidKeyException, IOException, IllegalBlockSizeException, Exception
{
// temporaeren AES Key erzeugen
KeyGenerator keygen = KeyGenerator.getInstance("AES");
SecureRandom random = new SecureRandom();
keygen.init(random);
SecretKey key = keygen.generateKey();
// mit RSA verschluesseln und an Empfaenger senden
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.WRAP_MODE,getKeyPair().getPublic());
byte[] encryptedAesKey = cipher.wrap(key);
os.write(encryptedAesKey);
// eigentliche Nachricht mit AES verschluesseln
cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE,key);
os = new CipherOutputStream(os, cipher);
return os;
}
Komprimierung:
Java:
public static void compressZip(List<File> source, File target1, File target2) throws Exception
{
//TeeOutputStream zum glz. Ablegen an zwei verschiedenen Orten zwecks doppelter Datensicherung
TeeOutputStream tee = new TeeOutputStream(new BufferedOutputStream(new FileOutputStream(target1)),
new BufferedOutputStream(new FileOutputStream(target2)));
ZipArchiveOutputStream teezip = new ZipArchiveOutputStream(tee);
for (File file : source)
{
teezip.putArchiveEntry(new ZipArchiveEntry(file.getPath()));
IOUtils.copy(new BufferedInputStream(new FileInputStream(new File(file.getPath()))),
CryptographyUtils.encryptOutputStream(tee));
}
teezip.closeArchiveEntry();
teezip.finish();
teezip.close();
tee.close();
}
und der Aufruf:
Java:
List<File> source = new ArrayList<File>();
File source1 = new File("testdatei.bin");
File source2 = new File("testdatei.hdr");
source.add(source1);
source.add(source2);
File target1 = new File("compressed_encrypted1.zip");
File target2 = new File("compressed_encrypted2.zip");
try
{
compressZip(source,target1,target2);
}
catch (Exception e)
{
e.printStackTrace();
}