2009-06-01 13 views
4

Kryptographie-Neuling hier ... Ich versuche 128-Bit-Verschlüsselung mit BouncyCastle mit dem unten stehenden Code zu tun.Verwenden von "starken" JRE-Richtliniendateien mit BouncyCastle

import java.io.BufferedOutputStream; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.security.KeyStore; 
import java.security.Security; 
import java.security.cert.X509Certificate; 

import org.apache.commons.io.IOUtils; 
import org.bouncycastle.cms.CMSEnvelopedDataGenerator; 
import org.bouncycastle.cms.CMSEnvelopedDataStreamGenerator; 
import org.bouncycastle.jce.provider.BouncyCastleProvider; 

public class Test { 
     public static void main(String[] args) throws Throwable { 
       Security.addProvider(new BouncyCastleProvider()); 

       KeyStore keyStore = KeyStore.getInstance("PKCS12"); 

       FileInputStream keyStoreFile = new FileInputStream("test.p12"); 

       try { 
         keyStore.load(keyStoreFile, "test12".toCharArray()); 
       } finally { 
         keyStoreFile.close(); 
       } 

       X509Certificate certificate = (X509Certificate) keyStore 
           .getCertificate(keyStore.aliases().nextElement()); 

       OutputStream output = new BufferedOutputStream(new FileOutputStream(
           "test.out")); 

       try { 
         InputStream input = new FileInputStream("test.in"); 

         try { 
           CMSEnvelopedDataStreamGenerator generator = new CMSEnvelopedDataStreamGenerator(); 

           generator.addKeyTransRecipient(certificate); 

           OutputStream encryptedOutput = generator.open(output, 
               CMSEnvelopedDataGenerator.AES128_WRAP, 128, 
               BouncyCastleProvider.PROVIDER_NAME); 

           try { 
             IOUtils.copy(input, encryptedOutput); 
           } finally { 
             encryptedOutput.close(); 
           } 
         } finally { 
           input.close(); 
         } 
       } finally { 
         output.close(); 
       } 
     } 
} 

Aber ich bekomme diese Fehlermeldung:

Exception in thread "main" org.bouncycastle.cms.CMSException: key inappropriate for algorithm. 
     at org.bouncycastle.cms.CMSEnvelopedDataStreamGenerator.open(Unknown Source) 
     at org.bouncycastle.cms.CMSEnvelopedDataStreamGenerator.open(Unknown Source) 
     at org.bouncycastle.cms.CMSEnvelopedDataStreamGenerator.open(Unknown Source) 
     at hk.gov.gld.etb.uploading.pkcs7.Test.main(Test.java:45) 
Caused by: java.security.InvalidKeyException: Illegal key size or default parameters 
     at javax.crypto.Cipher.a(DashoA13*..) 
     at javax.crypto.Cipher.init(DashoA13*..) 
     at org.bouncycastle.cms.CMSEnvelopedGenerator$RecipientInf.toRecipientInfo(Unknown Source) 
     ... 4 more 

Das Zertifikat habe ich wurde mit dem Programm keytool JDK wie folgt generiert:

keytool -genkeypair -dname "cn=test" -alias test -keystore test.p12 -storepass test12 -validity 180 -storetype pkcs12 -keyalg rsa 

Die JDK-Version verwende ich 6 und die BouncyCastle Version, die ich verwendete, ist 141.

Mache ich es richtig? Muss ich die Richtliniendateien mit unbegrenzter Stärke noch installieren, um die 128-Bit-Verschlüsselung auszuführen?

Hilfe wird sehr geschätzt.

Danke!

Antwort

3

Scheint, dass Version 141 der BouncyCastle-Bibliothek einen Fehler hat. Als ich auf die neueste Version (143) umstieg, funktionierte der exakt gleiche Code.

2

Ich glaube schon - Sie brauchen US_export_policy.jar und local_policy.jar. Wir mussten dasselbe in unserem Projekt tun, und das hat es behoben.

Ich denke, Ihre Schlüssel als generiert und verwendet sollten in Ordnung sein, sonst. Fügen Sie diese zwei Gläser jre/lib/security hinzu, und das sollte Sie sofort beheben.

+0

Gibt es andere PKCS7-Anbieter, die sich nicht so verhalten? Wenn ich mich nicht irre, ist das ein Fehler, richtig? –

+1

Ich würde eher zustimmen - die JVM sollte 128bit out-of-the-box erlauben, aber US_export_policy für 256+. Um ehrlich zu sein, habe ich, sobald ich es funktionierte, nicht zu viel darüber nachgedacht, warum das der Fall war. – Chaos

+0

Angst, dass das in meinem Fall nicht möglich ist :(Ich brauche es für ein Applet und unsere Benutzer wissen vielleicht nicht (oder sind gesetzlich dazu berechtigt), auf unbegrenzte Stärke zu aktualisieren. –