最近研究了一下MS CryptoAPI的用法,略有心得.若是須要使用非對稱加密方案,MS CryptoAPI卻是一個不錯的選擇.
l 每一個用戶均可以在獲取CSP(CryptAcquireContext)時經過指定Container的名稱來建立本身的Key Container;也能夠使用NULL參數獲取缺省的Key Containner;經過Key Container用戶能夠建立或獲取本身的公私鑰對.
l 當用戶首次使用本身的Key Container時須要建立本身的公私鑰對(CryptGenKey).注意:一旦建立了公私鑰對,操做系統就會自動保存下來.
l CRYPTAPI提供兩種公私鑰對:「交換公私鑰對」和「數字簽名公私鑰對」.
Exchange Public/Private Key Pair
思想:
2 發送者使用接收者的Public Key對Session Key進行加密,這樣只有指定的接收者可以得到正確的Session Key;接收者須要預先將本身的Public Key交給發送者;
2 只對Session Key進行非對稱加密,而整個消息使用session key進行對稱加密;
2 使用Exchang public/private key pair能夠確保消息只能被指定的接收者讀取;
發送者步驟:
1. 獲取或建立指定的CSP(CryptAcquireContext).
2. 獲取或建立本身的Key Container(CryptGetUserKey或CryptGenKey).
3. 建立一個hash對象(CryptCreateHash).
4. 根據原始消息生成Hash值(CryptHashData).
5. 從上述Hash值派生出session key(CryptDeriveKey).
6. 導入接收者的public key(CryptImportKey).
7. 使用session key對消息進行加密同時使用接收者的public key對session key進行加密.
接收者步驟:
1. 獲取或建立指定的CSP(CryptAcquireContext).
2. 獲取或建立本身的Key Container(CryptGetUserKey或CryptGenKey).
3. 使用本身的private key對session key進行解密,而後使用session key對消息進行解密(CryptDecrypt).
Digital Signature Key Pair
思想:
2 發送者首先產生消息的摘要(注意消息自己並不加密),而後用本身的private key對此摘要進行加密.
2 加密後的摘要做爲數字簽名,與原始消息一塊兒傳遞給接收者.
2 接收者使用發送者的public Key的對摘要進行解密並計算收到消息的摘要,而後經過比較確認簽名是否正確.
2 使用Digital Signature Key Pair能夠確保消息來自指定的發送者,而不是別的冒充者;但它並不保護消息內容不被泄漏
發送者步驟:
1. 獲取或建立指定的CSP(CryptAcquireContext).
2. 獲取或建立本身的Key Container(CryptGetUserKey或CryptGenKey).
3. 導出本身的public key給接收端(CryptExportKey).
4. 建立一個HASH對象(CryptCreateHash).
5. 計算原始的消息的Hash值(CryptHashData).
6. 使用本身的private key對Hash值進行加密(CryptSignHash).
7. 將原始消息和簽名後的Hash值發送給接收端.
接收者步驟:
1. 獲取或建立指定的CSP(CryptAcquireContext).
2. 導入發送者的public key(CryptImportKey).
3. 建立一個HASH對象(CryptCreateHash).
4. 計算原始的消息的Hash值(CryptHashData).
5. 驗證簽名是否屬於指定的發送者(CryptVerifySignature).
總結:
使用MS CryptoAPI的非對稱加密方案時,應根據實際狀況選擇正確的Key Pair.
l Exchange Public/Private Key Pair適用於向特定接收者傳輸數據的情形,前提是發送者須要預知接收者的public key;
l Digital Signature Key Pair適用於須要驗證發送者身份的情形,前提是接收者須要預知發送者的public key