天天看點

c++ 如何使用CryptoAPI建立一個自簽名證書(1)<wbr>微軟加密服務體系</wbr>(2)CryptoAPI體系結構(3)CryptoAPI基本功能 (4)使用CryptoAPI建立一個自簽名證書

<a target="_blank" href="http://blog.csdn.net/jun2ran/article/details/6489922">CryptoAPI程式設計</a>

&lt;wbr&gt;微軟加密服務體系CryptoAPI的結構如下圖所示,微軟加密服務體系包含三層結構和兩個接口,分别為應用程式層、作業系統層(OS)、加密服務提供者層(Cryptographic Service Provider,CSP),CryptoAPI接口和加密服務提供者接口(Cryptographic Service

Provider Interface,CSPF)。&lt;/wbr&gt;

CryptoAPI體系架構共由五大主要部分組成:基本加密函數、證書編/解碼函數、證書庫管理函數、簡單消息函數、底層消息函數。體系結構如下圖所系:

&lt;wbr&gt;&lt;wbr&gt;&lt;wbr&gt;&lt;wbr&gt;&lt;wbr&gt;&lt;wbr&gt;&lt;wbr&gt;&lt;wbr&gt;&lt;wbr&gt;&lt;wbr&gt;&lt;wbr&gt;&lt;/wbr&gt;&lt;/wbr&gt;&lt;/wbr&gt;&lt;/wbr&gt;&lt;/wbr&gt;&lt;/wbr&gt;&lt;/wbr&gt;&lt;/wbr&gt;&lt;/wbr&gt;&lt;/wbr&gt;&lt;/wbr&gt;

基本加密函數:用于選擇CSP、建立CSP連接配接、産生密鑰、交換及傳輸密鑰等操作。

證書編/解碼函數:用于資料加密、解密、哈希等操作。這類函數支援資料的加密/解密操作;計算哈希、建立和校驗數字簽名操作;實作證書、證書撤銷清單、證書請求和證書擴充等編碼和解碼操作。

證書庫管理函數:用于數字證書及證書庫管理等操作。這組函數用于管理證書、證書撤銷清單和證書信任清單的使用、存儲、擷取等。

簡單消息函數:用于消息處理,比如消息編碼/解碼、消息加/解密、數字簽名及簽名驗證等操作。它是把多個底層消息函數包裝在一起以完成某個特定任務,友善使用者的使用。

底層消息函數:底層消息函數對傳輸的PKCS#7資料進行編碼,對接受到的PKCS#7資料進行解碼,并且對接收到的消息進行解碼和驗證。它可以實作簡單消息函數可以實作的所有功能,且提供更大的靈活性,但一般會需要更多的函數調用。

&lt;wbr&gt;&lt;wbr&gt;&lt;wbr&gt;利用CryptoAPI,開發者可以給基于Windows的應用程式添加安全服務,包括:ASN.1編碼/解碼、資料加密/解密、身份認證、數字證書管理,同時支援PKI、對稱密碼技術等。&lt;/wbr&gt;&lt;/wbr&gt;&lt;/wbr&gt;

密鑰管理

&lt;wbr&gt;&lt;wbr&gt;&lt;wbr&gt;在CryptoAPI中,支援兩種類型的密鑰:會話密鑰、公/私密鑰對。會話密鑰也成為對稱密鑰,用于對稱加密算法。為了保證密鑰的安全性,在CryptoAPI中,這些密鑰都儲存在CSP内部,使用者可以通過CryptExpoetKey以加密密鑰快形式導出。公/私鑰對用于非對稱加密算法。非對稱加密算法主要用于加解密會話密鑰和數字簽名。在CryptoAPI中,一般來說,大多數CSP産生的密鑰容器包含兩對密鑰對,一對用于加密會話密鑰,稱為交換密鑰對,一對用于産生數字簽名,稱為簽名密鑰對。在CryptoAPI中,所有的密鑰都存儲在CSP中,CSP負責密鑰的建立,銷毀,導入導出等操作。&lt;/wbr&gt;&lt;/wbr&gt;&lt;/wbr&gt;

資料編碼/解碼

&lt;wbr&gt;&lt;wbr&gt;CryptoAPI采用的編碼方式為ASN.1,編碼規則為DER,表示發送方發送資料時先把資料抽象為ASN.1對象,然後使用DER編碼規則把ASN.1對象轉化為可傳輸的0、1串;接受方接受到資料後,利用DER解碼規則把0、1串轉化為ASN.1對象,然後把ASN.1對象轉化為具體應用支援的資料對象。&lt;/wbr&gt;&lt;/wbr&gt;

資料加/解密

&lt;wbr&gt;&lt;wbr&gt;在CryptoAPI中約定加密較大的資料塊時,采用對稱加密算法。通過其封裝好的加解密函數來實作資料解加密操作。&lt;/wbr&gt;&lt;/wbr&gt;

哈希與數字簽名

&lt;wbr&gt;&lt;wbr&gt;哈希與數字簽名一般用于資料的完整性驗證和身份鑒别。CryptoAPI中,通過其封裝好的哈希與數字簽名函數來實作相關操作。微軟公司提供的CSP産生的數字簽名遵循RSA标準(PKCS#6).&lt;/wbr&gt;&lt;/wbr&gt;

數字證書管理

&lt;wbr&gt;&lt;wbr&gt;數字證書主要用于安全通信中的身份鑒别。CryptoAPI中,對數字證書的使用管理函數分為證書與證書庫函數、證書驗證函數兩大部分。&lt;/wbr&gt;&lt;/wbr&gt;

在VC++中開發CryptoAPI應用程式,需要預先設定一些編譯環境。

1.需要包含以下頭檔案:

#include &lt;windows.h&gt;

#include &lt;wincrypt.h&gt;

2.包含的靜态連結庫:

連結CryptoAPI函數必須有靜态庫Crypto32.lib的支援,部分CryptoAPI函數可能還需要靜态庫advapi32.lib及CryptUI.lib的支援。

3.假如在VC++6.0上編譯程式,則還需加上以下語句:

#ifndef _WIN32_WINNT

#define _WIN32_WINNT 0x0400

#endif

在不同的版本的windows作業系統下,可能需要定義不同的常量,具體檢視wincrypt.h頭檔案,根據wincrypt.h上不同的預編譯語句在自己的應用程式中進行不同定義。(我在VS 2008環境中編譯程式,不在需要自定義這部分)。在vs2008的wincrypt.h頭檔案已經沒有這些相關的定義。)

注:部分的CryptoAPI函數在VC++6.0上并沒有定義,如CertGetNameString函數為CryptoAPI的證書管理函數,但是在VC++6.0下編譯時會報錯,檢視相應的wincryp.h檔案時會發現裡面沒有聲明該函數。但在VC++7.0以上的版本中則定義了這個函數。解決方法是可以将VC++7.0上的wincrypt.h、crypt32.lib、advapi32.lib三個檔案覆寫vc+6.0的相應檔案。

以下介紹幾個編寫CryptoAPI應用程式常用到得函數。

1.BOOLEAN CRYPTFUNC CryptAcquireContext(

);

這個函數是為了獲得CSP句柄,函數通過phProv參數傳回獲得的CSP句柄。在CryptoAPI加密服務相關的所有操作都在CSP實作,CSP真正實行加密相關服務的獨立子產品,當應用程式需要加密相關服務時,比如:加解密操作、密鑰産生于管理等,必須先擷取某個CSP句柄。這時一般CryptoAPI程式設計的第一步。

2.BOOL CRYPTFUNC CryptGenKey(

// CSP是否支援此算法。建立公/私密鑰對時,參數應為AT_KEYEXCHANGE(交換密鑰對)

//或AT_SIGNATURE(簽名密鑰對)。

在CryptoAPI中,構造密鑰一般有兩種方法,一通過哈希值,而通過随機數構造。上面這種就是通過随機數建立的。下面介紹利用哈希值建立的函數。

BOOL CRYPTFUNC CryptDeriveKey(

這個函數通過輸入的哈希值hBaseData來建立一個密鑰,通過密鑰句柄phKey參數傳回。注意:這個函數隻能建立會話密鑰,不能用于建立公/私密鑰對。

3.BOOL CRYPTFUNC CryptCreateHash(

//對于非密鑰算法,此參數為NULL。

這個函數初始化一個哈希句柄,它建立并傳回一個CSP哈希句柄。

4.BOOL WINAPI CryptHashData(

這個函數是計算一段資料的哈希值并加入到指定的哈希句柄中。在使用這個函數前必須通過CrpytHashData函數建立了一個哈希句柄。

5.BOOL WINAPI CryptEncodeObject(

//PKCS_7_ASN_ENCODING

這個函數用于将pvStructInfo所指向的資料按照lpszStructType結構體類型編碼。

6.BOOL WINAPI CryptDecodeObject(

這個函數是對上面編碼後的資料進行解碼,參數和上面編碼函數的參數差不多,具體可以檢視MSDN幫助文檔。

1.CERT_RDN_ATTR 結構體

下面的

c + +

示例示範如何使用

CertCreateSelfSignCertificate

API

來建立一個自簽名的證書。将計算機配置檔案中建立私鑰/公鑰和證書将存儲該同一配置檔案的受信任根

CA

存儲中:

繼續閱讀