CSP開發基礎--CryptoAPI函式簡介
CryptoAPI體系主要由一下幾部分組成:
基本加密函式、證書編碼與解碼函式、證書儲存函式、簡化資訊處理函式、底層資訊處理函式。
1、基本加密函式
CSP是真正實行加密的獨立模組,他既可以由軟體實現也可以由硬體實現。但是他必須符合CryptoAPI介面的規範。
每個CSP都有一個名字和一個型別。每個CSP的名字是唯一的,這樣便於CryptoAPI找到對應的CSP。目前已經有9種CSP型別,並且還在增長。下表列出出它們支援的金鑰交換演算法、簽名演算法、對稱加密演算法和Hash演算法。
CSP型別 |
交換演算法 |
簽名演算法 |
對稱加密演算法 |
Hash演算法 |
PROV_RSA_FULL |
RSA |
RSA |
RC2 |
MD5 |
PROV_RSA_SIG |
none |
RSA |
none |
MD5 |
PROV_RSA_SCHANNEL |
RSA |
RSA |
RC4 |
MD5 |
PROV_DSS |
DSS |
none |
DSS |
MD5 |
PROV_DSS_DH |
DH |
DSS |
CYLINK_MEK |
MD5 |
PROV_DH_SCHANNEL |
DH |
DSS |
DES |
MD5 |
PROV_FORTEZZA |
KEA |
DSS |
Skipjack |
SHA |
PROV_MS_EXCHANGE |
RSA |
RSA |
CAST |
MD5 |
PROV_SSL |
RSA |
RSA |
Varies |
Varies |
基本加密函式為開發加密應用程式提供了足夠靈活的空間。所有CSP 的通訊都是通過這些函式。
一個CSP 是實現所有加密操作的獨立模組。在每一個應用程式中至少需要提供一個CSP來完成所需的加密操作。
如果使用多於一個以上的CSP,在加密函式呼叫中就要指定所需的CSP。微軟基本加密提供者(Microsoft Base Cryptographic Provider),是預設繫結到CryptoAPI 裡的。如果沒有指定其他CSP 時,這個CSP 就是卻省的。
每一個CSP 對CryptoAPI 提供了一套不同的實現。一些提供了更加強大的加密演算法,而其他一些CSP 包含了對硬體的支援,比如智慧卡。另外,一些CSP 偶爾和使用者直接通訊,比如數字簽名就使用了使用者的簽名私鑰。
基本加密函式包含了以下幾種:
服務提供者函式:
應用程式使用服務提供者函式來連線和斷開一個CSP。下面就是主要的API:
CryptAcquireContext |
獲得指定CSP 的金鑰容器的控制代碼 |
CryptContextAddRef |
對HCRYPTPROV 控制代碼增加一個應用計數 |
CryptEnumProviders |
列舉當前計算機中的CSP |
CryptEnumProviderTypes |
列舉CSP 的型別 |
CryptGetDefaultProvider |
對於指定CSP 型別的卻省CSP |
CryptGetProvParam |
得到一個CSP 的屬性 |
CryptInstallDefaultContext |
安裝先前得到的HCRYPTPROV 上下文作為當前卻省的上下文 |
CryptReleaseContext |
釋放由CryptAcquireContext 得到的控制代碼 |
CryptSetProvider 和 CryptSetProviderEx |
為指定CSP 型別指定一個卻省的CSP |
CryptSetProvParam |
指定一個CSP 的屬性 |
CryptUninstallDefaultContext |
刪除先前由CryptInstallDefaultContext 安裝的卻省上下文 |
金鑰的產生和交換函式:
金鑰產生函式建立、配置和銷燬加密金鑰。他們也用於和其他使用者進行交換金鑰。下面就是主要的一些函式:
CryptAcquireCertificatePrivateKey |
對於指定證書上下文得到一個HCRYPTPROV 控制代碼和dwKeySpec |
CryptDeriveKey |
從一個密碼中派生一個金鑰 |
CryptDestoryKey |
銷燬金鑰 |
CryptDuplicateKey |
製作一個金鑰和金鑰狀態的精確複製 |
CryptExportKey |
把CSP 的金鑰做成BLOB 傳送到應用程式的記憶體空間中 |
CryptGenKey |
建立一個隨機金鑰 |
CryptGenRandom |
產生一個隨機數 |
CryptGetKeyParam |
得到金鑰的引數 |
CryptGetUserKey |
得到一個金鑰交換或簽名金鑰的控制代碼 |
CryptImportKey |
把一個金鑰BLOB 傳送到CSP中 |
CryptSetKeyParam |
指定一個金鑰的引數 |
編碼/解碼函式:
有一些編碼/解碼函式,他們可以用來對證書、證書撤銷列表、證書請求和證書擴充套件進行編碼和解碼。以下就是這幾個函式:
CryptDecodeObject |
對lpszStructType 結構進行解碼 |
CryptDecodeObjectEx |
對lpszStructType 結構進行解碼,此函式支援記憶體分配選項 |
CryptEncodeObject |
對lpszStructType 結構進行編碼 |
CyptEncodeObjectEx |
對lpszStructType 結構進行編碼,此函式支援記憶體分配選項 |
資料加密/解密函式:
這些函式支援資料的加密/解密操作。CryptEncrypt 和CryptDecrypt 要求在被呼叫前指定一個金鑰。這個金鑰可以由CryptGenKey、CryptDeriveKey 或CryptImportKey 產生。建立金鑰時要指定加密演算法。CryptSetKeyParam 函式可以指定額外的加密引數。
CryptDecrypt |
使用指定加密金鑰來解密一段密文 |
CryptEncrypt |
使用指定加密金鑰來加密一段明文 |
CryptProtectData |
執行對DATA_BLOB 結構的加密 |
CryptUnprotectData |
執行對DATA_BLOB 結構的完整性驗證和解密 |
雜湊和數字簽名函式:
這些函式在應用程式中完成計算雜湊、建立和校驗數字簽名。
CryptCreateHash |
建立一個空雜湊物件 |
CryptDestoryHash |
銷燬一個雜湊物件 |
CryptDuplicateHash |
複製一個雜湊物件 |
CryptGetHashParam |
得到一個雜湊物件引數 |
CryptHashData |
對一塊資料進行雜湊,把它加到指定的雜湊物件中 |
CryptHashSessionKey |
對一個會話金鑰進行雜湊,把它加到指定的雜湊物件中 |
CryptSetHashParam |
設定一個雜湊物件的引數 |
CryptSignHash |
對一個雜湊物件進行簽名 |
CryptVerifySignature |
校驗一個數字簽名 |
2、證書和證書庫函式
這組函式管理、使用和取得證書、證書撤銷列表和證書信任列表。這些函式可以分成一下幾組:
證書庫函式:
一個使用者站點可以收集許多證書。這些證書是為這個站點的使用者所使用的,證書描述了這個使用者的具體身份。對於每個人,可能有一個以上的證書。證書庫和其相關的函式提供了對庫獲得、列舉、驗證和使用證書庫裡的資訊。
以下就是這些函式:
CertAddStoreToCollection |
在證書庫中增加一個證書 |
CertCloseStore |
關閉一個證書庫控制代碼 |
CertControlStore |
如果證書緩衝區和證書本身內容不相符時,允許給應用程式發一個通知 |
CertDuplicateStore |
通過增加引用計數來複制證書庫控制代碼 |
CertEnumPhysicalStore |
對於指定系統庫列舉物理庫 |
CertEnumSystemStore |
列舉所有可用的系統庫 |
CertEnumSystemStoreLocation |
列舉可用系統庫的所有位置 |
CertGetStoreProperty |
得到一個庫的屬性 |
CertOpenStore |
使用指定庫型別來開啟證書庫 |
CertOpenSystemStore |
開啟一個系統證書庫 |
CertRegisterPhysicalStore |
在一個註冊系統庫裡增加一個物理庫 |
CertRegisterSystemStore |
註冊一個系統庫 |
CertRemoveStoreFromCollection |
從一個庫集合裡刪除證書庫 |
CertSaveStore |
儲存證書庫 |
CertSetStoreProperty |
設定證書屬性 |
CertUnregisterPhysicalStore |
從系統庫中刪除一個物理庫 |
CertUnregisterSystemStore |
反註冊一個指定系統庫 |
維護函式:
CryptoAPI 提供了證書和證書庫函式如下:
CertAddSerializeElementToStore |
在庫中增加一系列證書或CRL |
CertCreateContext |
從編碼位元組中建立指定上下文 |
CertEnumSubjectInSortedCTL |
在CTL 庫中列舉信任主題 |
CertFindSubjectInCTL |
在CTL 中尋找指定主題 |
CertFindSubjectInSortedCTL |
在分類CTL 中尋找指定主題 |
證書函式:
下列函式是針對於證書的。大多數函式都是處理CRL 和CTL 的。
CertAddCertificateContextToStore |
在證書庫裡增加一個證書上下文 |
CertAddCertificateLinkToStore |
在證書庫裡增加一個對不同庫裡的證書上下文的連結 |
CertAddEncodedCertificateToStore |
把編碼證書轉換成證書上下文並且把它加到證書庫裡 |
CertCreateCertificateContext |
從編碼證書中建立一個證書上下文。但這個上下文並不放到證書庫裡 |
CertCreateSelfSignCertificate |
建立一個自簽名證書 |
CertDeleteCertificateFromStore |
從證書庫裡刪除一個證書 |
CertDuplicateCertificate |
通過增加引用計數來複制證書上下文 |
CertEnumCertificateInStore |
在證書庫裡列舉證書上下文 |
CertFindCertificateInStore |
在證書庫裡尋找證書上下文 |
CertFreeCertificateContext |
釋放一個證書上下文 |
CertGetIssuerCertificateFromStore |
在證書庫裡得到指定主題證書的發行者 |
CertGetSubjectCertificateFromStore |
獲得主題證書的上下文 |
CertGetValidUsages |
返回所有證書的用法 |
CertSerializeCertificateStoreElement |
序列化編碼證書的證書上下文 |
CertVerifySubjectCertificateContext |
使用發行者來驗證主題證書 |
CryptUIDlgViewContext |
顯示證書、CRL 或CTL |
CryptUIDlgSelectCertificateFromStore |
從指定庫中顯示對話方塊,可以從中選擇證書 |
證書撤銷列表函式:
CertAddCRLContextToStore |
在證書庫裡增加一個CRL 上下文 |
CertAddCRLLinkToStore |
在不同的庫裡增加一個CRL 上下文連結 |
CertAddEncodedCRLToStore |
把編碼CRL 轉化成CRL 上下文然後把它加入到證書庫中 |
CertCreateCRLContext |
從編碼CRL 中建立CRL 控制代碼,但不把它加到庫中 |
CertDeleteCRLFromStore |
從證書庫裡刪除一個CRL |
CertDuplicateCRLContext |
通過增加引用計數來複制CRL 上下文 |
CertEnumCRLsInStore |
列舉庫裡的CRL 控制代碼 |
CertFindCertificateInCRL |
從指定證書裡尋找CRL 列表 |
CertFindCRLInStore |
在庫裡尋找CRL 上下文 |
CertFreeCRLContext |
釋放CRL 上下文 |
CertGetCRLFromStore |
從庫裡得到CRL 上下文控制代碼 |
CertSerializeCRLStoreElement |
序列化CRL 上下文的編碼CRL 和它的屬性 |
證書信任列表函式:
CertAddCTLContextToStore |
把一個CTL 上下文加入到證書庫裡 |
CertAddCTLLinkToStore |
給不同庫裡的CRL 上下文新增連結 |
CertAddEncodedCTLToStore |
把編碼CTL 轉化成CTL 上下文並且把它加到證書庫裡 |
CertCreateCTLContext |
從編碼CTL 中建立CTL 上下文 |
CertDeleteCTLFromStore |
從證書庫裡刪除CTL |
CertDuplicateCTLContext |
通過增加引用計數來複制CTL 上下文 |
CertEnumCTLsInStore |
在證書庫裡列舉CTL 上下文 |
CertFindCTLInStore |
在證書庫裡查詢CTL 上下文 |
CertFreeCTLContext |
釋放CTL 上下文 |
CertSerializeCTLStoreElement |
序列化CTL 上下文的編碼CTL 和屬性 |
擴充套件屬性函式:
CertEnumCertificateContextProperties |
列舉指定證書上下文的屬性 |
CertEnumCRLContextProperties |
列舉指定CRL 上下文的屬性 |
CertEnumCTLContextProperties |
列舉指定CTL 上下文的屬性 |
CertGetCertificateContextProperty |
得到證書屬性 |
CertGetCRLContextProperty |
得到CRL 屬性 |
CertGetCTLContextProperty |
得到CTL 屬性 |
CertSetCertificateContextProperty |
設定證書屬性 |
CertSetCRLContextProperty |
設定CRL 屬性 |
CertSetCTLContextProperty |
設定CTL 屬性 |
3、證書驗證函式
證書驗證是通過CTL 和證書列表進行的。
使用CTL 的函式:
CertVerifyCTLUsage |
驗證CTL 用法 |
CryptMsgEncodeAndSignCTL |
編碼和驗證CTL |
CryptMsgGetAndVerifySigner |
從一個訊息中獲得和驗證CTL |
CryptMsgSignCTL |
對包含CTL 的訊息進行簽名 |
證書鏈驗證函式:
CertCreateCertificateChainEngine |
為應用程式建立一個新的非卻省的鏈引擎 |
CertCreateCTLEntryFromCertificateContextProperties |
建立一個CTL 入口 |
CertDuplicateCertificateChain |
通過增加引用計數來複制證書鏈 |
CertFindChainInStore |
在證書庫裡查詢證書鏈 |
CertFreeCertificateChain |
釋放證書鏈 |
CertFreeCertificateChainEngine |
釋放證書鏈引擎 |
CertGetCertificateChain |
從最後一個證書建立一個上下文連結串列 |
CertSetCertificateContextPropertiesFromCTLEntry |
通過CTL 入口屬性來設定證書上下文的屬性 |
CertIsValidCRLForCertificate |
通過檢查CRL 來確定CRL 是否包括指定被撤銷的證書 |
CertVerifyCertificateChainPolicy |
通過檢查證書鏈來確定它的完整性 |
4、訊息函式
CryptoAPI 訊息函式包括兩組:低階訊息函式和簡化訊息函式。
低階訊息函式直接和PKCS#7 訊息工作。這些函式對傳輸的PKCS#7 資料進行編碼,對接收到的PKCS#7 資料進行解碼,並且對接收到的訊息進行解密和驗證。
簡化訊息函式是比較高階的函式,是對幾個低階訊息函式和證書函式的封裝,用來執行指定任務。這些函式在完成一個任務時,減少了函式呼叫的數量,因此簡化了CryptoAPI的使用。
低階訊息函式:
CryptMsgCalculateEncodedLength |
計算加密訊息的長度 |
CryptMsgClose |
關閉加密訊息的控制代碼 |
CryptMsgControl |
執行指定的控制函式 |
CryptMsgCountersign |
標記訊息中已存在的簽名 |
CryptMsgCountersignEncoded |
標記已存在的簽名 |
CryptMsgDuplicate |
通過增加引用計數來複制加密訊息控制代碼 |
CryptMsgGetParam |
對加密訊息進行編碼或者解碼後得到的引數 |
CryptMsgOpenToDecode |
開啟加密訊息進行解碼 |
CryptMsgOpenToEncode |
開啟加密訊息進行編碼 |
CryptMsgUpdate |
更新加密訊息的內容 |
CryptMsgVerifyCountersignatureEncoded |
驗證SignerInfo 結構中標記時間 |
CryptMsgVerifyCountersignatureEncodedEx |
驗證SignerInfo 結構中標記時間簽名者可以是CERT_PUBLIC_KEY_INFO 結構 |
簡化訊息函式:
CryptDecodeMessage |
對加密訊息進行解碼 |
CryptDecryptAndVerifyMessageSignature |
對指定訊息進行解密並且驗證簽名者 |
CryptDecryptMessage |
解密指定訊息 |
CryptEncryptMessage |
加密指定訊息 |
CryptGetMessageCertificates |
返回包含訊息的證書和CRL 的證書庫 |
CryptGetMessageSignatureCount |
返回簽名訊息的簽名者數量 |
CryptHashMessage |
建立訊息的雜湊 |
CryptSignAndEncryptMessage |
對訊息進行簽名並且加密 |
CryptSignMessage |
對訊息進行簽名 |
CryptVerifyDetachedMessageHash |
驗證包含已解邦定雜湊的雜湊訊息 |
CryptVerifyDetachedMessageSignature |
驗證包含已解邦定簽名的簽名訊息 |
CryptVerifyMessageHash |
驗證一個雜湊訊息 |
CryptVerifyMessageSignature |
驗證一個簽名訊息 |
5、輔助函式
資料管理函式
CertCompareCertificate |
比較兩個證書是否相同 |
CertCompareCertificateName |
通過比較兩個證書名稱來決定他們是否相同 |
CertCompareIntegerBlob |
比較兩個整數BLOB |
CertComparePublicKeyInfo |
通過比較兩個證書公鑰來決定他們是否相同 |
CertFindAttribute |
通過OID 來查詢屬性 |
CertFindExtension |
通過OID 來查詢擴充套件 |
CertFindRDNAttr |
通過OID 來查詢RDN 屬性 |
CertGetIntendedKeyUsage |
從證書中取得相關金鑰用法 |
CertGetPublicKeyLength |
從公鑰BLOB 中取得公鑰/私鑰長度 |
CertIsRDNAttrsInCertificateName |
通過指定RDN 陣列屬性比較證書名稱屬性來決定證書是否已包含了所有屬性 |
CertVerifyCRLRevocation |
驗證主題證書是否在CRL 中 |
CertVerifyCRLTimeValidity |
驗證CRL 的有效時間 |
CertVerifyRevocation |
驗證主題證書是否在CRL 中 |
CertVerifyTimeValidity |
驗證CRL 的有效時間 |
CertVerifyValidityNesting |
驗證主題時間的有效性是否在發行者有效時間內 |
CryptExportPublicKeyInfo |
匯出公鑰資訊 |
CryptExportPublicKeyInfoEx |
匯出公鑰資訊(使用者可以指定演算法) |
CryptFindCertificateKeyProvInfo |
列舉CSP 和它的金鑰容器來查詢對應於公鑰的相應私鑰 |
CryptFindLocalizedName |
查詢指定名字的區域性化名稱 |
CryptHashCertificate |
雜湊證書內容 |
CryptHashPublicKeyInfo |
計算公鑰資訊的雜湊 |
CryptHashToBeSigned |
計算簽名內容的資訊雜湊值 |
CryptImportPublicKeyInfo |
把公鑰資訊匯入CSP 並且返回它的控制代碼 |
CryptImportPublicKeyInfoEx |
把公鑰資訊匯入CSP 並且返回它的控制代碼 |
CryptMemAlloc |
分配記憶體 |
CryptMemFree |
釋放記憶體 |
CryptMemRealloc |
重新分配記憶體 |
CryptQueryObject |
得到BLOB 或檔案的內容資訊 |
CryptSignAndEncodeCertificate |
對資訊進行簽名並且編碼 |
CryptSignCertificate |
對證書進行簽名 |
CryptVerifyCertificateSignature |
使用公鑰資訊對主題證書或CRL 的簽名進行驗證 |
CryptVerifyCertificateSignatureEx |
使用公鑰資訊對主題證書或CRL 的簽名進行驗證 |
資料轉換函式
CertAlgIdToOID |
把CSP 演算法標示符轉換成OID |
CertGetNameString |
得到證書的主題或頒發者名稱並且把它轉換成字串 |
CertNameToStr |
把證書名稱BLOB 轉換成字串 |
CertOIDToAlgId |
把OID 轉換成CSP 演算法表示符 |
CertRDNValueToStr |
把名稱值轉換成字串 |
CertStrToName |
把字串轉換成編碼證書名稱 |
CryptBinaryToString |
把二進位制序列轉換成字串 |
CryptFormatObject |
格式化編碼資料,返回Unicode 字串 |
CryptStringToBinary |
|