2017-06-19 64 views
0

我正在使用用於簽署pdf文檔的智能卡設備。我已經知道如何使用itext簽署pdf。使用外部數字簽名在C中創建pkcs#7對象

我有一個20個字節SHA-1散列,256字節的簽名(RSA通過智能卡私鑰加密)和一個公鑰(.cer證書)

有沒有一種方法來創建一個PKCS#7二進制C中的對象,使用一個免費的庫,如cryptlib?

+0

很可能,但您需要訪問智能卡以獲得私鑰操作。舊簽名是無用的。 「cryptlib可以利用各種外部加密設備的加密功能,例如硬件加密加速器,Fortezza卡,PKCS#11設備,硬件安全模塊(HSM)和加密智能卡,它可以用於多種加密設備已經收到FIPS 140或ITSEC/Common Criteria認證,加密設備接口還提供通用插件功能,用於添加cryptlib可以使用的新功能。 –

+0

請注意,SHA-1不再被認爲是安全的,特別是不適用於不可否認的長期簽名存儲。 –

+0

我已經有了來自卡的簽名字節和文件的散列。我剩下的只是創建PKCS#7對象。我找不到任何地方如何以編程方式創建PKCS#7二進制對象。 – GLC

回答

0

您似乎想要使用預先計算的簽名來生成PKCS#7/CMS(加密消息語法)簽名。

這是 - 令我驚訝 - 可能的,但對於一個非常大的IFIF是CMS消息不包含需要籤​​名的任何附加元數據。 In the badly phrased words of the CMS RFC

... 

When the signedAttrs field is absent, only the octets comprising the 
value of the SignedData encapContentInfo eContent OCTET STRING (e.g., 
the contents of a file) are input to the message digest calculation. 
This has the advantage that the length of the content being signed 
need not be known in advance of the signature generation process. 

... 

可以在例如OpenSSL using the -noattr command line option排除signedAtrrs。不幸的是,我沒有找到直接包含簽名值本身的方法,但使用OpenSSL的C API非常有可能 - 而OpenSSL是開放源代碼的,如果它不是那麼可以修改這個問題「T。


注:

  • 不錯的黑客將創造超過執行CMS時使用不同的密鑰零字節值的簽名,然後查找該值(由二進制搜索或者通過解析ASN.1 CMS結構),然後用您生成的簽名替換該簽名;
  • CryptLib和SHA-1僅在您計劃及時回程時纔有用。我強烈建議使用維護良好的庫和 - 當然 - 安全的哈希。
+0

byte [] hash = DigestAlgorithms.Digest(data,hashAlgorithm); byte [] ocsp = null; byte [] extSignature = externalSignature.Sign(sh); sgn.SetExternalDigest(extSignature,null,externalSignature.GetEncryptionAlgorithm()); byte [] sh = sgn.getAuthenticatedAttributeBytes(hash,..,sigtype); byte [] encodedSig = sgn.GetEncodedPKCS7(hash,tsaClient,ocsp,crlBytes,sigtype); 我寫了除GetEncodedPKCS7方法外的C中的所有步驟。此方法只需要3個參數:散列字節,外部簽名字節和* .cer證書。有沒有辦法在C中實現GetEncodedPKCS7? – GLC