1. 程式人生 > >CSP開發基礎--CryptoAPI函式簡介

CSP開發基礎--CryptoAPI函式簡介

CryptoAPI體系主要由一下幾部分組成:

基本加密函式、證書編碼與解碼函式、證書儲存函式、簡化資訊處理函式、底層資訊處理函式。

 

1、基本加密函式

CSP是真正實行加密的獨立模組,他既可以由軟體實現也可以由硬體實現。但是他必須符合CryptoAPI介面的規範。

每個CSP都有一個名字和一個型別。每個CSP的名字是唯一的,這樣便於CryptoAPI找到對應的CSP。目前已經有9種CSP型別,並且還在增長。下表列出出它們支援的金鑰交換演算法、簽名演算法、對稱加密演算法和Hash演算法。

CSP型別

交換演算法

簽名演算法

對稱加密演算法

Hash演算法

PROV_RSA_FULL

RSA

RSA

RC2
RC4

MD5
SHA

PROV_RSA_SIG

none

RSA

none

MD5
SHA

PROV_RSA_SCHANNEL

RSA

RSA

RC4
DES
Triple DES

MD5
SHA

PROV_DSS

DSS

none

DSS

MD5
SHA

PROV_DSS_DH

DH

DSS

CYLINK_MEK

MD5
SHA

PROV_DH_SCHANNEL

DH

DSS

DES
Triple DES

MD5
SHA

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