2012-08-12 10 views
6

Zajmuję się tworzeniem aplikacji, która powinna szyfrować niektóre małe (mniej niż 1 MB) i duże (około 500 MB) pliki.
Jak skutecznie szyfrować pliki i zapisywać zaszyfrowaną wersję na dysku (np.
Czy mogę wprowadzić szyfrowanie, jeśli zajęło to trochę czasu?Efektywne szyfrowanie plików za pomocą AES w java

+0

Ile bezpieczeństwo potrzebujesz? Zasadniczo im słabsze jest szyfrowanie, tym szybciej ono będzie i na odwrót. –

+1

Możesz użyć 'BouncyCastel' API. –

+0

@NoxHarmonium: Jak mam to zmierzyć? ;-) Potrzebuję plików, które będą tak bezpieczne, jak to tylko możliwe. Nie obchodzi mnie, że szyfrowanie jest powolne. Chcę tylko, żeby działało z maksymalną szybkością. (Mam na myśli coś w rodzaju kopiowania plików za pomocą 'java.io' i' java.nio') – RYN

Odpowiedz

6

Zakładając, że masz klucz AES i strumień wyjściowy, oto, jak możesz dodać dekorator szyfrowania do strumienia.

Cipher enc = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
enc.init(Cipher.ENCRYPT_MODE, key); 
AlgorithmParameters params = enc.getParameters(); 
IvParameterSpec iv = params.getParameterSpec(IvParameterSpec.class); 
out.write(iv.getIV()); 
out = new CipherOutputStream(enc, out); 

To dodaje IV do początku tekstu zaszyfrowanego; podczas deszyfrowania musisz je przeanalizować, aby zainicjować szyfr.

Lepszym rozwiązaniem, długotrwałym, byłoby korzystanie z biblioteki implementującej składnię wiadomości kryptograficznych, która jest podstawą S/MIME. Zapisuje metadane dotyczące algorytmów i kluczy, które mogą być użyte do odszyfrowania.

Polecam również tryb AEAD, taki jak GCM lub CCM, jeśli dostawca go wdroży. (The SunJCE does not.) Te zweryfikują, że plik został odszyfrowany poprawnie i nie został uszkodzony.

+0

@owlstead Wiem, że API jest już dostępne dla GCM i oczekiwałem, że SunJCE je dostarczy, ale kiedy poszedłem sprawdzić, nie mogłem znaleźć wzmianki o tym [w dokumentacji.] (Http://docs.oracle. com/javase/7/docs/technotes/guides/security/SunProviders.html) Czy znasz jakieś zobowiązanie firmy Oracle do dostarczenia jej za pośrednictwem dołączonego dostawcy JCE? – erickson

+1

Ups, przepraszam, prawdopodobnie użyłem tam niestandardowej ścieżki kompilacji. Od źródła: "* Java SE już zdefiniowała interfejsy AEAD/GCM w JDK 7. W JDK 8 dostawcy JCA/JCE będą implementować te interfejsy AEAD/GCM. Prawdopodobnie dodamy dodatkowe mechanizmy dla PKCS11, jeśli Obecny standard PKCS11 go obsługuje. * " –

+0

Oczywiście interfejs API Zamka Bouncy zawiera implementację do wykonywania trybu GCM. Postaram się go zbudować na dostawcę po zakończeniu mojej klasy kryptograficznej uniwersytetu Standford. –

2

Jak wspomniano wyżej o Bhaviku, BouncyCastle byłby dobrym rozwiązaniem, lekkim i dojrzałym. Zdecydowanie widać postęp szyfrowania, ponieważ możesz kontrolować ile przeczytać i pisać jednocześnie. Można odczytywać bajty z pliku, szyfrować je i zapisywać do innego pliku w potoku.

Przykładem tego jest wymieniona w tym pytaniu: How to encrypt a string/stream with bouncycastle pgp without starting with a file

Powiązane problemy