2011-12-06 61 views
4

在Java中,我試圖簽下與充氣城堡和本說明書中的證書一個byte [](這是我SHA256消化我的文檔):在Java中,數字簽名與BouncyCastle的

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

第14.1.4.1.1節數字簽名的生成。

我在有彈性的Java文檔發現這個方法:

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

任何理由不使用'java.security'的API? – martijno

+0

沒理由,你是對的。 – Baptiste

回答

5

EBICS簽名A005是具有SHA-256摘要算法和PKCS#11.5填充的RSA簽名。但是,您在此粘貼的代碼示例創建的CMS簽名使用「低級」RSA簽名,但是結構要複雜得多(有關全面的詳細信息,請參閱RFC 5652 http://www.rfc-editor.org/rfc/rfc5652.txt)。

希望,產生你想獲得簽名與Java加密API很簡單:

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

你知道EBICS嗎?你能幫我用HPB訂單嗎?通過郵件或IM? – Baptiste

+0

不幸的是,我不這麼認爲。我只是看了一下簽名規範,但我的EBICS知識在此結束。 – Jcs