【问题标题】:Bouncy Castle - How implementes SignedAndEnveloped data with Bouncy CastleBouncy Castle - 如何使用 Bouncy Castle 实现 SignedAndEnveloped 数据
【发布时间】:2018-07-23 08:35:22
【问题描述】:

我想创建一个使用 Bouncy Castle(版本 1.59)实现的 signedAndEnvelopedData (PKCS #7) 数据。

在充气城堡中,接口CMSObjectIdentifiers 包含signedAndEnvelopedData 类型。

但是,多次尝试后,无法正确创建。您能否提供一些建议,以下是我的核心实现

  1. 首先签署数据
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()

这里我将输入数据设置为CMSTypeDataCMSObjectIdentifiers.data.getId()

CMSTypedData msg = (CMSTypedData) new CMSProcessableByteArray(
                new ASN1ObjectIdentifier(CMSObjectIdentifiers.data.getId()),
                srcMsg.getBytes(charSet)); 
  1. 签名数据的输出将被用作封装的输入
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;

这里我将输入数据设置为CMSTypedDataCMSObjectIdentifiers.signedAndEnvelopedData.getId()

CMSTypedData msg = new CMSProcessableByteArray(new ASN1ObjectIdentifier(CMSObjectIdentifiers.signedAndEnvelopedData.getId()),srcMsg.getBytes(charSet));

问题:

  1. 是否支持充气城堡 (1.59) PKCS#7 SignedAndEnevloped
  2. 如果第一个问题是“是”,那么我创建 SignedAndEnevloped 数据的步骤是否正确?
  3. 如果第一个问题是否定的,有什么方法可以实现吗?

【问题讨论】:

  • 不允许交叉发布,但我至少会在 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


【解决方案1】:

我刚刚写了一个关于使用 Bouncy Caslte Provider 在 XMLSignatrure(SignedAndEnevloped) 中做 RSA 的演示,请看这篇文章,https://honwhy.wang/2018/09/07/use-bc-provider-xmlsignature/

演示代码,

1,https://github.com/Honwhy/xml-sec/blob/master/src/main/java/com/honey/xmlsec/BcSignatureAlgorithm.java#L37

2、https://github.com/Honwhy/xml-sec/blob/master/src/main/java/com/honey/xmlsec/MyUtil.java#L107

也许您必须调整一些线路以满足您的要求。

【讨论】:

    猜你喜欢
    • 2014-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多