2012-04-24 35 views
0

我曾經見過很多類似的問題,但我還沒有找到正確的答案。在Java中生成並編碼PKCS7消息

我得到了由C#生成並編碼的簽名SignedCms

我的目標是在Java中生成相同的簽名。 我設法創建了一個具有相同長度和大部分數據的相似簽名。 但是從120到133位的位置不同,並且最後大約有250位。

根據此Anatomy of PKCS#7 signed message。我有錯誤的簽名和內容塊。 我試過bouncycastle,但我沒有設法生成正確的簽名。 我想使用sun。*類來生成和編碼PKCS#7消息。

 X509Certificate x509 = siginingCert; 
     PrivateKey priv = privateKeyFromPKCS12KeyStore; 
     byte[] data = sha1HashOfDocument 

     String digestAlgorithm = "MD5"; 
     String signingAlgorithm = "SHA1withRSA"; 

     AlgorithmId[] digestAlgorithmIds = new AlgorithmId[]{AlgorithmId.get(digestAlgorithm)}; 

     Signature sigSigner = Signature.getInstance(signingAlgorithm); 
     sigSigner.initSign(priv); 
     sigSigner.update(data); 
     byte[] signedAttributes = sigSigner.sign(); 

     ContentInfo contentInfo = new ContentInfo(
       sun.security.pkcs.ContentInfo.DATA_OID, 
       new DerValue(DerValue.tag_OctetString, data)); 

     X509Certificate[] certificates = {x509}; 

     BigInteger serial = x509.getSerialNumber(); 
     String issuerName = x509.getIssuerDN().getName(); 
     AlgorithmId dAlgId = AlgorithmId.getAlgorithmId(digestAlgorithm); 

     SignerInfo si = new SignerInfo(
       new X500Name(issuerName), serial, dAlgId, null, 
       new AlgorithmId(AlgorithmId.RSAEncryption_oid), 
       signedAttributes, null); 

     SignerInfo[] signerInfos = {si}; 
     PKCS7 p7 = new PKCS7(digestAlgorithmIds, contentInfo, certificates, signerInfos); 
     ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
     p7.encodeSignedData(bytes); 

我被困在這個問題上,我不知道我錯過了。

任何幫助表示讚賞。非常感謝。

+0

http://stackoverflow.com/questions/11013111/java-implementation-of-c-sharp-signedcms與此類似 – nixspirit 2012-06-14 03:45:26

回答

0
byte[] signedData = signature.sign(); 

    SignerInfo si = new SignerInfo(
      new X500Name(issuerName), serial, dAlgId, null, 
      new AlgorithmId(AlgorithmId.RSAEncryption_oid), 
      signedAttributes,signedData );