Java, цифровая подпись с BouncyCastle - PullRequest
4 голосов
/ 06 декабря 2011

В Java я попытался подписать байт [] (это мой дайджест sha256 моего документа) с помощью надувного замка и сертификата в этой спецификации:

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

inглава 14.1.4.1.1 Создание цифровой подписи.

Я нашел в 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 # 11.5 требуется согласно спецификации.Нужно ли добавлять отступы вручную?А OID для RSA256?

1 Ответ

5 голосов
/ 17 декабря 2011

Подпись EBICS A005 - это подпись RSA с алгоритмом дайджеста SHA-256 и дополнением PKCS # 1 1.5.Однако пример кода, который вы вставили здесь, создает подпись CMS, которая использует подпись RSA «низкого уровня», но представляет собой гораздо более сложную структуру (подробные сведения см. В RFC 5652 http://www.rfc -editor.org / rfc / rfc5652.txt ).

Надеемся, что получить подпись, которую вы пытаетесь получить, очень просто с помощью API Java Crypto:

public static byte[] signer(byte[] data, PrivateKey key) {
    Signature signer = Signature.getInstance("SHA256WithRSA", "BC");
    signer.initSign(key);
    signer.update(data);
    return signer.sign();
}
...