当前位置: 首页 > 知识库问答 >
问题:

Bouncy Castle-如何使用Bouncy Castle实现SignedAndEnveloped数据

卢志行
2023-03-14

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

在Bouncy Castle中,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()

在这里,我将cmstypedata的输入数据设置为cmsobjectedentifiers.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的输入数据设置为cmsObjectEntifiers.SignedAndEnvelopedData.getID()

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

问题:

  1. 是否支持Bouncy Castle(1.59)的PKCS#7SignedAndeneVloped
  2. 如果第一个问题是,那么创建signedandenevloped数据的步骤是否正确?
  3. 如果第一个问题是“否”,是否有某种方法来实施它?

共有1个答案

酆光熙
2023-03-14

我刚刚在XMLSignatrure(SignedAndEnevloped)中编写了一个关于使用Bouncy CALTE提供程序执行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

也许你需要一些线路来满足你的要求。

 类似资料:
  • 我正在消耗一个外部API,它返回给我一个河豚加密的JSON数组。首先,我试图使用BountyCastle包实现Blowfish加密/解密方法,该包基于这篇文章c#Bouncy Castle Blowfish Decryption-Pad块损坏。 现在我想解密API响应。Api返回给我以下Blowfish加密的JSON正文内容 $-1$cb8ba9e30b19ff2a$d1157421764fe50

  • 我正在一个项目中使用SSHJ库。SSHJ库使用bouncycastle加密。 在eclipse中一切都很好,但是在我使用one-jar将所有内容打包到单个jar包中之后,我面临着bouncyCastle lib的问题。bcprov-jdk15on-1.51.jar包含在 /lib的JAR包中,所有其他库以及例如sshj.jar. 在日志上,我有这些: 未找到Security Provider类or

  • 我有一个Web服务,它是一个数字签名(验证pdf,签名pdf)我正在使用库bcpkix-jdk15on-1.54.jar,bcprov-jdk15on-1.54.jar,itextpdf-5.4.0.jar.和作为Weblogic 12c12.2.1.2应用服务器当我在本地测试服务时,一切正常,但当在服务器上测试时,服务返回:java.lang.ClassNotFoundException:org

  • 我有一个使用BouncyCastle作为安全提供者的应用程序,但是我想切换到另一个直接使用OpenSSL(consecrypt)的应用程序。我遇到的问题是,我正在使用BouncyCastle提供的密钥生成器中的ECDH“密钥”,但在我的其他库中没有类似的密钥生成器。 为了比较这两者,我将使用两种方法解码这些点,输入如下- 为提高可读性而添加换行符 使用BouncyCastle方法- 返回的是。返回