2010-01-12 13 views
11

¿Alguien me puede mostrar (o proporcionar un enlace) un ejemplo de cómo cifrar un archivo en Java usando un castillo hinchable? Revisé bouncycastle.org pero no puedo encontrar ninguna documentación de su API. ¡Incluso el simple hecho de saber qué clases usar sería una gran ayuda para comenzar!Un ejemplo de encriptación de un archivo xml en Java usando castillo hinchable

+0

Ve con los enlaces de cb160, y asegúrate de obtener el código fuente de bouncycastle. La documentación de la API es en su mayoría pobre y, a menudo, muy pobre. Sin embargo, el código fuente es bastante legible y lo usé a menudo para responder preguntas como "¿qué tipo de CipherParameters necesita el RijndaelEngine?". Basta con mirar el método Rijndael relevante y será obvio. –

Respuesta

19

¿Qué tipo de cifrado desea realizar? Basado en contraseña (PBE), simétrico, asimétrico? Es todo en cómo configurar el Cipher.

No debería tener que usar ninguna API específica de BouncyCastle, solo los algoritmos que proporciona. Aquí hay un ejemplo que utiliza el cifrado BouncyCastle PBE para cifrar una cadena:

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

La sal no debe ser constante. –

+1

Si obtiene java.security.InvalidKeyException: Tamaño de clave ilegal ref: http://stackoverflow.com/a/6481658/234110 –

-1

Si bien es una respuesta indirecta a su pregunta, tal vez lo encontrará útil el uso de Jasypt para manejar la encriptación.

He aquí un ejemplo de cómo cifrar un archivo usando Jasypt: http://www.jasypt.org/encrypting-configuration.html

Y, aquí está cómo configurar castillo hinchable como proveedor de Jasypt: http://www.jasypt.org/bouncy-castle.html

+1

Una segunda biblioteca de terceros para abstraer la primera probablemente biblioteca de terceros no requerida? Suena como una muy buena idea. – jarnbjo

+0

Estamos usando jasypt y BouncyCastle. Jasypt maneja el cifrado y descifrado transparente de las columnas de la base de datos con Hibernate, y BouncyCastle realiza el cifrado y el descifrado reales. – Omniwombat

1

Si no lo hace tiene alguna razón en particular para usar BountyCastle, puede encontrar un buen tutorial e información de fondo sobre el soporte criptográfico incorporado de Java con varios ejemplos de código here.

+0

Vale la pena señalar que BouncyCastle es solo un "proveedor" que funciona dentro del marco de criptografía integrado (JCE). Se usa con frecuencia porque contiene un conjunto de primitivas más completo que el proveedor predeterminado. – caf

+0

BouncyCastle no es "solo un proveedor". También puede usar la funcionalidad de criptografía de BouncyCastle a través de su API propietaria. Tiene razón en que BouncyCastle proporciona algoritmos criptográficos adicionales, pero rara vez he visto una necesidad real de estos. Sin embargo, más de una vez, BouncyCastle se usa para la funcionalidad ya provista por los proveedores de seguridad incorporados estándar de API y VM. – jarnbjo

1

El mejor lugar para encontrar castillo hinchable ejemplos de código Java es ir a través de los casos de prueba en el banco de pruebas del castillo hinchable Bouncy Castle latest release java

estos bancos de pruebas contienen código no desaprobado que se puede utilizar fácilmente

Cuestiones relacionadas