2009-09-22 66 views
2

我一直在尋找通過嘗試瞭解crytoapi的MSDN。以下是關於事情如何工作的一些問題和猜測。任何答案或確認或反駁我的猜測都非常感謝。關於Microsoft CryptoAPI的基本問題

根據我發現在http://msdn.microsoft.com/en-us/library/ms867086.aspx筆記,CSP保持會話之間的公私密鑰對。

* Does that mean they are kept indefinitely? If so, whatever signature or exchange key pairs are extant when the CSP is closed remain. 
* Of what value are these containers and any key pairs they contain? I guess they could be used to sign things without obtaining a handle to a key pair. 
* Is there any way to get a handle to one of the key pairs? 

在我看來,就好像一個密鑰容器可以包含:

* 1 signature key pair 
* 1 key exchange key pair 
* any number of PUBLIC keys of either signature or key_exchange type 
* any number of session keys 

這是正確的嗎?容器關閉時,非配對的鑰匙是否被銷燬?

創建/命名密鑰容器的常用方法是什麼?如何避免跺腳一些其他應用程序容器?我需要一個帶公鑰/私鑰的容器,因此cryptacquirecontext的備註部分中提到的臨時容器不適用。 也許使用由一些固定部分加一個序列號組成的創建名稱。完成後可以刪除容器。

cryptsignhash指定簽名或密​​鑰交換私鑰用於簽名散列。我想這意味着cryptsignkey會找到由cryptkeygen創建的私鑰,並使用合適的Alg_id參數(值CALG_RSA_KEYX或CALG_RSA_SIGN)。

如果我導出密鑰,keyblob是否包含告訴它是什麼樣的密鑰的信息?

如果我導出PUBLICKEYBLOB並將其傳輸到其他某個環境。在我可以使用它來驗證簽名之前,我必須在新環境中導入該blob嗎? cryptverifysignature需要一個關鍵句柄,所以它看起來像必須先導入。導入PUBLICKEYBLOB是否會替換任何現有公鑰/私鑰對的公鑰?我認爲不是。

+0

謝謝,這有很大幫助。有些事情我仍然有點模糊。 1)假設我有人的公鑰key_exchange鍵。我可以用它來加密一些數據(可能是密鑰交換數據)並將這些數據發送給密鑰的所有者。他可以打開適當的密鑰容器,使用crptygetuserkey()獲取key_exchange對的句柄並解密數據。對? 2)唯一的東西是永久保存在密鑰容器中的一個簽名密鑰對和一個key_exchange對嗎?還是有其他類型的鑰匙永久保存? 3)我無法在MSDN中找到任何cryptdeletekey()函數。 – 2009-09-23 14:21:10

+0

1)是的。 2)是的,只有一兩個密鑰對。 3)對不起,我的錯誤:通過使用CRYPT_DELETEKEYSET標誌調用CryptAcquireContext來刪除鍵(我修復了答案) - – 2009-09-23 15:11:57

回答

4

這是很多問題。讓我試着回答它們:

CSP在會話之間保持公鑰密碼對 。 這是否意味着它們被無限期地保存下來?

是的,直到通過使用CRYPT_DELETEKEYSET標誌調用CryptAcquireContext來明確刪除它們。

中什麼樣的價值是這些容器和其中包含的密鑰對?

他們是可以重複使用持久鍵。如果您在私鑰上獲得證書,您希望保留私鑰 - 如果您可以避免私鑰,則不希望導出私鑰:CSP可能比您能夠更好地保護密鑰。

有沒有什麼辦法讓一個句柄密鑰對中的一個?

CryptAcquireContext後跟CryptGetUserKey。

在我看來,就好像一個密鑰容器 可以包含:1個簽名密鑰對,1密鑰交換密鑰對,任何數量無論是簽名還是key_exchange類型,任何數量的會話密鑰的公鑰。它是否正確?

是,也不是。導入的公鑰和會話密鑰在邏輯上不在任何特定的密鑰容器中。

當容器被關閉時,非配對 鑰匙是否被銷燬?

是的。

創建/命名密鑰容器的常用方法是什麼? 如何避免跺腳某些 其他應用程序容器?

大多數應用程序使用GUID。

這意味着cryptsignkey將 找到 cryptkeygen與適當的 ALG_ID parmeter創建的私有密鑰(值CALG_RSA_KEYX 或CALG_RSA_SIGN)。

是的。

如果我出口的一個關鍵,確實密鑰塊 包含的信息告訴哪些關鍵的樣 它是什麼?

這取決於所選擇的BLOB類型,但大多數密鑰塊與包含密鑰類型BLOBHEADER開始。

如果我導出PUBLICKEYBLOB和 它運輸到其他 環境。我必須在新環境中導入 blob,然後我才能使用 驗證簽名嗎?

是的。

是否導入 PUBLICKEYBLOB取代任何現存的公共/私有密鑰對的公鑰 ?