缩写为:CSP,全称为:Cryptographic Service Provider 即加密服务提供者。它是windows系统中提供的用于加密的软硬件组件。通过对微软的加密应用程序接口即CrytoAPI(或CAPI)的编程访问它来提供身份验证、编码和各种的加密、签名算法。
如下图:
应用程序不是直接与某个CSP通信。它会调用CAPI的函数,然后操作系统通过CrytoSPI(一个系统接口)筛选这些调用并且把这些调用传递到适合的CSP函数。然后CSP通过对参数的解析调用适当的CSP函数,最后向操作系统返回期盼值(加密操作是由特定的CSP来完成的)。
每个CSP是实现全部加密操作的独立模块。每个应用程序中至少需要一个CSP完成加密操作。对于使用多个CSP的情况下,在加密函数调用时需要指定CSP。当然基本加密服务是默认绑定到CAPI的。每一个CSP对CAPI提供不同的实现,例如某些实现了对硬件的支持。
CSP有多种类型,且数目在增加中,以下列举几种:
Microsoft Base Cryptographic Provider
Microsoft Strong Cryptographic Provider
Microsoft Enhanced Cryptographic Provider
Microsoft AES Cryptographic Provider
Microsoft DSS Cryptographic Provider
……
更多内容可见:http://msdn.microsoft.com/en-us/library/aa386983.aspx
CAPI的功能:向应用开发人员提供对基于windows的应用程序添加验证、编码和加密的能力。
CryptoSPI的功能:将CryptoAPI的调用传递给CSP,可以理解为使用CSP。
(二) CryptoAPI
全称:(Microsoft)Cryptography Application Programming Interface即(微软)加密应用编程接口,也缩写为:CAPI。
CAPI提供一套安全相关的函数集合,用于加密、摘要、数字签名等。
(三) 密钥存储区
密钥可以保存在磁盘、内存或硬件密钥存储区中。
例如:可以以文件的形式保存在磁盘中或保存在密钥容器中;也可以保存在例如智能卡硬件的密钥存储区中。
(四) 公钥加密Windows密钥库
Windows系统提供两种密钥存储类型(级别):
用户级别:User key store
存储在特定用户的 Windows 用户配置文件中
计算机级别:machine key store
对于所有可以登录到计算机的用户都可用,而且可以使用 ACL 限制对加密密钥信息的访问权限
(五) 密钥容器
Key container。密钥容器是保存密钥的最小单位,包含了密钥和其它信息。
(六) .net中的CSP
在.net中,以CryptoServiceProvider结尾的类是相应的 CSP 的托管代码包装类,即实现加密服务的提供者,名字空间:System.Security.Cryptography。
以TripleDESC私钥加密为例:
{
string strContent = "123aaa";
string strKey = "qwuduII*6&*%^&(90))";
TripleDESCryptoServiceProvider DES = new TripleDESCryptoServiceProvider();
MD5CryptoServiceProvider hashMD5 = new MD5CryptoServiceProvider();
DES.Key = hashMD5.ComputeHash(Encoding.UTF8.GetBytes(strKey));
DES.Mode = CipherMode.ECB;
ICryptoTransform DESEncrypt = DES.CreateEncryptor();
byte[] Buffer = Encoding.UTF8.GetBytes(strContent);
byte[] sipherbytes= DESEncrypt.TransformFinalBlock(Buffer, 0, Buffer.Length);
Console.WriteLine(Encoding.UTF8.GetString(sipherbytes));
ICryptoTransform DESdecrypt = DES.CreateDecryptor();
byte[] plainbytes = DESdecrypt.TransformFinalBlock(sipherbytes, 0, sipherbytes.Length);
Console.WriteLine(Encoding.UTF8.GetString(plainbytes));
}
(七) .net中的CspParameters类
CspParameters类,名字空间为:System.Security.Cryptography,表示可从非托管CrytoAPI传递到内部使用加密服务提供程序CSP的托管加密类的参数,即向CSP传递执行加密操作的参数。
它的作用:
1 指定特定的CSP。
2 管理密钥容器
3 指定签名密钥或交换密钥
重要成员:
ProviderType:指定提供程序的类型(按数值)。如下表
ProviderName:指定提供程序的类型(按名字)。如下表
提供程序类型 |
数值 |
PROV_RSA_FULL |
1 |
PROV_RSA_SIG |
2 |
PROV_DSS |
3 |
PROV_FORTEZZA |
4 |
PROV_MS_EXCHANGE |
5 |
PROV_SSL |
6 |
PROV_RSA_SCHANNEL |
12 |
PROV_DSS_DH |
13 |
PROV_EC_ECDSA_SIG |
14 |
PROV_EC_ECNRA_SIG |
15 |
PROV_EC_ECDSA_FULL |
16 |
PROV_EC_ECNRA_FULL |
17 |
PROV_DH_SCHANNEL |
18 |
PROV_SPYRUS_LYNKS |
20 |
PROV_RNG |
21 |
PROV_INTEL_SEC |
22 |
PROV_REPLACE_OWF |
23 |
PROV_RSA_AES |
24 |
以PROV_RSA_FULL类型为例:
用途 |
算法支持 |
KeyExchange |
RSA |
Signature |
RSA |
Encryption |
RC2 RC4 |
Hashing |
MD5 SHA |
更多内容可见:
http://msdn.microsoft.com/en-us/library/aa380244.aspx
KeyNumber:指定密钥用作签名密钥还是交换密钥。
交换密钥是一个不对称密钥对,用于加密会话密钥,以便可以安全地存储会话密钥并与其他用户交换会话密钥。通过Exchange值(1)指定交换密钥。与CAPI中使用的AT_KEYEXCHANGE 值对应。
签名密钥是不对称密钥对,用于对数字签名的消息或文件进行身份验证。通过Signature值(2)指定签名密钥。与CAPI中使用的AT_SIGNATURE 值对应。默认情况下,KeyNumber字段指定交换密钥。
对这个属性对应的有一个同名的枚举KeyNumber:
Exchange |
一个交换密钥对,用于加密会话密钥以使它们可以安全存储并与其他用户交换。 |
Signature |
一个签名密钥对,用于对数字签名的消息或文件进行身份验证。 |
KeyContainerName:密钥容器名。通过它可以管理密钥容器:创建、获取、释放。
示例:密钥容器创建
{
Encoding _encoding=Encoding.UTF8;
string strPlaintext = "这是abc123!";
byte[] bPlaintext = _encoding.GetBytes(strPlaintext);
byte[] bEncrypt;
byte[] bDecrypt;
//创建容器
CspParameters cspParams = new CspParameters();
cspParams.KeyContainerName = "selfkeys";
cspParams.ProviderType = 1;//PROV_RSA_FULL
//创建密钥对,并添加到容器中
RSACryptoServiceProvider provider = new RSACryptoServiceProvider(cspParams);
//公钥加密
RSACryptoServiceProvider _provider1 = new RSACryptoServiceProvider(cspParams);
bEncrypt = _provider1.Encrypt(bPlaintext, true);
Console.WriteLine(_encoding.GetString(bEncrypt));
//私钥解密
RSACryptoServiceProvider _provider2 = new RSACryptoServiceProvider(cspParams);
bDecrypt = _provider2.Decrypt(bEncrypt, true);
Console.WriteLine(_encoding.GetString(bDecrypt));
}
未完待续……