2010-01-12 9 views
11

Qualcuno può mostrarmi (o fornire un collegamento a) un esempio di come crittografare un file in Java utilizzando il castello rimbalzante? Ho cercato su bouncycastle.org ma non ho trovato alcuna documentazione della loro API. Anche solo sapere quali classi utilizzare sarebbe di grande aiuto per me iniziare!Un esempio di crittografia di un file xml in Java utilizzando il castello rimbalzante

+0

Vai con i link di cb160 e assicurati anche di ottenere il codice sorgente per bouncycastle. La documentazione dell'API è in gran parte povera e spesso molto povera. Tuttavia, il codice sorgente è abbastanza leggibile e l'ho usato spesso per rispondere a domande come "che tipo di CipherParameters ha bisogno il RijndaelEngine?". Basta guardare il metodo Rijndael pertinente e sarà ovvio. –

risposta

19

Che tipo di crittografia si desidera eseguire? Basato su password (PBE), simmetrico, asimmetrico? È tutto in come si configura lo Cipher.

Non è necessario utilizzare alcuna API specifica BouncyCastle, solo gli algoritmi forniti. Ecco un esempio che utilizza il cifrario BouncyCastle PBE per cifrare una stringa:

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

Sale non dovrebbe essere costante .. –

+1

Se si ottiene java.security.InvalidKeyException: Dimensione chiave illegale rif: http://stackoverflow.com/a/6481658/234110 –

-1

Mentre è una risposta indiretta alla tua domanda, forse lo troverete utile usare jasypt per gestire la crittografia.

Ecco un esempio di come crittografare un file utilizzando jasypt: http://www.jasypt.org/encrypting-configuration.html

Ed, ecco come configurare castello gonfiabile come un provider per jasypt: http://www.jasypt.org/bouncy-castle.html

+1

Una seconda libreria di terze parti per astrarre il primo probabilmente libreria di terze parti non richiesta? Sembra un'ottima idea. – jarnbjo

+0

Utilizziamo jasypt e BouncyCastle. Jasypt gestisce la crittografia e la decrittazione trasparenti delle colonne del database con Hibernate e BouncyCastle esegue la crittografia e la decrittografia effettive. – Omniwombat

1

Se non lo fai avere una ragione particolare per l'utilizzo di BountyCastle, è possibile trovare un buon tutorial e informazioni di base sul supporto crittografico integrato Java con diversi esempi di codice here.

+0

Vale la pena sottolineare che BouncyCastle è solo un "fornitore" che funziona all'interno del framework di crittografia incorporato (JCE). Viene spesso utilizzato perché contiene una suite di primitive più completa rispetto al provider predefinito. – caf

+0

BouncyCastle non è "solo un fornitore". Puoi anche utilizzare la funzionalità di crittografia di BouncyCastle tramite la loro API proprietaria. Hai ragione che BouncyCastle fornisce algoritmi crittografici aggiuntivi, ma raramente ho visto alcun reale bisogno di questi. Più spesso che mai, BouncyCastle viene utilizzato per funzionalità già fornite dai provider di sicurezza incorporati standard API e VM. – jarnbjo

1

Il posto migliore per trovare castello gonfiabile esempi di codice Java è quello di passare attraverso i casi di test nella suite di test di castello gonfiabile Bouncy Castle latest release java

Queste suite di test contengono codice non deprecato che può essere utilizzato facilmente

Problemi correlati