2009-05-27 5 views
2

Dies ist der Code, den ich derzeit verwende. Es verwendet den BouncyCastle Provider.Wie kann ich ein java.util.Properties-Objekt (mit beliebiger Größe) mit einem öffentlichen RSA-Schlüssel verschlüsseln?

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; 
} 

ich zur Zeit ein immer

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

Die Verwendung von NoPadding ist unsicher. Verwenden Sie OAEP, wenn Sie können, PKCS # 1 Padding (ver. 1.5), wenn Sie nicht können. – erickson

+0

Ich habe es aktualisiert, um OAEPWithSHA1AndMGF1Padding zu verwenden. Danke für den Tipp. Dies ist mein erstes Unterfangen in Verschlüsselung. Die Daten, die wir verschlüsseln (Lizenzdaten), sind nicht kritisch, aber je mehr ich darüber lerne, desto besser. – ScArcher2

Antwort

7

RSA Mit vielen Daten zu verschlüsseln, ist keine gute Praxis.

Der Ansatz von kryptographischen Protokollen besteht darin, einen symmetrischen Schlüssel zu generieren, ihn zum Verschlüsseln der Daten zu verwenden und diesen symmetrischen Schlüssel mit RSA zu verschlüsseln.

So funktioniert PGP und S/MIME. Außerdem können mehrere Leser die Daten problemlos entschlüsseln, indem sie den symmetrischen Schlüssel für jeden vorgesehenen Empfänger verschlüsseln und nicht die gesamten Daten verschlüsseln.

+0

Gibt es einen Sicherheitsgrund dafür, dass es keine gute Praxis ist? AFAIK der Grund dafür ist Geschwindigkeit. BouncyCastle unterstützt es einfach nicht, bedeutet nicht, dass es keine Option ist ... – wds

+2

Geschwindigkeit, Kompatibilität und Komplexität sind gute Gründe, es nicht so zu machen. Ich kenne keine Sicherheitslücken in der heutigen Praxis gegenüber kryptoanalytischen Methoden, aber dieser Ansatz erfordert, dass mehr Code von jemandem geschrieben wird, der kein tiefgreifendes Verständnis der Kryptographie hat, also ist er definitiv weniger sicher. Es wäre besser, die S/MIME- oder PGP-Bibliotheken von BouncyCastle zu verwenden; Die Verwendung von weithin überprüften Protokollen und Implementierungen ist viel sicherer als die eigene Erfindung. – erickson

+0

Das hat mir alles klar gemacht. Vielen Dank! – ScArcher2

Verwandte Themen