Java,带有BouncyCastle的数字签名

时间:2011-12-06 09:59:42

标签: java digital-signature bouncycastle

在Java中,我尝试使用充气城堡和本规范中的证书签署一个byte [](这是我的文档的sha256摘要):

http://www.ebics.org/fileadmin/unsecured/specification/spec_current_EN/EBICS_Specification_2.5_final-16-05-2011.pdf

第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?

1 个答案:

答案 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();
}