學習CRYPTO第二天
因爲是.net安全,所以必須在VC7上運行下面面的一些例子(今天害得我在VC6上運行,錯誤一大堆),上面介紹了CRYPTAPI的一些基礎,下面我就不按照MSDN的往下看了,下面的幾個專題是Hashing,Signing Data,Creating and Receiving Enveloped Data Messages以及Encrypting and Decrypting.這些專題等需要用到的時候再具體看吧。主要專注於證書的操作。不過cryptui.dll又要求是在windows 2003 Server版本纔可以,哎,只好等晚上再去買盤了。
1,解碼CERT_INFO結構
給定一個證書,第一步是調用函數CertCreateCertificateContext解碼證書BLOB。當這個函數被調用,那麼產生一個編碼證書的複製品,創建一個CERT_CONETXT類型的結構和一個CERT_INFO類型的結構。一個certificate_context包含一個原始證書 BLOB,一個CERT_CONETXT類型的結構以及一個CERT_INFO類型的結構。下面我們具體看看CERT_CONETXT以及 CERT_INFO的結構(wincrypt.h):
typedef struct _CERT_CONTEXT {
DWORD dwCertEncodingType;
BYTE *pbCertEncoded;
DWORD cbCertEncoded;
PCERT_INFO pCertInfo;
HCERTSTORE hCertStore;
} CERT_CONTEXT, *PCERT_CONTEXT;
typedef const CERT_CONTEXT *PCCERT_CONTEXT;
typedef struct _CERT_INFO {
DWORD dwVersion;
CRYPT_INTEGER_BLOB SerialNumber;
CRYPT_ALGORITHM_IDENTIFIER SignatureAlgorithm;
CERT_NAME_BLOB Issuer;
FILETIME NotBefore;
FILETIME NotAfter;
CERT_NAME_BLOB Subject;
CERT_PUBLIC_KEY_INFO SubjectPublicKeyInfo;
CRYPT_BIT_BLOB IssuerUniqueId;
CRYPT_BIT_BLOB SubjectUniqueId;
DWORD cExtension;
PCERT_EXTENSION rgExtension;
} CERT_INFO, *PCERT_INFO;
typedef struct _CERT_EXTENSIONS {
DWORD cExtension;
PCERT_EXTENSION rgExtension;
} CERT_EXTENSIONS, *PCERT_EXTENSIONS;
由上面的三個結構可以明顯的看出證書的存儲過程。(具體參數意思可以由參數名看出來)
2,編碼一個CERT_INFO結構
編碼過程和解碼過程是相反的,下面事例如何增加簽發者到CERT_INFO結構中。
1,創建一個包含簽發者名字的字符串。
2,創建一個CERT_RDN_ATTR結構的數組,它初始化後能夠包含剛剛創建的字符串。
3,創建一個CERT_RDN結構的數組,它包含剛剛初始化的CERT_RDN_ATTR結構的數組
4,創建一個CERT_NAME_INFO結構指向剛剛創建的CERT_RDN結構的數組的指針
5,調用CryptEncodeObject函數來獲取輸出編碼後BLOB的長度。
6,爲BLOB分配內存空間
7,再次調用CryptEncodeObject函數,將有關編碼信息寫入
8,設置CERT_INFO結構中的Issuer.cbData爲第5步得到的長度,設置Issuer.pbData爲第6步得到的地址,那麼現在簽發者就存在於CERT_INFO結構中了。
添加一個編碼後的擴展信息到CERT_INFO結構中
1,初始化一個擴展信息結構。
2,調用CryptEncodeObject,來獲取所需空間大小。
3,分配空間
4,再次調用CryptEncodeObject來獲取編碼後的信息。
5,創建一個CERT_EXTENSION結構數組
6,初始化CERT_EXTENSION,並且在CERT_EXTENSION中添加剛剛編碼後的信息。
7,初始化CERT_INFO結構的rgExtension,並且把他指向CERT_EXTENSION結構數組