zoukankan      html  css  js  c++  java
  • CSP加密服务(一)

     (一)  加密服务提供程序

    缩写为:CSP,全称为:Cryptographic Service Provider 即加密服务提供者。它是windows系统中提供的用于加密的软硬件组件。通过对微软的加密应用程序接口即CrytoAPI(或CAPI)的编程访问它来提供身份验证、编码和各种的加密、签名算法。

    如下图:

     

    应用程序不是直接与某个CSP通信。它会调用CAPI的函数,然后操作系统通过CrytoSPI(一个系统接口)筛选这些调用并且把这些调用传递到适合的CSP函数。然后CSP通过对参数的解析调用适当的CSP函数,最后向操作系统返回期盼值(加密操作是由特定的CSP来完成的)。

    每个CSP是实现全部加密操作的独立模块。每个应用程序中至少需要一个CSP完成加密操作。对于使用多个CSP的情况下,在加密函数调用时需要指定CSP。当然基本加密服务是默认绑定到CAPI的。每一个CSPCAPI提供不同的实现,例如某些实现了对硬件的支持。

    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

    全称:(MicrosoftCryptography 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

    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:密钥容器名。通过它可以管理密钥容器:创建、获取、释放。

     

    示例:密钥容器创建

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

     

     

    未完待续……

  • 相关阅读:
    SolidEdge如何绘制阵列之后取消掉某一些
    SolidEdge如何绘制变化半径倒圆角
    SolidEdge如何复制特征 建立类似于UG 块的概念
    SolidEdge如何打开或关闭自动标注尺寸
    SolidEdge 装配体中如何快速的搞定一个面上所有螺丝 如何在装配体上进行阵列
    SolidEdge 如何由装配图快速生成爆炸视图
    SolidEdge 如何由装配图快速进行标注和零件序号编写 制作BOM表
    [Angular 8] Take away: Web Components with Angular Elements: Beyond the Basics
    [Angular 8] Take away: Tools for Fast Angular Applications
    [Algorithm] Calculate Pow(x,n) using recursion
  • 原文地址:https://www.cnblogs.com/jams742003/p/2000832.html
Copyright © 2011-2022 走看看