Dateien komprimieren und verschlüsseln

Colt45

Aktives Mitglied
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:
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();
}
 
Jo, hab ich im Nachhinein auch bemerkt. Habs jetzt nun auch so halbwegs gelöst, allerdings hab ich noch etwas merkwürdiges Verhalten. Ich bekomme als output eine (bzw. zwei) komprimiert&verschlüsselte zip-dateien, die ich natürlich nicht öffnen kann (so solls ja auch sein). Wenn ich diese Dateien dann allerdings entschlüsseln will, kann ich die resultierende zip-datei auch nich öffnen.

Verschlüsselung:
Java:
	public static OutputStream encryptOutputStream(OutputStream os, SecretKey key) throws NoSuchAlgorithmException,
			NoSuchPaddingException, InvalidKeyException, IOException, IllegalBlockSizeException, Exception
	{
		Cipher cipher = Cipher.getInstance("AES");
		cipher.init(Cipher.ENCRYPT_MODE,key);
		os = new CipherOutputStream(os, cipher);

		return os;
	}

Komprimierung:
Java:
public static void compressZip(File source, File target1, File target2, SecretKey key) throws Exception
	{
		TeeOutputStream teeout = new TeeOutputStream(new BufferedOutputStream(new FileOutputStream(target1)),
				new BufferedOutputStream(new FileOutputStream(target2)));

		OutputStream encout = CryptographyUtils.encryptOutputStream(teeout,key);

		ZipArchiveOutputStream zipout = new ZipArchiveOutputStream(encout);

		zipout.putArchiveEntry(new ZipArchiveEntry(source.getPath()));
		IOUtils.copy(new FileInputStream(new File(source.getPath())),zipout);
		zipout.closeArchiveEntry();
		zipout.finish();

		teeout.close();
	}

Entschlüsselung:
Java:
	public static InputStream decryptInputStream(InputStream is, SecretKey key) throws Exception
	{
		try
		{
			Cipher cipher = Cipher.getInstance("AES");
			cipher.init(Cipher.DECRYPT_MODE,key);

			is = new CipherInputStream(is, cipher);
		}
		catch (Exception e)
		{
			throw new Exception("Fehler beim Entschluesseln: " + e.getMessage());
		}

		return is;
	}

Aufruf:
Java:
File source = new File("file.bin");
File target1 = new File(source + "1.zip");
File target2 = new File(source + "2.zip");

try
{

		KeyGenerator keygen = KeyGenerator.getInstance("AES");
		SecureRandom random = new SecureRandom();
		keygen.init(random);
		SecretKey key = keygen.generateKey();
		CompressorUtils.compressZip(source1,target1,target2,key);

		FileInputStream fis = new FileInputStream(target1);
			
		IOUtils.copy(CryptographyUtils.decryptInputStream(fis,key),new FileOutputStream("compressed.zip"));
}
catch (Exception e)
{
	e.printStackTrace();
}
 

Neue Themen


Zurück
Oben