当前位置:编程学习 > JAVA >>

用Microsoft CryptoAPI开发密钥

   当前,国内许多科研单位开发了高强度的加密算法,这些加密算法或者以纯软件的形式,或者 以加密卡的形式提供给用户。不同加密服务提供者提供的加密接口往往各不相同,这就给用户带来 了不便。因此,出现了有关加密API的国际标准和规范,使得呈现给用户的加密API有几种统一的形 式。目前有关加密API的国际标准和规范主要有: 
1. GSS-API V2.0; 
2. GCS-API; 
3. CDSA; 
4. RSA PKCS#11 Cryptographic Token Interface Standard V2.01; 
5. RSA BSAFE API; 
6. 微软CryptoAPI V2.0。 

其中,CDSA 、RSA PKCS#11和微软CryptoAPI在实际中应用得较多,也是PKI推荐使用的加密 API。 

一、 CryptoAPI与CSP的联系 

CryptoAPI的功能是为应用程序开发者提供在Win32环境下使用加密、验证等安全服务时的标准加密接口。微软CryptoAPI的体系结构见图1。CryptoAPI之上是应用程序,之下是CSP(Cryptographic Service Provider)。CSP是一个真正执行加密功能的独立模块,典型的CSP有微软RSA Base Provider。目前任何一个加密服务提供者若想成为微软的合法的CSP,就必须获得微软授予的一个签名文件,该签名文件保证了微软CryptoAPI识别该CSP。对于Microsoft的合法的CSP,微软会提供与其CryptoAPI接口的规范,接口的位置在图1中的“**********”线处。微软提供的CSP安装程序会将该CSP的各个文件安放到相应的目录下,并在Windows NT/98注册表中按CSP的类型和名称为该CSP注册。CryptoAPI使用系统注册表存储一个CSP数据库,CSP数据库中记录了所有已安装到一个计算机中的CSP。 



图1 微软CryptoAPI的体系结构
二、 CryptoAPI 概况 

1. 函数分类 

微软CryptoAPI从两方面来保证安全通信:保密性和验证。微软 CryptoAPI系统有四类函数:基本 Cryptographic函数、简化 Cryptographic函数、存储函数和验证加密/解密函数。前两类函数提供保密性,后两类函数提供验证。这四类函数的层次结构见图1。 

2. 关于CSP 

CSP是真正执行加密工作的独立的模块。物理上一个CSP由两部分组成:一个动态链接库,一个签名文件。若加密算法用硬件实现,则CSP还包括硬件装置。 

(1)不同类型的CSP 

每个CSP都有一个名字和一个类型。每个CSP的名字是唯一的,而类型则不是。此处着重强调“类型”的特别性。 

一个CSP 类型代表了一个特定的家族,这个家族决定了以下因素: 

● 有且仅有一个密钥交换算法; 

● 有且仅有一个签名算法; 

● 特定的Key Blob格式; 

● 特定的数字签名格式; 

● 特定的密钥推导模式; 

● 特定的密钥长度; 

● 特定的分组加密算法的缺省模式。 



图2 密钥库的内容
若两个或多个应用间欲交换密钥和加密的消息,那么它们必须使用同一类型的CSP。 

(2) 预定义的CSP类型 

目前已有六种预定义的CSP类型,表1给出它们支持的密钥交换算法、签名算法、对称加密算法和Hash算法。当然它们可自由支持表中未列出的其他算法。 

(3)应用程序开发者选择CSP的方法 

使用函数CryptAcquireContext,给出欲选择的CSP的名称参数和类型参数即可,该函数返回一个指向被选择的CSP的句柄。 

3. 密钥库(Key) 

每个CSP有一个密钥库。密钥库用于存储密钥,每个密钥库包括一个或多个密钥容器(Key Containers)。每个密钥容器中含属于一个特定用户的所有密钥对。每个密钥容器被赋予一个唯一的名字;以这个名字做函数CryptAcquireContext 的参数,从而获得指向这个密钥容器的句柄。密钥库的内容见图2。 

CSP将永久保存每一个密钥容器,包括保存每个密钥容器中的公/私钥对,但在一个Session完后CSP将不保存这个Session 在密钥容器中的会话密钥。(注: 一个Session是指从调用函数CryptAcquireContext到调用函数CryptReleaseContext 期间的阶段。当一个Session结束后,所有的使用hProv句柄创建的会话密钥和Hash值都变为无效)。 

4. Key Blob 

在交换密钥时,或密钥需要离开CSP(即导出密钥)时,就存在选择什么样的数据结构存储密钥的问题。微软 CryptoAPI采用Key Blob数据结构存储离开了CSP内部的密钥。通常密钥总是在CSP内部被安全地保存,应用程序只能通过句柄访问密钥,而Key Blob 则例外。当使用CryptExportKey函数从CSP中导出密钥时,Key Blob被创建。之后的某一时间,使用CryptImportKey函数将密钥导入到某个CSP中(通常是另一个不同的机器上的不同的CSP)。因此,Key Blob是在不同的CSP之间安全传送密钥的载体。 

Key Blob有一个标准的信息头和位于信息头之后的一段表示密钥本身的数据组成。通常应用程序不访问Key Blob内部,而是把Key Blob当作一个透明的对象。 

由于公/私钥对的私钥部分需要绝对保密,所以私钥要用对称加密算法加密。加密Private Key Blob时,除了BLOBHEADER之外的所有部分都要加密。但加密所用的算法和密钥(或密钥参数)不与该Key Blob存储在一起,应用程序负责管理这些信息。 

5. 处理的信息格式 

简化Cryptographic函数处理的信息格式见图3。 



图3 简化Cryptographic函数处理的信息格式
6. 密钥的物理特性 

同时使用同一会话密钥对两个序列的数据进行加密或解密时,要物理上制作一份该会话密钥的拷贝,即一个物理上的会话密钥不得同时用于两个操作。因为每个会话密钥都包含了内部状态信息,若它同时被用于多个操作,会造成混乱。 


表1 CSP支持的密钥交换算法
补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,