智能卡CSP 的设计与实现方法 - 中国一卡通网
用户名密码 [免费注册] [找回密码] 推广技巧 发布求购 建商铺  发产品  会员体制比较  
 

智能卡CSP 的设计与实现方法

来源:中国一卡通网  作者:朱政洪,张勇  发布时间:2011-11-18 09:13:11  字体:[ ]

关键字:智能卡  CSP  CryptoAPI  RSA  

摘   要:CSP 是Windows 操作系统加密体系的重要组成部分,智能卡作为一种硬件级加密设备要和Windows 操作系统加密体系无缝连接需要为其开发CSP 加密服务提供者程序。为智能卡开发一个稳定、高效的CSP 是一件复杂的事情,其中如何为CSP 设计一个简洁而又实用的软件架构体系和密钥存贮结构至为重要。该文将探讨这方面的设计思路。


  4.3 三种对象类型的设计与实现 

 

 

  在CSP 的具体设计与实现中,HCRYPTPROV 对象类型、HCRYPTKEY对象类型和HCRYPTHASH 对象类型之间的相互关系如图4 所示。

  ProvQueue 链表为CSP 上下文环境句柄链表,KeyQueue 链表为密钥句柄链表,HashQueue 链表为哈希句柄链表。

  CProvContext 为CSP 上下文环境类、CCryptKey 为密钥句柄类、CCryptHash 为哈希句柄类,这几个类的具体设计见下文。 

  4.3.1 CSP 上下文环境对象的实现

  CSP 的上下文环境由HCRYPTPROV 对象类型实现,在实现过程中可以定义一个CProvContext 的类,具体定义如下: 


  该类包含有在当前上下文环境中使用的容器名ContainerName,通过SetProvParam 成员函数可以对当前上下文环境属性进行设置,通过GetProvParam 成员函数可以得到当前上下文环境的属性。将该类强制转换成HCRYPTPROV 类型,即可实现CSP 上下文环境的数据类型。

  如果在同一个进程中通过CryptoAPI 的CryptAcquireContext 函数同时打开多个不同的容器,此时就会有多个CProvContext 类实例,因此需要通过链表来管理多个实例。这里定义一个ProvQueue 的链表,在同一个进程中每当打开一个容器或新建一个容器时,就产生一个CProvContext 类的实例,将该实例加入到ProvQueue 链表中,通过prevContext 指针指向前一个实例, 通过nextContext 指针指向后一个实例。

  CSP 25 个函数中都有CSP 的上下文环境句柄,25 个函数之间的关系可以通过这个句柄得到联系。比如调用CPEncryt 函数时,首先检查CPEncryt 传入HCRYPTPROV 句柄是否在ProvQueue 中存在,如果存在,则ProvQueue 链表中对应的该条记录即为当前的上下文环境句柄,该记录中包含有当前的容器名、相关的密钥队列(KeyQueue)和哈希队列(HashQueue),从密钥队列(KeyQueue)中可以获取CPEncryt 函数需要使用的密钥对象。对象之间的关系可参见图4。

  4.3.2 HCRYPTKEY 密钥对象类型

  HCRYPTKEY 密钥对象类型可以定义一个CCryptKey 的类,在使用过程中将该类强制转换成HCRYPTKEY 类型,该类具体定义如下: 


  该类包含有当前密钥所对应的算法(KeyAlgid)、dwFlags 参数以及当前密钥隶属于的CSP 上下文环境对象(pProContext)。通过SetKeyParam 成员函数可以对当前密钥属性进行设置,通过GetKeyParam 成员函数可以得到当前密钥的属性。

  在同一个CSP 上下文环境对象中可以同时产生多个不同的密钥句柄,因此需要通过密钥句柄链表来管理这些密钥句柄。定义一个KeyQueue 的链表,在同一个CSP 上下文环境对象中每当产生一个新的密钥或导入一个新的密钥时,就会产生一个CCryptKey类的实例,将该实例加入到KeyQueue 链表中,通过prevCryptKey 指针指向前一个实例, 通过nextCryptKey 指针指向后一个实例。

  通过图4,可以看到密钥与密钥链表之间的关系,具体使用某个密钥时需要先从KeyQueue 链表中找到对应的密钥句柄。比如调用CPEncryt 函数时,先检查CPEncryt 函数传入的HCRYPTKEY 句柄是否在KeyQueue 链表中已经存在,如果存在,则KeyQueue 链表中对应的该条记录即为当前的密钥句柄,该记录中包含有当前密钥的算法(KeyAlgid)、dwFlags 等参数。

  4.3.3 HCRYPTHASH 哈希对象类型

  HCRYPTHASH 哈希对象类型的定义和HCRYPTKEY 密钥对象类型的定义相似,定义一个CCryptHash 的类,在使用过程中将该类强制转换成HCRYPTHASH 类型,该类具体定义如下: 


  该类中包含有当前哈希所对应的算法(HashAlgid)、dwFlags 参数以及当前哈希隶属于的CSP 上下文环境对象(pProContext)。通过SetHashParam 成员函数可以对当前哈希属性进行设置,通过GetHashParam 成员函数可以得到当前哈希的属性。

  在同一个CSP 上下文环境对象中可以同时产生多个不同的哈希句柄,因此需要通过哈希句柄链表来管理这些哈希句柄。定义一个HashQueue 的链表,在同一CSP 上下文环境中每当产生一个新的哈希时,就会产生一个CCryptHash 类的实例,将该实例加入到HashQueue 链表中,通过prevCryptHash 指针指向前一个实例, 通过nextCryptHash 指针指向后一个实例。

  通过图4,可以看到哈希与哈希链表之间的关系,具体使用某个哈希时需要先从HashQueue 链表中找到对应的哈希句柄。比如调用CPHashData 函数时, 先检查CPHashData 函数传入的HCRYPTHASH 句柄是否在HashQueue 链表中已经存在, 如果存在,则HashQueue 链表中对应的该条记录即为当前的哈希句柄,该记录中包含有当前哈希的算法(HashAlgid)、dwFlags 等参数。

  5 综述

  综上所述,由于微软对于CSP 只是定义了基本的函数接口,具体在CSP 的设计与实现过程中有很强的灵活性,除了本文提到的几种CSP 的设计和实现方法外,可能还会有其它的CSP 设计和实现方法,CSP 中密钥存贮结构的设计方法也有很多。随着智能卡技术的不断发展,以及智能卡在各行各业中应用的普及,各行各业对智能卡CSP 功能上的要求可能会有不同,安全性方面的要求可能也会有差异,因此CSP 软件架构如何设计,对应的密钥存贮结构如何设计,主要还是看CSP 的具体用途 。

 

 

更多

新闻投稿合作邮箱:yktchina-admin@163.com    字体[ ] [收藏] [进入论坛]

推荐文章

论坛热帖