【发布时间】:2018-03-23 20:44:34
【问题描述】:
使用 Java,我想使用 RSA 对给定的 byte[] hash 进行加密签名,并以 Cryptographic Message Syntax (CMS) 格式返回 byte[] signature。
我为此使用Bouncycastle Java API (BC),并面临NONEwithRSA 签名类型不存在的问题。 (java.lang.IllegalArgumentException: Unknown signature type requested: NONEWITHRSA)。
不幸的是,我无法更改输入或所需的输出格式,因此我需要扩展/添加到现有的 BC 算法,以便我可以使用NONEwithRSA 而不是所有其他现有的(例如SHA256withRSA)。我该怎么做呢?我在 BC 文档中没有找到任何示例。
我想要的用法与此类似
byte[] doSigningCMS(byte[] data, X509Certificate cert, PrivateKey key) throws Exception {
CMSSignedDataGenerator signGen = new CMSSignedDataGenerator();
CMSTypedData content = new CMSProcessableByteArray(data);
ContentSigner signer = new JcaContentSignerBuilder("NONEwithRSA").build(key);
DigestCalculatorProvider dcp = new JcaDigestCalculatorProviderBuilder().build();
signGen.addSignerInfoGenerator(new JcaSignerInfoGeneratorBuilder(dcp).build(signer, cert));
return signGen.generate(content, false).getEncoded();
}
到目前为止我所尝试的
- 通过“复制”一堆 BC 代码和“假”
SHA256withRSA为 JCA 添加我自己的提供程序,以基本上返回NoneDigest而不是SHA256Digest。但这似乎是非常错误的。 - 使用
((BouncyCastleProvider) Security.getProvider("BC")).addAlgorithm(ALG_ALIAS, NoneDigest.class.getName())将我自己的算法添加到 BC,这似乎不起作用(找不到算法)
我希望得到一些建议和指导来做到这一点(如果可能的话)“正确的方式”。谢谢。
【问题讨论】:
-
“NoneWithRSA”签名算法的规范在哪里?我很想从自定义 JcaContentSignerBuilder 开始。
标签: java cryptography bouncycastle