前言
資訊爆炸時代,資料安全至關重要。Microsoft CryptoAPI 為 Win32 應用程式提供標準加密介面,支援對稱/非對稱加密、雜湊、數位簽章、憑證管理。本文建立核心概念,為深入實作奠基。
一、四大加密模式對比
| 模式 | 金鑰特性 | 優點 | 缺點 | 典型用途 |
| 公開金鑰加密 | 公鑰/私鑰對 | 金鑰分發簡單、支援簽章 | 速度極慢 (對稱的 1/1000) | 金鑰交換、數位簽章、小資料加密 |
| 對稱加密 | 單一共享金鑰 | 速度極快、適合大量資料 | 金鑰分發困難、無不可否認性 | 檔案/通訊加密、資料庫欄位加密 |
| 混合加密 | 對稱加密資料 + 公開金鑰加密對稱金鑰 | 兼具速度與金鑰管理優勢 | 實作複雜度較高 | SSL/TLS、S/MIME、PGP、大多數實務系統 |
| 數位簽章/鑑別 | 私鑰簽章 + 公鑰驗證 | 確保完整性、來源認證、不可否認 | 需 PKI 基礎設施 | 程式碼簽署、文件簽署、交易不可否認 |
二、CryptoAPI 架構模型
類似 GDI (圖形裝置介面) 分層設計:
應用程式層
↓ 呼叫標準 API
CryptoAPI (加密服務介面)
↓ 統一介面
CSP (Cryptographic Service Provider) ← 可替換模組
↓ (可選)
加密硬體 (智慧卡、HSM、TPM)
- 應用程式:完全不接觸 CSP 細節,僅呼叫 CryptoAPI
- CryptoAPI:提供五大功能群
- 簡易訊息函數
- 低層訊息函數
- 基礎加密函數 (核心)
- 憑證編碼/解碼函數
- 憑證存儲管理函數
- CSP:實作具體演算法 (RSA, AES, SHA 等),由廠商提供 (Microsoft Base/Enhanced/Strong CSP 等)
- 加密硬體:金鑰產生/儲存於安全元件,私鑰永不離開硬體
三、核心物件與控制代碼
| 控制代碼 | 代表 | 生命週期 |
| HCRYPTPROV | CSP 內容提供者語境 | 進程級,通常一個進程一個 |
| HCRYPTKEY | 金鑰 (對稱/非對稱/Session) | 依需求建立/銷毀 |
| HCRYPTHASH | 雜湊物件 | 計算期間持有 |
四、基本初始化流程
HCRYPTPROV hProv = 0;
// 1. 取得預設 CSP 語境 (Microsoft Base Cryptographic Provider v1.0)
if (!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, 0)) {
DWORD err = GetLastError();
if (err == NTE_BAD_KEYSET) {
// 容器不存在,建立新容器
if (!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_NEWKEYSET)) {
// 失敗處理
}
} else {
// 其他錯誤
}
}
// 後續使用 hProv 建立金鑰、雜湊、加解密...
// 結束時釋放
CryptReleaseContext(hProv, 0);
五、CSP 類型與選擇
| CSP 名稱 | 類型 | 支援演算法 | 用途 |
| Microsoft Base Cryptographic Provider v1.0 | PROV_RSA_FULL | RSA (512-1024), RC2, RC4, DES, SHA1, MD5 | 一般相容性 |
| Microsoft Enhanced Cryptographic Provider v1.0 | PROV_RSA_FULL | Base + RSA (1024-16384), 3DES, AES (128/192/256) | 強加密需求 |
| Microsoft Strong Cryptographic Provider | PROV_RSA_FULL | Enhanced + 更長金鑰 | 高安全環境 |
| Microsoft AES Cryptographic Provider | PROV_RSA_AES | AES 專用 | 純 AES 應用 |
| Microsoft Smart Card Key Storage Provider | PROV_RSA_SCHANNEL | 硬體金鑰儲存 | 智慧卡/TPM |
六、關鍵資料結構:金鑰 Blob
金鑰在記憶體/檔案中以 Blob 形式儲存:
PUBLICKEYBLOB:公開金鑰 (可安全傳輸)
PRIVATEKEYBLOB:私有金鑰 (需加密保護)
SIMPLEBLOB:用公開金鑰加密的對稱金鑰 (金鑰交換)
OPAQUEKEYBLOB:硬體金鑰參考 (不含實際金鑰材料)
七、現代化提醒
CryptoAPI 為 Legacy API。Windows Vista+ 引入 CNG (Cryptography Next Generation),提供:
- 現代演算法:AES-GCM, ChaCha20-Poly1305, ECDSA (P-256/P-384), Ed25519, SHA-3
- 更佳效能:硬體加速 (AES-NI, SHA-NI)、非同步操作
- 彈性金鑰儲存:KSP (Key Storage Provider) 支援 TPM、VBS、雲端 HSM
- 更安全的預設值:常數時間實作、抗側邊通道攻擊
新專案請直接使用 BCrypt*/NCrypt* API。
結語
CryptoAPI 以 CSP 抽象層統一加密服務,核心在於 HCRYPTPROV 語境管理、金鑰 Blob 序列化與五大功能群協作。掌握架構模型與初始化流程,是進入 Windows 密碼學開發的必經之路。
- 上一篇文章: Microsoft CryptoAPI 加密技術深度解析(二):非對稱加密、雜湊與數位簽章
- 下一篇文章: C++ 類別物件複製機制深度解析:複製建構子、預設行為與自訂實作
Copyright ©
程式碼之家 All Rights Reserved