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

C++ Builder 實現數位簽名完整教學:從原理到 CAPI 程式碼實戰

     編輯:VC 教學

數位簽名技術原理與 Windows CAPI 實作指南

在網路傳輸中,如何確保資料未被竄改?數位簽名提供了解決方案。本文詳細解析數位簽名工作原理,並提供基於 C++ Builder 使用 Windows CryptoAPI (CAPI) 實現檔案簽名與驗證的完整程式碼範例。

核心原理:雜湊 + 非對稱加密

數位簽名流程包含三步:

  1. 雜湊計算:對原始資料計算固定長度雜湊值(如 MD5/SHA1),任何微小變動會導致完全不同的雜湊
  2. 私鑰簽名:發送方用私鑰加密雜湊值,產生數位簽名
  3. 公開驗證:接收方用發送方公鑰解密簽名得雜湊值,並獨立計算收到資料的雜湊,兩者比對決定資料完整性

Windows CAPI 關鍵函數串聯

程式碼展示兩大核心流程:

建立簽名流程

CryptAcquireContext(&hProv, ...)     // 取得 CSP 控制代碼
CryptCreateHash(hProv, CALG_MD5, ...) // 建立雜湊物件
CryptHashData(hHash, buffer, ...)     // 逐塊輸入檔案資料計算雜湊
CryptSignHash(hHash, AT_SIGNATURE, ...) // 私鑰簽名雜湊值

驗證簽名流程

CryptGetUserKey(hProv, AT_SIGNATURE, &hPublicKey) // 取得公鑰
CryptCreateHash + CryptHashData                  // 重新計算雜湊
CryptVerifySignature(hHash, pSignature, ...)     // 公鑰驗證

程式碼關鍵細節解析

  • 緩衝區大小:BUFFER=4096 平衡 I/O 效率與記憶體佔用
  • 簽名緩衝區:pSignature[256] 足夠容納 RSA-1024 簽名
  • 錯誤處理:每個 CAPI 呼叫後檢查回傳值,失敗時進入錯誤處理區塊
  • 資料流處理:採用 TFileStream 讀取檔案,配合 do-while 迴圈分塊處理大檔案

實戰應用建議

  1. 金鑰管理:實際部署需妥善保管私鑰,建議使用硬體安全模組 (HSM)
  2. 演算法升級:MD5 已不安全,生產環境請改用 CALG_SHA_256 或更強
  3. 簽名封裝:可將簽名與原始資料分離儲存,或封裝於 PKCS#7/CMS 結構中
  4. 時間戳記:結合 RFC 3161 時間戳記服務防止憑證過期導致簽名失效

常見問題排查

  • NTE_BAD_SIGNATURE:資料已被修改或公鑰不匹配
  • CRYPT_E_NOT_FOUND:找不到對應的金鑰容器
  • 大檔案簽名緩慢:考慮非同步 I/O 或硬體加速

本範例為教學用途簡化實現,生產環境需補全錯誤碼對應訊息、日誌記錄、例外處理等工程化細節。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved