2017-06-22 6 views
1

Dans la pièce suivante de code que je signe un message en utilisant Bouncy Castle:Récupération CMSSignedData du codage ASN.1 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 
    } 
} 

Ma question est de savoir comment récupérer l'original CMSSignedData (vouloir lire le message d'origine et vérifiez-le), en utilisant uniquement le tableau d'octets du codage ASN.1 de cet objet.

La raison pour laquelle je pose cette question, c'est que je veux décrypter un certain message crypté et signé. Je suis capable de déchiffrer ce message, mais il en résulte un tableau d'octets codés en ASN.1 (qui correspond à mon message original), mais je ne suis plus en mesure de traiter ce message décrypté.

Répondre

0

Vous pouvez utiliser les classes org.bouncycastle.asn1.cms.ContentInfo et 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); 

Notez également que vous devez créer un CMSSignedData avec le contenu encapsulé dans la signature, vous devez donc changer ceci:

CMSSignedData sd = sGen.generate(msg); 

Pour ceci:

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

Malheureusement, cela ne wo rk :( dans ce cas, 'sig.getSignedContent()' donne null, au lieu de la CMSProcessableByteArray du message que j'ai mis en ... –

+0

Quelles versions utilisez-vous? J'utilise BouncyCastle 1.57 et Java 1.7 –

+0

bouncyCastle 1.57 et Java 1.8. Est-ce censé fonctionner pour Java 1.7? –