2010-01-12 22 views
11

Czy ktoś może mi pokazać (lub podać link do) przykład szyfrowania pliku w Javie za pomocą dmuchanego zamku? Zerknąłem na bouncycastle.org, ale nie mogę znaleźć dokumentacji ich API. Nawet samo zorientowanie się, które zajęcia będą dla mnie przydatne, jest dla mnie wielką pomocą!Przykład szyfrowania pliku XML w Javie przy użyciu dmuchanego zamku

+0

Idź z linkami cb160, a także upewnij się, aby uzyskać kod źródłowy dla bouncycastle. Dokumentacja API jest przeważnie słaba i często bardzo słaba. Jednak kod źródłowy jest dość czytelny i często używałam go do odpowiadania na pytania typu "jakiego rodzaju CipherParameters potrzebuje RijndaelEngine?". Wystarczy spojrzeć na odpowiednią metodę Rijndael i będzie to oczywiste. –

Odpowiedz

19

Jaki typ szyfrowania chcesz wykonać? Oparte na haśle (PBE), symetryczne, asymetryczne? Wszystko zależy od konfiguracji Cipher.

Nie powinieneś używać żadnych specjalnych API BouncyCastle, tylko te algorytmy, które zapewnia. Oto przykład, który używa szyfru BouncyCastle PBE do zaszyfrowania String:

import java.security.SecureRandom; 
import java.security.Security; 

import javax.crypto.Cipher; 
import javax.crypto.SecretKey; 
import javax.crypto.SecretKeyFactory; 
import javax.crypto.spec.IvParameterSpec; 
import javax.crypto.spec.PBEKeySpec; 

import org.bouncycastle.jce.provider.BouncyCastleProvider; 

public class PBE { 

    private static final String salt = "A long, but constant phrase that will be used each time as the salt."; 
    private static final int iterations = 2000; 
    private static final int keyLength = 256; 
    private static final SecureRandom random = new SecureRandom(); 

    public static void main(String [] args) throws Exception { 
     Security.insertProviderAt(new BouncyCastleProvider(), 1); 

     String passphrase = "The quick brown fox jumped over the lazy brown dog"; 
     String plaintext = "hello world"; 
     byte [] ciphertext = encrypt(passphrase, plaintext); 
     String recoveredPlaintext = decrypt(passphrase, ciphertext); 

     System.out.println(recoveredPlaintext); 
    } 

    private static byte [] encrypt(String passphrase, String plaintext) throws Exception { 
     SecretKey key = generateKey(passphrase); 

     Cipher cipher = Cipher.getInstance("AES/CTR/NOPADDING"); 
     cipher.init(Cipher.ENCRYPT_MODE, key, generateIV(cipher), random); 
     return cipher.doFinal(plaintext.getBytes()); 
    } 

    private static String decrypt(String passphrase, byte [] ciphertext) throws Exception { 
     SecretKey key = generateKey(passphrase); 

     Cipher cipher = Cipher.getInstance("AES/CTR/NOPADDING"); 
     cipher.init(Cipher.DECRYPT_MODE, key, generateIV(cipher), random); 
     return new String(cipher.doFinal(ciphertext)); 
    } 

    private static SecretKey generateKey(String passphrase) throws Exception { 
     PBEKeySpec keySpec = new PBEKeySpec(passphrase.toCharArray(), salt.getBytes(), iterations, keyLength); 
     SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWITHSHA256AND256BITAES-CBC-BC"); 
     return keyFactory.generateSecret(keySpec); 
    } 

    private static IvParameterSpec generateIV(Cipher cipher) throws Exception { 
     byte [] ivBytes = new byte[cipher.getBlockSize()]; 
     random.nextBytes(ivBytes); 
     return new IvParameterSpec(ivBytes); 
    } 

} 
+2

Sól nie powinna być stała .. –

+1

Jeśli otrzymujesz java.security.InvalidKeyException: Nielegalny rozmiar klucza ref: http://stackoverflow.com/a/6481658/234110 –

-1

Chociaż to odpowiedź pośrednia na pytanie, być może przekonasz się, że warto korzystać z jasypt obsługiwać szyfrowanie.

oto przykład jak zaszyfrować plik, używając jasypt: http://www.jasypt.org/encrypting-configuration.html

A oto jak skonfigurować nadmuchiwany zamek jako dostawca dla jasypt: http://www.jasypt.org/bouncy-castle.html

+1

Druga biblioteka trzeciej strony, aby wyodrębnić pierwszą prawdopodobnie niepotrzebna biblioteka innych firm? Brzmi jak bardzo dobry pomysł. – jarnbjo

+0

Używamy jasypt i BouncyCastle. Jasiupt obsługuje przezroczyste szyfrowanie i odszyfrowywanie kolumn bazy danych za pomocą Hibernate, a BouncyCastle dokonuje rzeczywistego szyfrowania i deszyfrowania. – Omniwombat

1

Jeśli nie mają jakiś szczególny powód używania BountyCastle, można znaleźć dobry tutorial i podstawowe informacje na temat wbudowanej w Javę obsługi kryptografii z kilkoma przykładami kodu: here.

+0

Warto zauważyć, że BouncyCastle to po prostu "dostawca", który działa w ramach wbudowanej struktury kryptograficznej (JCE). Jest często używany, ponieważ zawiera bardziej kompletny zestaw prymitywów niż domyślny dostawca. – caf

+0

BouncyCastle nie jest "tylko dostawcą". Możesz również skorzystać z funkcji kryptografii BouncyCastle za pośrednictwem swojego zastrzeżonego API. Masz rację, że BouncyCastle zapewnia dodatkowe algorytmy kryptograficzne, ale rzadko widziałem jakąś realną potrzebę. Częściej niż BouncyCastle jest używany do funkcjonalności już dostarczonych przez standardowych dostawców zabezpieczeń wbudowanych API i VM. – jarnbjo

1

Najlepszym miejscem, aby znaleźć przykłady kodu Java nadmuchiwany zamek jest przejść przypadków testowych w pakiecie próbnym nadmuchiwany zamek Bouncy Castle latest release java

Te zestawy testów zawierają non przestarzałej kod, który może być używany łatwo

Powiązane problemy