學習CRYPTOAPI第二天

 

學習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結構數組

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章