天天看点

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

……

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私钥加密为例:

public void Test_7_TripleDES()

{

    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

Encryption

RC2 RC4

Hashing

MD5 SHA

更多内容可见:

<a href="http://msdn.microsoft.com/en-us/library/aa380244.aspx">http://msdn.microsoft.com/en-us/library/aa380244.aspx</a>

KeyNumber:指定密钥用作签名密钥还是交换密钥。

交换密钥是一个不对称密钥对,用于加密会话密钥,以便可以安全地存储会话密钥并与其他用户交换会话密钥。通过Exchange值(1)指定交换密钥。与CAPI中使用的AT_KEYEXCHANGE 值对应。

签名密钥是不对称密钥对,用于对数字签名的消息或文件进行身份验证。通过Signature值(2)指定签名密钥。与CAPI中使用的AT_SIGNATURE 值对应。默认情况下,KeyNumber字段指定交换密钥。

对这个属性对应的有一个同名的枚举KeyNumber:

Exchange

一个交换密钥对,用于加密会话密钥以使它们可以安全存储并与其他用户交换。

一个签名密钥对,用于对数字签名的消息或文件进行身份验证。

KeyContainerName:密钥容器名。通过它可以管理密钥容器:创建、获取、释放。

示例:密钥容器创建

public void Test_9_keycontainer()

    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));

}

未完待续……

博客园大道至简

<a href="http://www.cnblogs.com/jams742003/" target="_blank">http://www.cnblogs.com/jams742003/</a>

转载请注明:博客园

继续阅读