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.
Leider geht das nicht rk :( in diesem Fall, 'sig.getSignedContent()' ergibt null, anstatt der CMSProcessableByteArray der Nachricht, die ich in ... –
Welche Versionen verwenden Sie? Ich benutze BouncyCastle 1.57 und Java 1.7 –
bouncyCastle 1.57 und Java 1.8. Soll es für Java 1.7 funktionieren? –