【发布时间】:2018-07-23 08:35:22
【问题描述】:
我想创建一个使用 Bouncy Castle(版本 1.59)实现的 signedAndEnvelopedData (PKCS #7) 数据。
在充气城堡中,接口CMSObjectIdentifiers 包含signedAndEnvelopedData 类型。
但是,多次尝试后,无法正确创建。您能否提供一些建议,以下是我的核心实现
- 首先签署数据
CMSTypedData msg = (CMSTypedData) new CMSProcessableByteArray(
new ASN1ObjectIdentifier(CMSObjectIdentifiers.data.getId()),
srcMsg.getBytes(charSet));
Store certs = new JcaCertStore(certList);
CMSSignedDataGenerator gen = new CMSSignedDataGenerator();
ContentSigner signer = new JcaContentSignerBuilder(
signatureSchema).setProvider("BC").build(privateKey);
gen.addSignerInfoGenerator(new JcaSignerInfoGeneratorBuilder(
new JcaDigestCalculatorProviderBuilder().setProvider("BC")
.build()).build(signer, cerx509));
gen.addCertificates(certs);
CMSSignedData sigData = gen.generate(msg, true);
sigData = new CMSSignedData(msg,sigData.getEncoded())
return sigData.getEncoded()
这里我将输入数据设置为CMSTypeData为CMSObjectIdentifiers.data.getId()
CMSTypedData msg = (CMSTypedData) new CMSProcessableByteArray(
new ASN1ObjectIdentifier(CMSObjectIdentifiers.data.getId()),
srcMsg.getBytes(charSet));
- 签名数据的输出将被用作封装的输入
CMSTypedData msg = new CMSProcessableByteArray(new ASN1ObjectIdentifier(CMSObjectIdentifiers.signedAndEnvelopedData.getId()),srcMsg.getBytes(charSet));
CMSEnvelopedDataGenerator edGen = new CMSEnvelopedDataGenerator();
JcaAlgorithmParametersConverter paramsConverter = new JcaAlgorithmParametersConverter();
edGen.addRecipientInfoGenerator(
new JceKeyTransRecipientInfoGenerator(cert,paramsConverter.getAlgorithmIdentifier(PKCSObjectIdentifiers.id_RSAES_OAEP,OAEPParameterSpec.DEFAULT))
.setProvider(new BouncyCastleProvider()));
OutputEncryptor encryptor = new JceCMSContentEncryptorBuilder(CMSAlgorithm.AES256_CBC)
.setProvider(new BouncyCastleProvider())
.build()
CMSEnvelopedData ed = edGen.generate(msg,encryptor)
encryptedContent = ed.getEncoded()
String result = new String(Base64.encode(ed.getEncoded()));
return result;
这里我将输入数据设置为CMSTypedData为CMSObjectIdentifiers.signedAndEnvelopedData.getId()
CMSTypedData msg = new CMSProcessableByteArray(new ASN1ObjectIdentifier(CMSObjectIdentifiers.signedAndEnvelopedData.getId()),srcMsg.getBytes(charSet));
问题:
- 是否支持充气城堡 (1.59) PKCS#7
SignedAndEnevloped - 如果第一个问题是“是”,那么我创建
SignedAndEnevloped数据的步骤是否正确? - 如果第一个问题是否定的,有什么方法可以实现吗?
【问题讨论】:
-
不允许交叉发布,但我至少会在 Bouncy Castle Dev 邮件列表上问这个问题。如果你在那里得到答案,你可以在这里发布。
-
SignedAndEnveloped 是 PKCS7 = rfc2315 sec 11 中的一种独特类型,它与先签名后封装(您几乎拥有)或先封装后签名不同。它不结转至 CMS,且 AFAICT 未由 BC 实施。我认为您必须自己实现它,遵循规范并可能使用 parts 的 Enveloped 和 Signed 代码。
-
实际上我只想创建 SignedAndEnveloped 数据,无论是先签名后封装还是先封装后签名。我尝试了 IAIK en.wikipedia.org/wiki/IAIK-JCE 的替代实现,但它是商业的
标签: java cryptography bouncycastle pkcs#7