2017-06-22 27 views
1

Im folgenden Code Abrufen ich eine Nachricht unterzeichnen Hüpfburg mit:CMSSignedData von ASN.1-Codierung in Bouncy Castle

import org.bouncycastle.cms.CMSProcessableByteArray; 
import org.bouncycastle.cms.CMSSignedData; 
import org.bouncycastle.cms.CMSSignedDataGenerator; 
import org.bouncycastle.cms.CMSTypedData; 
import org.bouncycastle.cms.jcajce.JcaSignerInfoGeneratorBuilder; 
import org.bouncycastle.jce.provider.BouncyCastleProvider; 
import org.bouncycastle.operator.ContentSigner; 
import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder; 
import org.bouncycastle.operator.jcajce.JcaDigestCalculatorProviderBuilder; 
import org.bouncycastle.util.encoders.Base64; 

import java.io.FileInputStream; 

import java.nio.file.Files; 
import java.nio.file.Path; 
import java.nio.file.Paths; 
import java.security.KeyFactory; 
import java.security.PrivateKey; 
import java.security.Security; 
import java.security.cert.CertificateFactory; 
import java.security.cert.X509Certificate; 
import java.security.spec.PKCS8EncodedKeySpec; 

public class Sign { 

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

     String certPath = "certPath"; 
     FileInputStream inPublic = new FileInputStream(certPath); 
     CertificateFactory factory = CertificateFactory.getInstance("X.509"); 
     X509Certificate cert = (X509Certificate) factory.generateCertificate(inPublic); 


     String keyPrivatePath = "keyPath"; 
     Path path = Paths.get(keyPrivatePath); 
     Files.readAllBytes(Paths.get(keyPrivatePath)); 
     PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(Files.readAllBytes(Paths.get(keyPrivatePath))); 
     KeyFactory kf = KeyFactory.getInstance("RSA"); 
     PrivateKey privateKey = kf.generatePrivate(spec); 

     CMSProcessableByteArray msg = new CMSProcessableByteArray("My message".getBytes()); 
     CMSSignedDataGenerator sGen = new CMSSignedDataGenerator(); 

     ContentSigner sha1Signer = new JcaContentSignerBuilder("SHA1withRSA").setProvider("BC").build(privateKey); 
     sGen.addSignerInfoGenerator(
       new JcaSignerInfoGeneratorBuilder(
         new JcaDigestCalculatorProviderBuilder().setProvider("BC").build() 
       ).build(sha1Signer, cert) 
     ); 

     CMSSignedData sd = sGen.generate(msg); 

     CMSTypedData cmsBytes = new CMSProcessableByteArray(sd.getEncoded()); 
     // How to reconstruct a CMSSignedData from cmsBytes again? 
     byte[] bytes = (byte[]) cmsBytes.getContent(); 
     CMSSignedData retrieved = new CMSSignedData(bytes); 
     System.out.println(retrieved.getSignedContent()); // Doesn't work, is null 
    } 
} 

Meine Frage ist, wie die zum Abrufen Original CMSSignedData (fehlt die ursprüngliche Nachricht lesen (und verifizieren Sie es), wobei nur das Byte-Array der ASN.1-Codierung dieses Objekts verwendet wird.

Der Grund, warum ich das frage, ist, dass ich eine bestimmte verschlüsselte und signierte Nachricht entschlüsseln möchte. Ich bin in der Lage, diese Nachricht zu entschlüsseln, aber es führt zu einem ASN.1-codierten Byte-Array (das meiner ursprünglichen Nachricht entspricht), aber ich kann diese entschlüsselte Nachricht nicht weiter verarbeiten.

Antwort

0

können Sie die Klassen verwenden org.bouncycastle.asn1.cms.ContentInfo und org.bouncycastle.asn1.ASN1Sequence:

CMSTypedData cmsBytes = new CMSProcessableByteArray(sd.getEncoded()); 
byte[] bytes = (byte[]) cmsBytes.getContent(); 

// reconstruct CMSSignedData from the byte array 
ContentInfo ci = ContentInfo.getInstance(ASN1Sequence.fromByteArray(bytes)); 
CMSSignedData sig = new CMSSignedData(ci); 

Beachten Sie auch, dass Sie in der Signatur eingekapselt einen CMSSignedData mit dem Inhalt erstellen müssen, so müssen Sie diese ändern:

CMSSignedData sd = sGen.generate(msg); 

zu dies:

CMSSignedData sd = sGen.generate(msg, true); 
+0

Leider geht das nicht rk :( in diesem Fall, 'sig.getSignedContent()' ergibt null, anstatt der CMSProcessableByteArray der Nachricht, die ich in ... –

+0

Welche Versionen verwenden Sie? Ich benutze BouncyCastle 1.57 und Java 1.7 –

+0

bouncyCastle 1.57 und Java 1.8. Soll es für Java 1.7 funktionieren? –

Verwandte Themen