在Java中,我尝试使用充气城堡和本规范中的证书签署一个byte [](这是我的文档的sha256摘要):
第14.1.4.1.1节数字签名生成中的。
我在bouncy的java doc中找到了这个方法:
public static byte[] signer(byte[] datas, Certificat cert) {
try {
List<X509Certificate> certList = new ArrayList<X509Certificate>();
CMSTypedData msg = new CMSProcessableByteArray(datas);
certList.add(cert.getCertificat());
Store certs = new JcaCertStore(certList);
CMSSignedDataGenerator gen = new CMSSignedDataGenerator();
ContentSigner sha256signer = new JcaContentSignerBuilder(
"SHA256withRSA").setProvider("BC").build(
cert.getPrivateKey());
gen.addSignerInfoGenerator(new JcaSignerInfoGeneratorBuilder(
new JcaDigestCalculatorProviderBuilder().setProvider("BC")
.build()).build(sha256signer, cert.getCertificat()));
gen.addCertificates(certs);
CMSSignedData sigData = gen.generate(msg, true);
return sigData.getEncoded();
}
catch (Exception e) {
throw new RuntimeException(
"Erreur lors de la signature du document", e);
}
我不知道这个签名是否真的符合规范要求的PKCS#1 1.5。我是否必须手动添加填充?和RSA256的OID?
答案 0 :(得分:5)
EBICS签名A005是一个带有SHA-256摘要算法和PKCS#1 1.5填充的RSA签名。但是,您在此处粘贴的代码示例是创建CMS签名,该签名使用“低级别”RSA签名,但结构要复杂得多(有关详细信息,请参阅RFC 5652 http://www.rfc-editor.org/rfc/rfc5652.txt)。
希望使用java crypto API生成您尝试获取的签名非常简单:
public static byte[] signer(byte[] data, PrivateKey key) {
Signature signer = Signature.getInstance("SHA256WithRSA", "BC");
signer.initSign(key);
signer.update(data);
return signer.sign();
}