每個金鑰容器通常包含兩對金鑰:
取得/建立金鑰對:
HCRYPTKEY hKey;
if (!CryptGetUserKey(hProv, AT_SIGNATURE, &hKey)) {
if (GetLastError() == NTE_NO_KEY) {
CryptGenKey(hProv, AT_SIGNATURE, 0, &hKey); // 建立新簽章金鑰對
}
}
PUBLICKEYBLOB:僅公開金鑰,可安全分發。PRIVATEKEYBLOB:含私鑰,極度敏感,需加密儲存。SIMPLEBLOB:Session Key 經公開金鑰加密後的封裝。
// 匯出公開金鑰
DWORD dwLen;
CryptExportKey(hKey, NULL, PUBLICKEYBLOB, 0, NULL, &dwLen);
PBYTE pbBlob = new BYTE[dwLen];
CryptExportKey(hKey, NULL, PUBLICKEYBLOB, 0, pbBlob, &dwLen);
// 寫入檔案或傳輸...
// 匯入公開金鑰
CryptImportKey(hProv, pbBlob, dwLen, 0, 0, &hPubKey);
雜湊產生固定長度摘要,驗證資料完整性。流程:
CryptCreateHash 建立雜湊物件 (指定演算法如 CALG_MD5/SHA1)。CryptHashData 累加資料 (可多次呼叫處理大檔案)。CryptGetHashParam(HP_HASHVAL) 取得雜湊值位元組陣列。CryptDestroyHash 釋放。CryptSignHash(hHash, AT_SIGNATURE, NULL, 0, pbSignature, &dwSigLen) 以私鑰加密雜湊值產生簽章。CryptVerifySignature(hHash, pbSignature, dwSigLen, hPubKey, NULL, 0) 驗證。GetLastError()==NTE_BAD_SIGNATURE 表示訊息被竄改。

CRYPT_USER_PROTECTED)、考慮硬體金鑰 (智慧卡/HSM)。GetLastError() 取得詳細錯誤碼。