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

Microsoft CryptoAPI 加密技術入門 (一):架構、CSP 與檔案加密實作

     編輯:關於C++

加密技術分類

  • 公開金鑰加密:非對稱,公鑰加密/私鑰解密,安全但慢 (RSA, ECC)。
  • 對稱加密:同一金鑰加解密,快但需安全分發金鑰 (AES, 3DES, RC4)。
  • 混合加密:資料用對稱金鑰加密,對稱金鑰用非對稱加密保護 (SSL/TLS、PGP、CryptoAPI 標準流程)。
  • 數位簽章:私鑰簽署雜湊值,公鑰驗證來源與完整性。

CryptoAPI 架構

應用程式 → CryptoAPI (標準介面) → CSP (密碼服務提供者,實作演算法) → 可選硬體 (智慧卡、HSM)。類似 GDI 與顯示驅動關係。

CSP 類型與支援演算法:

CSP 類型金鑰交換簽章對稱加密雜湊
PROV_RSA_FULLRSARSARC2, RC4MD5, SHA
PROV_RSA_SCHANNELRSARSARC4, DES, 3DESMD5, SHA
PROV_DSS無DSS無MD5, SHA

金鑰容器管理

  • 每個 CSP 擁有金鑰資料庫,包含多個金鑰容器 (Key Container)。
  • 容器名稱唯一,儲存特定使用者的金鑰對 (交換金鑰對 + 簽章金鑰對)。
  • CryptAcquireContext 取得 CSP Handle,若容器不存在可建立 (CRYPT_NEWKEYSET) 或刪除 (CRYPT_DELETEKEYSET)。

HCRYPTPROV hProv;
if (!CryptAcquireContext(&hProv, "MyContainer", NULL, PROV_RSA_FULL, 0)) {
    if (!CryptAcquireContext(&hProv, "MyContainer", NULL, PROV_RSA_FULL, CRYPT_NEWKEYSET))
        Error("建立容器失敗");
}

檔案加密完整範例 (密碼衍生金鑰)

流程:開啟檔案 → 取得 CSP → 以密碼建立 MD5 雜湊 → CryptDeriveKey 產生 RC4 Session Key → 逐塊 CryptEncrypt 寫入目的檔。解密流程對稱,使用 CryptDecrypt。

關鍵點:

  • 區塊加密 (RC2) 需對齊區塊大小,緩衝區預留一個區塊。
  • 流加密 (RC4) 無對齊需求。
  • 最後一塊需設定 Final=TRUE 讓 CSP 處理填補。
  • 完成後必須釋放金鑰、雜湊、CSP Handle、關閉檔案、釋放記憶體。

編譯設定

  • 定義 _WIN32_WINNT=0x0400 (NT4) 或 0x0500 (Win2K)
  • 連結 advapi32.lib
  • 包含 <wincrypt.h>
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved