2010-01-12 2 views
11

Quelqu'un peut-il me montrer (ou fournir un lien vers) un exemple de la façon de crypter un fichier en Java en utilisant château gonflable? J'ai regardé sur bouncycastle.org mais je ne trouve aucune documentation sur leur API. Même savoir quelles classes utiliser serait d'une grande aide pour moi pour commencer!Un exemple de cryptage d'un fichier xml en Java en utilisant château gonflable

+0

Aller avec les liens de cb160, et assurez-vous également d'obtenir le code source de bouncycastle. La documentation de l'API est généralement médiocre et souvent très médiocre. Cependant, le code source est assez lisible et je l'ai souvent utilisé pour répondre à des questions comme "quel type de CipherParameters le RijndaelEngine a-t-il besoin?". Il suffit de regarder la méthode Rijndael pertinente et ce sera évident. –

Répondre

19

Quel type de cryptage voulez-vous effectuer? Mot de passe (PBE), symétrique, asymétrique? Tout est dans la façon dont vous configurez le Cipher.

Vous ne devriez utiliser aucune API spécifique à BouncyCastle, mais seulement les algorithmes qu'elle fournit. Voici un exemple qui utilise le chiffrement BouncyCastle PBE pour chiffrer une chaîne:

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

Le sel ne doit pas être constante .. –

+1

Si vous obtenez java.security.InvalidKeyException: taille de la clé illégale ref: http://stackoverflow.com/a/6481658/234110 –

-1

Bien qu'il soit une réponse indirecte à votre question, peut-être vous trouverez utile d'utiliser jasypt pour gérer le chiffrement.

est ici un exemple de la façon de chiffrer un fichier en utilisant jasypt: http://www.jasypt.org/encrypting-configuration.html

Et, voici comment configurer château gonflable en tant que fournisseur pour jasypt: http://www.jasypt.org/bouncy-castle.html

+1

Une deuxième bibliothèque 3ème partie abstraite premier probablement bibliothèque tierce non demandée? Cela ressemble à une très bonne idée. – jarnbjo

+0

Nous utilisons jasypt et BouncyCastle. Jasypt gère le chiffrement transparent et le déchiffrement des colonnes de base de données avec Hibernate, et BouncyCastle fait le chiffrement et le décryptage réels. – Omniwombat

1

Si vous n'êtes pas avez une raison particulière d'utiliser BountyCastle, vous pouvez trouver un bon tutoriel et des informations de base sur la prise en charge de la cryptographie intégrée Java avec plusieurs exemples de code here.

+0

Il convient de souligner que BouncyCastle est juste un "fournisseur" qui fonctionne dans le cadre de cryptographie intégré (JCE). Il est fréquemment utilisé car il contient une suite de primitives plus complète que le fournisseur par défaut. – caf

+0

BouncyCastle n'est pas "juste un fournisseur". Vous pouvez également utiliser la fonctionnalité de cryptographie de BouncyCastle via leur API propriétaire. Vous avez raison de dire que BouncyCastle fournit des algorithmes cryptographiques supplémentaires, mais j'en ai rarement vu un besoin réel. Plus souvent cependant, BouncyCastle est utilisé pour les fonctionnalités déjà fournies par les fournisseurs de sécurité embarqués standard de l'API et de la VM. – jarnbjo

1

Le meilleur endroit pour trouver Bouncy Castle exemples de code Java est de passer par les cas de test dans la suite de tests de château gonflable Bouncy Castle latest release java

Ces suites de test contiennent du code non dépréciée qui peut être utilisé facilement

Questions connexes