首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

Microsoft CryptoAPI 進階應用 (二):公開金鑰操作、雜湊與數位簽章

     編輯:關於C++

公開/私密金鑰對管理

每個金鑰容器通常包含兩對金鑰:

  • 金鑰交換對 (AT_KEYEXCHANGE):用於加密 Session Key (RSA)。
  • 簽章對 (AT_SIGNATURE):用於數位簽章 (RSA/DSS)。

取得/建立金鑰對:


HCRYPTKEY hKey;
if (!CryptGetUserKey(hProv, AT_SIGNATURE, &hKey)) {
    if (GetLastError() == NTE_NO_KEY) {
        CryptGenKey(hProv, AT_SIGNATURE, 0, &hKey);  // 建立新簽章金鑰對
    }
}

金鑰匯出與匯入 (Blob 格式)

  • 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);

雜湊 (Hash) 操作

雜湊產生固定長度摘要,驗證資料完整性。流程:

  1. CryptCreateHash 建立雜湊物件 (指定演算法如 CALG_MD5/SHA1)。
  2. CryptHashData 累加資料 (可多次呼叫處理大檔案)。
  3. CryptGetHashParam(HP_HASHVAL) 取得雜湊值位元組陣列。
  4. CryptDestroyHash 釋放。

數位簽章完整流程

簽署端 (私鑰)

  1. 對訊息計算雜湊值 (MD5/SHA1)。
  2. CryptSignHash(hHash, AT_SIGNATURE, NULL, 0, pbSignature, &dwSigLen) 以私鑰加密雜湊值產生簽章。
  3. 傳送原始訊息 + 簽章。

驗證端 (公鑰)

  1. 對收到的訊息計算雜湊值 (同演算法)。
  2. 取得簽署者公開金鑰 (從憑證或金鑰 Blob)。
  3. CryptVerifySignature(hHash, pbSignature, dwSigLen, hPubKey, NULL, 0) 驗證。
  4. 成功返回 TRUE,失敗 GetLastError()==NTE_BAD_SIGNATURE 表示訊息被竄改。

圖解簽章驗證原理

金鑰容器結構 簽章生成流程 簽章驗證流程

實務建議

  • 生產環境勿硬編碼金鑰容器名稱,應使用使用者專屬容器或憑證存儲區。
  • 雜湊演算法建議 SHA-256 以上 (CALG_SHA_256),MD5/SHA1 已不建議用於安全簽章。
  • 私鑰保護:啟用 CSP 強制密碼保護 (CRYPT_USER_PROTECTED)、考慮硬體金鑰 (智慧卡/HSM)。
  • 錯誤處理:每個 API 呼叫檢查回傳值,GetLastError() 取得詳細錯誤碼。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved