智慧卡(內建加密晶片的卡片)已成企業身分驗證、數位簽章、DRM 授權儲存的主流載體。Windows Vista 引入卡模組 API,取代舊有 CSP 架構,提供檔案系統風格的高階介面,讓應用程式無需知道卡片廠牌指令即可讀寫檔案、驗證 PIN、管理金鑰。本文基於 Vista 預發布版,詳細說明 PC/SC 架構、WinSCard API、卡模組 P/Invoke 封裝、事務管理、CLR 加密整合,並提供完整 C# 範例程式下載連結。
SCardBeginTransaction 取得讀卡機獨佔鎖,SCardEndTransaction 釋放。| 層級 | 功能 | 代表函式 |
|---|---|---|
| PC/SC 基礎 | 建立上下文、列舉讀卡機、連線卡片、傳輸 APDU | SCardEstablishContext, SCardListReaders, SCardConnect, SCardTransmit |
| UI 輔助 | 彈出選卡對話框 | SCardUIDlgSelectCardW(結構體 OPENCARDNAME_EXW 複雜,建議封裝 Native Wrapper) |
| 卡模組高階 | 檔案建立/讀寫/刪除、PIN 驗證、金鑰產生 | CardAcquireContext, CardCreateFile, CardReadFile, CardWriteFile, CardAuthenticatePin, CardDeleteFile |
SCardUIDlgSelectCardW、CardAcquireContext 等複雜結構體與回呼指標,簡化 Managed 呼叫。CARD_DATA 結構與卡模組函式指標(pfnCardReadFile 等)。PFN_CSP_ALLOC/FREE 委派,解決卡模組輸出緩衝區由呼叫端配置的問題。GetSmartCard 取得卡片控制權後,保持鎖定直到所有卡模組操作完成,避免他行程竄改卡片狀態。RSACryptoServiceProvider.Decrypt 前必須 SCardEndTransaction,否則雙重鎖定導致死結。CardAuthenticatePin 成功後執行權限操作,結束前呼叫 CardDeauthenticate;若卡片不支援去驗證,需 SCardDisconnect(SCARD_RESET_CARD) 強制重置。1. GetSmartCard() → 取得卡片控制權、ATR、卡模組 Context
2. CLR RSA (Base Smart Card Crypto Provider) 產生/載入金鑰對
3. 建立 XML 授權資料 → RSA 加密 → 簽章
4. CardDeleteFile("license") → CardCreateFile("license", size) → CardWriteFile("license", encryptedBlob)
5. CardReadFile("license") → RSA 解密 → 驗證完整性
6. CardDeauthenticate → SCardEndTransaction → SCardDisconnect → SCardReleaseContext
cardmod.h)「卡模組 API 將智慧卡抽象為『可攜式安全檔案系統』,讓開發者專注於業務邏輯而非 APDU 指令細節,是 Vista 安全架構的關鍵里程碑。」
完整原始碼下載:SmartCards2006_11.exe (2.0 MB)