2012-11-03 6 views
8

Ich möchte BouncyCastle verwenden, um mit pkcs7-Format zu verschlüsseln und zu entschlüsseln. Ich habe ein Hardware-Token. wenn ich Schlüsselpaar in JKS-Datei in meiner Festplatte verwenden, funktioniert es gut, aber wenn ich Schlüsselpaar in Token verwenden, funktioniert es nicht. dies ist meine Ausnahme:Verschlüsselung und Entschlüsselung mit BouncyCastle PKCS7 - CMS in Java

Exception in thread "main" org.bouncycastle.cms.CMSException: cannot create cipher: No such algorithm: 2.16.840.1.101.3.4.1.2 
    at org.bouncycastle.cms.jcajce.EnvelopedDataHelper.createCipher(Unknown Source) 
    at org.bouncycastle.cms.jcajce.EnvelopedDataHelper$1.doInJCE(Unknown Source) 
    at org.bouncycastle.cms.jcajce.EnvelopedDataHelper.execute(Unknown Source) 
    at org.bouncycastle.cms.jcajce.EnvelopedDataHelper.createContentCipher(Unknown Source) 
    at org.bouncycastle.cms.jcajce.JceKeyTransEnvelopedRecipient.getRecipientOperator(Unknown Source) 
    at org.bouncycastle.cms.KeyTransRecipientInformation.getRecipientOperator(Unknown Source) 
    at org.bouncycastle.cms.RecipientInformation.getContentStream(Unknown Source) 
    at org.bouncycastle.cms.RecipientInformation.getContent(Unknown Source) 
    at pktb.PKTB.CmsDecrypt(PKTB.java:288) 
    at pktb.PKTB.main(PKTB.java:419) 
Caused by: java.security.NoSuchAlgorithmException: No such algorithm: 2.16.840.1.101.3.4.1.2 
    at javax.crypto.Cipher.getInstance(DashoA13*..) 
    at javax.crypto.Cipher.getInstance(DashoA13*..) 
    at org.bouncycastle.jcajce.NamedJcaJceHelper.createCipher(Unknown Source) 
    ... 10 more 
Java Result: 1 

dies mein Verschlüsselungscode lautet:

public byte[] CmsEncrypt(byte[] message, KeyContainer keyContainer) throws NoSuchAlgorithmException, NoSuchProviderException, CMSException, IOException 
{ 
    Security.addProvider(new BouncyCastleProvider()); 
    X509Certificate cert = (X509Certificate) keyContainer.certificate; 
    CMSEnvelopedDataGenerator gen = new CMSEnvelopedDataGenerator(); 
    gen.addKeyTransRecipient(cert); 
    CMSProcessable data = new CMSProcessableByteArray(message); 
    CMSEnvelopedData enveloped = gen.generate(data, 
    CMSEnvelopedDataGenerator.AES128_CBC, "BC"); 

    return enveloped.getEncoded(); 

} 

und dies ist mein Entschlüsselungscode:

public byte[] CmsDecrypt(byte[] cipher, KeyContainer keyContainer) throws CMSException, IOException, NoSuchProviderException 
    { 
     Security.addProvider(new BouncyCastleProvider()); 
     byte[] contents=null; 
     CMSEnvelopedDataParser envelopedDataParser = new CMSEnvelopedDataParser(new ByteArrayInputStream(cipher)); 
     PrivateKey key = keyContainer.privateKey; 
     X509Certificate cert = keyContainer.certificate; 
     CMSEnvelopedData enveloped = new CMSEnvelopedData(cipher); 
     Collection recip = enveloped.getRecipientInfos().getRecipients(); 
     KeyTransRecipientInformation rinfo = (KeyTransRecipientInformation) recip 
        .iterator().next(); 
     if(keyContainer.provider.equals("Software")) 
      contents = rinfo.getContent(
       new JceKeyTransEnvelopedRecipient(key).setProvider("BC")); 
     else 
      contents = rinfo.getContent(
       new JceKeyTransEnvelopedRecipient(key).setProvider("SunPKCS11-" + keyContainer.provider)); 
     System.out.println(new String(contents)); 
     return contents; 

    } 

Ich muss sagen, dass ich dieses Token-Anbieter verwenden für cmsSign und cmsVerify und es funktioniert gut, daher denke ich, das Problem ist nicht für Provider.

+2

FYI zu anderen Lesern, '2.16.840.1.101.3.4.1.2' ist die OID für [128-Bit-AES-CBC-Modus] (http://www.alvestrand.no/objectid/2.16.840.1 .101.3.4.1.2.html). –

+1

Sind Sie sicher, dass Ihr PKCS # 11-Token-Provider 128-Bit-AES unterstützt? Gibt es etwas, das Sie in Ihrer Token-Konfiguration ändern müssen, um symmetrische Algorithmen zu aktivieren? –

+0

Sie fragen sich besser in der [Bouncy Castle Mailingliste] (http://www.bouncycastle.org/mailing_lists.html). –

Antwort

1

Sie können PKCS # 11 verwenden, um private und öffentliche Schlüssel aus dem Hardwaretoken zu extrahieren und dann diese extrahierten öffentlichen und privaten Schlüssel zum Verschlüsseln und Entschlüsseln von Daten mit BouncyCastle PKCS7 zu verwenden. Welches Token benutzt du? Außerdem kann ich den Code nicht finden, um Schlüssel vom Hardware-Token zu extrahieren. Gehen Sie die Antwort im folgenden Link durch, um Schlüssel vom Hardware-Token zu extrahieren. Klicken Sie auf here