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

将消息和签名转换为BouncyCastle CMSSignedData对象

蔺沛
2023-03-14

我有一个 X509CertificateObject,一个匹配的 RSAPublicKey,并设法创建一个字节数组,其中包含某个消息对象的有效数字证书,也作为字节数组。

不幸的是,我正在构建的系统只接受CMSSignedData对象作为输入。如何将我的基本构建块转换为这样一个有效的 CMSSignedData 对象?

背景:根据这个示例(摘要是SHA512),我正在试用Java Bouncy Castle RSA盲签名,需要将结果输入到标准签名处理中。

共有1个答案

刘焱
2023-03-14

首先,您可能希望用私钥签署您的数据。这个想法是,签名应该是只有你能创造的东西。剩下的应该如下:


X509Certificate signingCertificate = getSigningCertificate();
//The chain of certificates that issued your signing certificate and so on
Collection&ltX509Certificate> certificateChain = getCertificateChain();
PrivateKey pk = getPrivateKey();
byte[] message = "SomeMessage".getBytes();

CMSSignedDataGenerator generator = new CMSSignedDataGenerator();
certificateChain.add(signingCertificate);
generator.addCertificates(new CollectionStore(certificateChain));

JcaDigestCalculatorProviderBuilder jcaDigestProvider = new JcaDigestCalculatorProviderBuilder();
jcaDigestProvider.setProvider(new BouncyCastleProvider());
JcaSignerInfoGeneratorBuilder singerInfoGenerator = new JcaSignerInfoGeneratorBuilder(jcaDigestProvider.build());

AlgorithmIdentifier sigAlgId = new DefaultSignatureAlgorithmIdentifierFinder().find("SHA1withRSA");
AlgorithmIdentifier digAlgId = new DefaultDigestAlgorithmIdentifierFinder().find(sigAlgId);
AsymmetricKeyParameter privateKeyParam = PrivateKeyFactory.createKey(pk.getEncoded());
ContentSigner cs = new BcRSAContentSignerBuilder(sigAlgId, digAlgId).build(privateKeyParam);

SignerInfoGenerator sig = singerInfoGenerator.build(cs, signingCertificate);
generator.addSignerInfoGenerator(sig);

CMSSignedData data = generator.generate(new CMSProcessableByteArray(message), true);
 类似资料:
  • 我想填充Javapojo类与mqtt消息有效载荷在一个Springmvc应用程序。我的代码是: MQTT MessagePayload是{“name”:“abc”,“age”:32},但当它在变量MessagePayload中转换为字符串时,它显示为类似{name:abc,age:32}。你看,去掉所有的双引号。当转到try块时,会抛出一个错误com。fasterxml。杰克逊。果心JsonPar

  • Signing messages can be used for various method of authentication and off-chain operations, which can be put on-chain if necessary. 字符串签名 By allowing a user to sign a string, which can be verified on-

  • 我正在尝试将单个输入消息转换为多个消息。我有一个带有以下签名的方法: 类类似于: 对于中的每个,我想创建一个的实例。我如何做到这一点并处理

  • 我创建了RabbitListener来从RabbitMQ队列获取消息。 我的rabbitMQ消息: 不幸的是,在从Message转换为Transfer Transfer Object时引发了异常。 整个消息日志:https://pastebin.com/raw/47lq7dyd

  • 我正在使用apache camel(Fuse 2.10.x)和soap over http和soap over JMS。JMS消息由对象消息转换为字节消息格式,这就造成了消息读取的问题。 我正在JBoss5.0GA环境中使用用于websphere MQ的JNDI连接。 我们遇到了IBM属性的另一个问题,通过删除属性解决了这个问题。我们还有camel header属性来设置消息

  • 我正在尝试使用.NET(CNG提供商)的现有ECDSA密钥,以便使用Bouncy Castle对数据进行签名,然后在两种签名格式(P1363和ASN.1)之间进行转换。然而,我总是得到不同的签名。我不太确定转换是否不正确,或者我是否使用了不正确的方法来使用Bouncy Castle读取.NET密钥。 由于某些原因,和已经不同,我假设问题甚至可能在转换之前就出现了。我已经看过许多StackOverf