2013-05-14 16 views
5

Używam CipherOutputStream do szyfrowania i odszyfrowywania plików w java, ale plik wejściowy> 117 bajtów nie może szyfrować. Używam klucza publicznego algorytmu RSA o długości 1024 bajtów.Jak wykonać szyfrowanie i deszyfrowanie pliku?

cipher.init(Cipher.ENCRYPT_MODE, secKey); 

String cleartextFile = "cleartext.txt"; 
String ciphertextFile = "ciphertextSymm.txt"; 

FileInputStream fis = new FileInputStream(cleartextFile); 
FileOutputStream fos = new FileOutputStream(ciphertextFile); 
CipherOutputStream cos = new CipherOutputStream(fos, cipher); 

byte[] block = new byte[8]; 
int i; 
while ((i = fis.read(block)) != -1) { 
     cos.write(block, 0, i); 
} 
cos.close(); 

Jak szyfrowania input plików length> 117 bajtów?

+5

wow, to świetnie. Jakie jest pytanie? –

+3

RSA ** nie jest ** przeznaczony do szyfrowania plików. Po prostu użyj algorytmu symetrycznego (AES, Blowfish, itp.) Do zaszyfrowania pliku i użyj RSA tylko na tym kluczu symetrycznym, jeśli potrzebujesz szyfrowania symetrycznego. – zakinster

Odpowiedz

21

Nie można zaszyfrować pliku za pomocą RSA, ponieważ RSA (no, dokładniej, implementacja implementacji RSA w Javie) nie pozwala na szyfrowanie większej ilości danych niż długość klucza. W przypadku klucza o rozmiarze 1024 bity można szyfrować tylko 1024 bity, czyli około 128 bajtów (w rzeczywistości nieco mniej ze względu na wypełnienie).

We wszystkich przypadkach, źle jest zaszyfrować dużą część danych za pomocą algorytmu klucza publicznego (asymetryczna kryptografia) z dwóch głównych powodów.

  1. IS nie praktyczne, odpowiednie i bezpiecznetryb kryptograficzny/wyściółka do szyfrowania dużych ilości danych za pomocą RSA (czyli tak naprawdę nie jest bezpieczne, aby to zrobić).

  2. Algorytmy klucza publicznego wymagają zabezpieczenia dużego klucza (1024 bity, 2048 bitów) i dlatego są znacznie wolniejsze od algorytmów z kluczem symetrycznym (które wymagają tylko kluczy o długości od 128 do 256 bitów, aby były bezpieczne).

Jeśli chcesz więcej szczegółów na temat, dlaczego nie powinno się używać wyłącznie RSA do szyfrowania dużych ilości danych, zobacz te dwie wielkie posty stacktexchange:

Jeśli chcesz zaszyfrować dużą ilość danych, standardowym sposobem postępowania jest wygenerowanie klucza sesji (kryptografu ically bezpieczna liczba losowa używana raz). Szyfrujesz klucz sesji za pomocą klucza publicznego. Następnie zaszyfrujesz plik (duża ilość danych) za pomocą algorytmu symetrycznego (takiego AES), używając niezaszyfrowanego klucza sesji. Następnie przechowujesz zaszyfrowany klucz sesji i zaszyfrowane dane w ostatecznym pliku. W ten sposób przebiega PGP (lub GnuPG), gdy wysyła zaszyfrowaną pocztę. SSL/TLS działa również w podobny sposób.

Wreszcie, prawidłowe użycie kryptografii jest skomplikowane (prawie wszystko może stworzyć lukę w zabezpieczeniach: tryby szyfrowania, dopełnienia itp.), Więc radzę zachować ostrożność i upewnić się, że kod zostanie sprawdzony przez kogoś znającego się na sprawach kryptograficznych.

Oto fragment kodu, który pokazuje ogólny proces:

// 1. Generate a session key 
KeyGenerator keyGen = KeyGenerator.getInstance("AES"); 
keyGen.init(128) 
SecretKey sessionKey = keyGen.generateKey(); 

// 2. Encrypt the session key with the RSA public key 
Cipher rsaCipher = Cipher.getInstance("RSA"); 
rsaCipher.init(Cipher.ENCRYPT_MODE, rsaPublicKey) 
byte[] encryptedSessionKey = rsaCipher.doFinal(sessionKey.getEncoded()); 

// 3. Encrypt the data using the session key (unencrypted) 
Cipher aesCipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
aesCipher.init(Cipher.ENCRYPT_MODE, sessionKey); <-- sessionKey is the unencrypted 
//             session key. 
// ... use aesCipher to encrypt your data 

// 4. Save the encrypted data along with the encrypted 
// session key (encryptedSessionKey). 
// PLEASE NOTE THAT BECAUSE OF THE ENCRYPTION MODE (CBC), 
// YOU ALSO NEED TO ALSO SAVE THE IV (INITIALIZATION VECTOR). 
// aesCipher.aesCipher.getParameters(). 
//  getParametersSpec(IvParameters.class).getIV(); 
+0

Ten post wyjaśnia, dlaczego RSA nie jest używane do szyfrowania dużych danych (ignorując przyczynę wydajności): http://crypto.stackexchange.com/a/126/6933 – nhahtdh

+0

Inne powiązane pytanie: http: //crypto.stackexchange.com/questions/2789/is-rsa-in-a-ecb-like-mode-safe-for-bulk-encryption – nhahtdh

+0

@nhahtdh: Pomyśl o tym, że dwa znalezione posty są bardzo interesujące, mam zamiar połączyć je w moim poście (oczywiście dając ci kredyt). – Xion345

Powiązane problemy