现在的位置: 首页 > 综合 > 正文

WIN32一CSP密码服务体系及其应用

2012年08月03日 ⁄ 综合 ⁄ 共 4010字 ⁄ 字号 评论关闭

 

0 引言
       为适应网络数据安全需要,微软32位平台提供了一种加密服务提供体系CSP.通过体系
分层,为用户屏蔽底层的加密实现细节,利用它们提供的统一应用程序编程接口(JJn密API,
CryptoAPI),为应用程序进行数据加密和数据签名服务.本文分析讨论微软的这个Win32加
密体系以及编程机制,以便更好地了解它. .。

1 CSP服务体系结构
CSP服务体系从系统结构方面来看,它分为三层(见图1):①最底层是加密服务提供层,
它是由各加密服务提供机构提供的具体的CSP,加密的具体操作是由这一层来完成的,它是独
立于应用层和操作系统,其提供的通用的SPI编程接口与操作系统层进行交互;②中间层,即
操作系统(os)层,在此是指具体的Win95、NT4.0和更高版本的32位操作平台,在CSP体系
中,它担当一定管理任务以及为应用层和加密服务提供层提供统一的API接口和SPI接口;
③应用层,也就是具体的使用加密服务的应用程序,它可以是一道进程或线程.
通过此体系分层,应用程序不必关心底层CSP的具体实现细节,利用统一的API接口进行
编程,而由操作系统通过统一的SPI接口来与具体的加密服务提供程序进行交互.

 

 

                                                 CSP体系结构

                           

1.1加密服务提供层
1.1.1加密服务提供程序CSP ’
加密服务提供层,即具体的一个CSP,它是加密服务提供机构提供的独立的模块,担当真正
的数据加密工作,包括使用不同的加密和签名算法产生密钥,交换密钥、进行数据加密以及产
生数据摘要,进行数字化签名.有些CSP使用特殊硬件一起担当加密工作,而有些则通过RPC
分散其功能,以达到更为安全.理论上,CSP是一个完全独立的功能模块,应用层的每一道应用
程序可以与其任何一个CSP进行交互,底层的具体实现细节或硬件操作是由CSP来承担,这使
得应用程序可以独立于CSP而不必考虑底层CSP的复杂性,而直接使用各种加密服务.
CSP至少是一个动态链接库(DLL)及一个数据签名文件,其中DLL提供具体加密服务,数
字签名文件用于保证操作系统能识别CSP,操作系统可利用其定期验证CSP,保证其未被篡改.
1.1.2 CSP的密钥库及密钥容器
每一个加密服务提供程序都有一个独立的密钥库,它是一个CSP内部数据库,此数据库包
含一个和多个分属于每个独立用户的容器,每个容器都用一个独立的标识符进行标识.
CSP的组成如图2所示.

                                     
                                                                               图2 CSP组成
通常每个用户都拥有两对永久公共/私人密钥对,其中,交换公共/私人密钥对用于加密对
话密钥,而签名公共/私人密钥对用于创建数字化签名.此外,每个用户在加密对话期间还将
随机产生许多对话密钥,但这些对话密钥的生命周期只在对话期间有效.

1.2操作系统层
操作系统层是加密服务的中间层,应用程序通过操作系统层提供的统一的加密应用程序
编程接口API与操作系统进行交互,操作系统则根据上层(应用层)送来的命令,经过转换,使
用统一的加密服务程序设计接口SPI与特定的底层CSP模块进行交互,(同样,用户可利用此
接口设计自己的CSP服务提供程序以实现特定的加密功能或算法,在此不作详述).操作系统
层为应用层隔离了底层CSP和具体加密实现细节,用户可独立各个CSP进行交互.此外,操作
系统层还担当一定的管理功能,包括定期验证CSP等.
1.3应用层
应用层是任一用户进程或线程,它利用操作系统层提供的加密API为应用程序提供加密
服务,而由操作系统层与底层具体的CSP进行交互,使应用程序可独立于底层实现细节而为应
用层提供加密服务.

 

2 Win32操作系统加密服务编程模式
2.1数据加解密与对话密钥交换
在Win32操作系统加密服务编程模式中,一般对话密钥是实际加密操作所需的密钥
, 它只存在每一次对话期中.对话密钥是采用对称加密算法产生的.加密和解密双方都采用同一密
钥进行操作,用户使用对话密钥,经过对称加密算法将明文转换为密文,经过加密后的密文在
Intemet上向接收方发送.接收方接收到此密文后,采用与加密使用的同一把密钥进行数据解
密.由于上述操作的接收方与发送方使用同一把对话密钥,应用程序应从CSP中输出此对话
密钥,为防止用户直接处理对话密钥数据,采用一种不透明数据结构的隐码形式进行.
2.2公共密钥交换
对话密钥的安全交换,发送方必须知道接收方的公共密钥,必须交换公共密钥来进行,对
于公共密钥的交换是采用第三方机构(认证机构)提供的证书机制来实现的,为了获得一张证
书,必须与证书管理机构连接并登记,该管理机构将核对身份并创建一张证书,此证书是唯一
的,它一般符合X.509协议.用户间相互进行通信时,可相互交换证书,完成公共密钥的交换.
2.3数字化签名
数字化签名是用来验证一批数据是否是真正由签名所写的发送者发送的,以及数据是否是
被篡改.数字签名是一个较小数据结构,它可以和所签名的数据一起发送.创建数字签名第一
步是为所签名的基本数据产生一个数据摘要,然后使用发送方的私人密钥作用于此数据摘要,
得到数字化签名.此数字化签名连同基本数据一起发送至接收方.然后接收方用同样方式产
生基本数据的数据摘要,并与接收到的数字化签名发送方的公共密钥一起验证此数字化签名.

3 CSP应用的编程模式
下面叙述CSP编程模式,它基本展示端对端混合加密机制中数字加密和签名编程所需的
操作细节,它可作为一个过滤器,处理数据在网络发送时加密及产生数字化签名,而在接收时
则完成解密及数字化签名的认证.此外,证书制作程序只供参考,用户计划做自己的证书机构
时,应参考相关标准协议.
3.1 CSP系统配置
     利用CSP服务体系进行编程时,要求用户工作站必须安装一个CSP,服务提供程序的安
装文件将在系统注册表相应系统键中注册.当前微软32位CSP平台采用 The Microsoft RSA
Base Provider提供的RSA、RC2、RC4、MD5、SHA算法.其中RSA是非对称算法,用于产生公
共/私人密钥,它同时支持加密和数字签名.RC2是块式对称算法,它以64 bit为一块,由
于需要完整的块进行编码,它使用填充的方法对要编码的数据进行填充,以组成多个完整的
块.RC4是流式对称算法,它在明码文本的每一位上创建编码位.它比块式编码算法速度快,
但安全性较差.MD5使用128 bit散列值的散列算法.SHA使用160 bit散列值的散列算法.
3.2初始化
        注册表是32位操作系统,用来组织系统和应用程序配置信息,这些信息将记录用户系统
的软/硬件设置以及应用程序的特殊配置信息.
3.3证书制作
         用户进行数字加密及签名操作的第一步,应先从第三方证书机构获取一张包含用户公共密
钥等信息的证书,此证书在加密对话开始之前,在发送方与接收方之间交换,完成公共密钥的交
换.为制作证书,用户应调用加密应用程序编程接口API函数CryptAcquireContext()从CSP中
获得一次对话句柄,此外,此函数在第一次调用时,可建立特定用户的密钥容器. 然后调用
CryptGenKey()建立公共/私人密钥对.此密钥对中的公共密钥将由函数cryptExportKey()输人
至密钥密码中,此隐码按相应格式写人相应证书文件.同理,对于签名公共隐码也将写入证书

文件.至此,完成证书基本制作.为结束一次加密对话,应用程序应调用CryptReleaseContext()
断开与CSP的连接.
3.4证书解析
        发送方为获得接收方的公共密钥,以进行加密操作中对话密钥交换,用户应对接收到的
证书进行解析.解析过程中应参考第三方证书机构的证书制作方案及证书格式.通过证书解
析,应用程序能获得接收方的交换公共密钥隐码、证书签名公共密钥码等信息,然后将这些密
钥隐码调用API函数CrypthnportKey()输人到CSP中,从而获得交换公共密钥句柄以及签名
公共密钥句柄.
3.5数据加密
           经过前面证书解析,发送方能获得接收方的交换公共密钥,为进行_次加密对话,采用
CryptGenKey()产生一个随机对话密钥,此对话密钥只用于一次对话期中.由于接收方也用同
一对话密钥进行解密操作,发送方必须调用CryptExportKey()接收方的公共密钥进行加密输
出至隐码,并将此隐码写人到需发送的加密文件中.接收方接收到加密文件后,读出此隐码,
利用接收方的私人密钥调用CryptImportKey()输人此隐码而得到对话密钥句柄,完成对话密钥
的交换,此对话密钥可用于随后的解密操作.经过上述产生的数字化签名就可以和所签名的
基本数据(密文)等向网络的接收方发送.
3.6数据解密
    接收方接收到密文后,应用程序应读出此密文的对话密钥隐码,然后调用CryptImportKey()
用接收方对应交换私人密钥输人CSP,得到指向此对话密钥的对话句柄,此密钥句柄就可用于
随后的解密操作.此外,为进行数字化签名认证,接收方应调用CryptCreateHash()建立散列对
象,以用干产生数据摘要.接收方的数据解密操作,就是利用对话密钥调用CryptDecrypt()进行
的,经过此函数转换,密文转换为明文,完成整个加密对话.此函数还能产生加密基本数据的数
据摘要;为进行数字化签名认证,用户还应用与发送方产生数据摘要相同秩序对相同数据产生
数据摘要,这些操作分别由CryptSessionKey()及CryptHashData()函数进行.

抱歉!评论已关闭.