2009-05-27 9 views
2

Ceci est le code que j'utilise actuellement. Il utilise le fournisseur BouncyCastle.Comment crypter un objet java.util.Properties (quelle que soit sa taille) à l'aide d'une clé publique RSA?

static 
{ 
    Security.addProvider(new BouncyCastleProvider()); 
} 

protected String encrypt(byte[] keyData, byte[] data) throws Exception { 
    X509EncodedKeySpec keyspec = new X509EncodedKeySpec(keyData); 
    KeyFactory kf = KeyFactory.getInstance("RSA", "BC"); 
    PublicKey pk = kf.generatePublic(keyspec); 
    Cipher rsa = Cipher.getInstance("RSA/None/OAEPWithSHA1AndMGF1Padding", "BC"); 
    rsa.init(Cipher.ENCRYPT_MODE, pk); 
    byte[] output = rsa.doFinal(data); 
    String result = base64EncodeBytes(output); 
    return result; 
} 

Je reçois actuellement un

java.lang.ArrayIndexOutOfBoundsException: too much data for RSA block 
    at org.bouncycastle.jce.provider.JCERSACipher.engineDoFinal(Unknown Source) 
    at javax.crypto.Cipher.doFinal(DashoA13*..) 
    at Encryption.encrypt(RSAToken.java:60) 
+0

L'utilisation de NoPadding n'est pas sécurisée. Utilisez OAEP si vous le pouvez, padding PKCS # 1 (ver 1.5) si vous ne pouvez pas. – erickson

+0

Je l'ai mis à jour pour utiliser OAEPWithSHA1AndMGF1Padding. Merci pour le conseil. C'est ma première entreprise dans le cryptage. Les données que nous chiffrons (données de licence) ne sont pas critiques, mais plus j'en apprends, mieux c'est. – ScArcher2

Répondre

7

L'utilisation de RSA pour chiffrer un grand nombre de données ne sont pas une bonne pratique.

L'approche adoptée par les protocoles cryptographiques consiste à générer une clé symétrique, à l'utiliser pour crypter les données, puis à crypter cette clé symétrique avec RSA.

Voici comment PGP et S/MIME fonctionnent. Il est également facile de permettre à plusieurs lecteurs de déchiffrer les données — en chiffrant la clé symétrique pour chaque destinataire prévu, plutôt que de chiffrer l'intégralité des données pour chacun.

+0

Y a-t-il une raison de sécurité pour que ce ne soit pas une bonne pratique? AFAIK la raison pour laquelle c'est fait de cette façon est la vitesse. BouncyCastle ne supporte tout simplement pas cela, ne signifie pas que ce n'est pas une option ... – wds

+2

La vitesse, la compatibilité et la complexité sont toutes de bonnes raisons de ne pas le faire de cette façon. Je ne connais pas de vulnérabilités aux méthodes cryptanalytiques dans la pratique actuelle, mais cette approche nécessite plus de code à écrire par quelqu'un qui n'a pas une compréhension profonde de la cryptographie, donc il est nettement moins sécurisé. Il serait préférable d'utiliser les bibliothèques S/MIME ou PGP de BouncyCastle; L'utilisation de protocoles et d'implémentations largement révisés est beaucoup plus sûre que d'inventer la vôtre. – erickson

+0

Cela m'a tout rendu clair. Merci! – ScArcher2

Questions connexes