要創建標準格式(CMS/CADES-EPES)一個分離的數字簽名什麼。
如何創建數字簽名現在
我創建文件哈希值(SHA-256),獲得哈希算法ID,並給它全部變成一條消息,發送到智能卡(JavaCard的)。爲此消息(RSA-512)生成分離簽名併發回。我能夠驗證使用純Java(到目前爲止,還沒有BouncyCastle的),使用這段代碼簽名:
RSAPublicKey pubK = (RSAPublicKey) cert.getPublicKey();
Signature sig = Signature.getInstance("SHA256withRSA", "BC");
sig.initVerify(pubK);
//load signed file and update sig
...
sig.verify(signedMessage)
問題
我的目標是讓CMS(PKCS#7)從已簽名的數據簽名。 Hovever,如此處所述 - >How can we Convert PKCS#1 to PKCS #7 if I have the Certificate? - 將「轉換」爲CMS不容易使用簽名屬性。那麼,讓我們說,我想嘗試它(只是爲了有備份解決方案)。首先,我嘗試使用BouncyCastle。但是,我無法找到與已簽名的數據並且無法訪問主鍵的方法(因爲它在智能卡上無法導出)。所以,我跟原生的Java庫,這樣試了一下:
X500Name xName = X500Name.asX500Name(cert.getSubjectX500Principal());
BigInteger serial = cert.getSerialNumber();
AlgorithmId digestAlgorithmId = new AlgorithmId(AlgorithmId.SHA512_oid);
AlgorithmId signAlgorithmId = new AlgorithmId(AlgorithmId.RSAEncryption_oid);
//SignerInfo
SignerInfo sInfo = new SignerInfo(xName, serial, digestAlgorithmId, signAlgorithmId, signatureBytes);
//Create ContentInfo
ContentInfo cInfo = new ContentInfo(ContentInfo.DATA_OID, new DerValue(DerValue.tag_OctetString, dataToSign));
//create PKCS7 signature
PKCS7 p7 = new PKCS7(new AlgorithmId[] { digestAlgorithmId }, cInfo,
new java.security.cert.X509Certificate[] { cert },
new SignerInfo[] { sInfo });
//Write PKCS7 to bYteArray
ByteArrayOutputStream bOut = new DerOutputStream();
p7.encodeSignedData(bOut);
byte[] encodedPKCS7 = bOut.toByteArray();
這種做法似乎「不正確的」給我說實話,我是甚至無法使用PKCS7.verify()方法來驗證它(它返回null ,這是不成功的驗證,並且不會引發異常)。
所以我的問題是:
- 有沒有辦法直接獲取從JavaCard的一個CMS簽名?
- 是否可以從已經生成的簽名中創建CMS簽名只有簽名者證書(沒有訪問私鑰)?
- 您是否發現上述「轉換」代碼有問題?
- 您是否知道任何可用於驗證分離簽名的工具? (能夠檢查我的結果)
A正在尋找2周的答案,現在我真的很絕望。感謝您的任何信息/幫助。
您還沒有接受任何的答案您以前的兩個問題,沒有說明原因。 – 2013-02-26 22:23:16
您使用的是'sun.security.x509.AlgorithmId'類? – 2013-02-26 22:28:53
@owlstead,Ups!我不知道,我可以/應該接受答案。感謝您的通知。是的,我正在使用sun.security.x509.AlgorithmId – AGO 2013-02-27 08:33:27