Tao & Zen

Soli Deo Gloria!

导航

cryptoAPI


公钥和私钥都是固定长度的二进制比特串(如目前常用的RSA公私钥长度为1024比特),从性质上来讲,他们都可以加解密,

只是人们根据使用的方式不同,将他们进行了区分,有些称为私钥,有些称为公钥。


另外,根据公私钥使用方式的不同,它们在数据加密和签名时的管理方式也不一样。

(1)数字签名

一个用户拥有一个数字证书(签名证书),里面包括一对密钥(公钥和私钥),私钥用于签名,公钥用于验证签名。

如果私钥被攻击者知道,就可以用你的私钥伪造你的签名,所以私钥的安全性要求较高,不允许进行备份(包括CA中心),

私钥丢失时,只能重新生成密钥对,旧的签名可以用备份的公钥进行验证。另外,用户可以自己生成密钥对,在证书注册时提交给CA中心即可。


(2)加解密

一个用户也拥有一个数字证书(加密证书),里面也包括一对密钥(公钥和私钥),私钥用于解密信息,公钥用于加密信息。

当用户A给用户B传送数据时,用户A 以外带的方式(如从CA中心)获取用户B的公钥,并用其加密,加密后的数据传送给用户B,

用户B收到后用私钥解密。加解密私钥要进行备份,否则,当私钥丢失时,以前加密的数据将无法解密。另外,

密钥对只能在注册时由CA中心产生,这个是国家安全政策的原因,国家必须能解密每个用户加密的所有信息。


注:加解密证书和签名证书虽然在本质上一样(密钥对的产生方式及结果一样,即从数学算法的角度考虑一样),

但因其用途的不同导致其安全策略的不同,所以不能混用。


CryptoAPI(一个应用程序编程接口)目的就是提供开发者在 Windows 下使用 PKI 的编
程接口。CryptoAPI 提供了很多函数,包括编码、解码、加密、解密、哈希、数字证书、
证书管理和证书存储等功能。对于加密和解密,CryptoAPI 同时提供基于会话密钥和公
钥/私钥对的方法。

CryptoAPI  2.0  中提供了管理和使用
证书的函数,另外,2.0 版本中也提供了编码和解码 PKCS#7(ASN.1)消息。


该API提供了基本加密函数,所有 CSP 的通讯都是通过这些函数。  
一个CSP 是实现所有加密操作的独立模块。在每一个应用程序中至少需要提供一个CSP。如果不选用CSP
该API会自动选用默认的CSP。
如果使用多于一个以上的 CSP,在加密函数调用中就要指定所需的 CSP。微软基本加密
提供者(Microsoft Base Cryptographic Provider),是缺省绑定到 CryptoAPI 里的。如果没有
指定其他 CSP 时,这个 CSP 就是却省的。  
每一个 CSP 对 CryptoAPI 提供了一套不同的实现。一些提供了更加强大的加密算法,
而其他一些 CSP 包含了对硬件的支持,比如智能卡。另外,一些 CSP 偶尔和使用者直接通

讯,比如数字签名就使用了用户的签名私钥。

以下是主要API功能:

CryptAcquireContext
获得CSP的函数接口
CryptReleaseContext  
释放。。
CryptEnumProviderTypes  
枚举CSP类型

密钥产生函数创建、配置和销毁加密密钥。他们也用于和其他用户进行交换密钥。

CryptDeriveKey
从一个密码中派生一个密钥
CryptDestoryKey
销毁密钥
CryptDuplicateKey
制作一个密钥和密钥状态的精确复制
CryptExportKey
把 CSP 的密钥做成 BLOB 传送到应用程序的内存空间中
CryptGenKey
创建一个随机密钥
CryptGenRandom
产生一个随机数
CryptGetKeyParam
得到密钥的参数
CryptGetUserKey
得到一个密钥交换或签名密钥的句柄
CryptImportKey
把一个密钥 BLOB 传送到 CSP 中
CryptSetKeyParam
指定一个密钥的参数

编码/解码函数:
CryptDecodeObject
对 lpszStructType 结构进行解码
CryptDecodeObjectEx
对 lpszStructType 结构进行解码,此函数支持内存分配选项
CryptEncodeObject
对 lpszStructType 结构进行编码
CyptEncodeObjectEx
对 lpszStructType 结构进行编码,此函数支持内存分配选项

CryptEncrypt 和 CryptDecrypt 要求在被调用前指定一个密钥。
这个密钥可以由 CryptGenKey、CryptDeriveKey 或 CryptImportKey 产生。创建密
钥时要指定加密算法。CryptSetKeyParam 函数可以指定额外的加密参数。
CryptDecrypt
使用指定加密密钥来解密一段密文
CryptEncrypt
使用指定加密密钥来加密一段明文
CryptProtectData
执行对 DATA_BLOB 结构的加密
CryptUnprotectData

执行对 DATA_BLOB 结构的完整性验证和解密

 

计算哈希、创建和校验数字签名:
CryptCreateHash
创建一个空哈希对象
CryptDestoryHash
销毁一个哈希对象
CryptDuplicateHash
复制一个哈希对象
CryptGetHashParam
得到一个哈希对象参数
CryptHashData
对一块数据进行哈希,把它加到指定的哈希对象中
CryptHashSessionKey
对一个会话密钥进行哈希,把它加到指定的哈希对象中
CryptSetHashParam
设置一个哈希对象的参数
CryptSignHash
对一个哈希对象进行签名
CryptVerifySignature

校验一个数字签名

 

具体的代码可在msdn上和下面的网址找到

http://www.vckbase.com/document/viewdoc/?id=974

另外据有人在使用时,会有些许不兼容的情况,该同学列出了在xp下解密成功而2000下失败的情况。

cryptoAPI 适用于双边都是windows的情况,且证书操作比较频繁,可以尝试使用该API。

.NET 下面可以用System.Security.Cryptography 命名空间提供加密服务,

其中包括数据的安全编码和解码、哈希、随机数生成和消息身份验证。这个空间应该是CrpytoCom的实现。

 

 

posted on 2009-01-24 23:39  康国庆--thinkinlove  阅读(1665)  评论(0编辑  收藏  举报