2011-10-06 49 views
2

我正在使用visual studio 2005和C++。使用windows簽名哈希密碼函數C++

你好,我用一個很好的函數來簽字CryptSignMessage。通過這個,我可以指定簽名屬性,簽名人證書,無符號屬性,是否分離等等。

然而,這個函數的參數之一是「原文件」,其中根據文檔此創建指定內容的散列值,並簽署哈希

我不知道如果我能創造一個簽名等同,只使用文檔的散列。我沒有文件,我只有散列。

我發現CryptSignHash,但是此功能不允許指定參數作爲簽名屬性或無符號屬性和/或簽名人的證書。根據我的研究,這個函數似乎返回一個PKCS#1,後來我應該建立簽名PKCS#7的結構。因此,希望知道是否有任何方法可以對散列進行簽名,以及是否有方法使用Windows函數從PKCS#1創建PKCS#7結構。還是有什麼辦法只簽署散列,就像使用CryptSignMessage一樣簡單?

#UPDATE 1

的CryptSignHash不返回PKCS#1。用PKCS#1填充返回一個字節數組。
我試圖用CryptMsgOpenToEncodeCryptSignMessage作爲「NULL」傳遞內容,並將散列添加到簽名屬性中,他們計算出散列的散列。

是否有任何方式使用Windows功能來做到這一點?

+1

只是說明:你不應該簽署你沒有見過的文件。這可能會產生重要的法律影響。 –

+0

謝謝。此功能將防止帶寬消耗。 – Cobaia

+1

如果您信任某人(即您的有限帶寬頻道另一端的人/節目/ ...),那麼您將簽署他發給您的任何內容(無論是散列還是整個文檔),您都可以幾乎直接把你的私鑰給他。 (我仍然會回答你的問題,但我對Windows加密API一無所知,抱歉。) –

回答

0

在不計算哈希的情況下籤署哈希是一個糟糕的主意。見Sign a HashGenerate digest and signature separatelyMFSA 2006-60

+0

感謝您的回覆,我意識到這些鏈接是關於gnupg的。我想使用Windows的函數。 – Cobaia

+0

@Cobaia: - 是的,他們是其他程序/庫的鏈接(該主題已在其他地方討論過)。問題的關鍵在於簽署散列(1)你沒有將自己分開,或者(2)在簽署時沒有計算。非常糟糕的業力。 – jww