Chinaunix首页 | 论坛 | 博客
  • 博客访问: 12573
  • 博文数量: 8
  • 博客积分: 305
  • 博客等级: 二等列兵
  • 技术积分: 60
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-05 17:46
文章分类
文章存档

2011年(1)

2010年(7)

我的朋友
最近访客

分类: WINDOWS

2010-02-24 15:31:32

因为是.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结构数组

阅读(421) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~