我一直在尋找通過嘗試瞭解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是否會替換任何現有公鑰/私鑰對的公鑰?我認爲不是。
謝謝,這有很大幫助。有些事情我仍然有點模糊。 1)假設我有人的公鑰key_exchange鍵。我可以用它來加密一些數據(可能是密鑰交換數據)並將這些數據發送給密鑰的所有者。他可以打開適當的密鑰容器,使用crptygetuserkey()獲取key_exchange對的句柄並解密數據。對? 2)唯一的東西是永久保存在密鑰容器中的一個簽名密鑰對和一個key_exchange對嗎?還是有其他類型的鑰匙永久保存? 3)我無法在MSDN中找到任何cryptdeletekey()函數。 – 2009-09-23 14:21:10
1)是的。 2)是的,只有一兩個密鑰對。 3)對不起,我的錯誤:通過使用CRYPT_DELETEKEYSET標誌調用CryptAcquireContext來刪除鍵(我修復了答案) - – 2009-09-23 15:11:57