邪风戏雨

青斗笠,绿蓑衣,斜风细雨不须归。

导航

加密-笔记二

Posted on 2004-12-02 20:52  fdreg  阅读(624)  评论(0)    收藏  举报
对称算法(或密钥算法)
      使用一个密钥和一个初始化向量 (IV) 来保证数据的安全。使用该数据的双方都必须知道这个密钥和初始化向量才能够加密和解密数据。非常适于加密大型的数据流。这些算法可以加密数据,也可以解密数据。它们都相当安全,但如果有足够的时间,也可能会被破密,因为有人可能会搜索每个已知的密钥值组合。
  • DES
  • RC2
  • Rijndael
  • TripleDES

  • 不对称算法(或公钥算法)
         没有对称算法快,但其代码较难破密。这些算法取决于两个密钥,一个是私钥,另一个是公钥。公钥用来加密消息,私钥是可以解密该消息的唯一密钥。公钥和私钥通过数学方法链接在一起,因此要成功进行加密交换,必须获得这两个密钥。

    对称加密步骤:
    1、生成密钥方法(以DES 为例):

         private SymmetricAlgorithm mCSP; //对称算法类
        mCSP=new DESCryptoServiceProvider();  
          mCSP.GenerateKey();    //生成密钥
        string key=Convert.ToBase64String(mCSP.Key);  // 密钥值

    2、生成初始化向量 (IV):
    IV 将帮助算法生成最终加密字符串的数据块。IV 用于开始第一个块的加密。如果不提供 IV,那么只要密钥相同,在字符串之间传递的通用数据将保持同一种模式。因此,需要使用 IV 作为加密数据的“随机”组件。通过这种方式,只要使用的 IV 不同,即使密钥相同,同一个数据也会被加密成完全不同的值。
         mCSP.GenerateIV();  //生成IV
       string iv=Convert.ToBase64String(mCSP.IV);

    3、加密数据

    private string EncryptString(string Value)
    {
      ICryptoTransform ct; 
    //需要此接口才能在任何服务提供程序上调用 CreateEncryptor 方法,服务提供程序将返回定义该接口的实际 encryptor 对象。

      MemoryStream ms;
      CryptoStream cs;
      
    byte[] byt;

      ct 
    = mCSP.CreateEncryptor(mCSP.Key, mCSP.IV);

      byt 
    = Encoding.UTF8.GetBytes(Value);//将原始字符串转换成字节数组。大多数 .NET 加密算法处理的是字节数组而不是字符串。

    //创建 CryptoStream 对象 cs 后,现在使用 CryptoStream 对象的 Write 方法将数据写入到内存数据流。这就是进行实际加密的方法,加密每个数据块时,数据将被写入 MemoryStream 对象。

      ms 
    = new MemoryStream();
      cs 
    = new CryptoStream(ms, ct, CryptoStreamMode.Write);
      cs.Write(byt, 
    0, byt.Length);
      cs.FlushFinalBlock();

      cs.Close();

      
    return Convert.ToBase64String(ms.ToArray()); 
    }


    4、解密数据

    private string DecryptString(string Value)
    {
       ICryptoTransform ct;
       MemoryStream ms;
       CryptoStream cs;
       
    byte
    [] byt;

       ct 
    =
     mCSP.CreateDecryptor(mCSP.Key, mCSP.IV);

       byt 
    =
     Convert.FromBase64String(Value);

       ms 
    = new
     MemoryStream();
       cs 
    = new
     CryptoStream(ms, ct, CryptoStreamMode.Write);
       cs.Write(byt, 
    0
    , byt.Length);
       cs.FlushFinalBlock();

       cs.Close();

       
    return
     Encoding.UTF8.GetString(ms.ToArray());
    }

    Encrypt 函数和 Decrypt 函数只有三个不同之处。

    1. 需要使用 CryptoServiceProvider 类的 CreateDecryptor 方法来创建相应的 ICtryptoTransform 对象。
    2. 需要将 Base64 编码字符串转换成字节数组。需要使用 Convert.FromBase64String 方法来实现此转换。
    3. 通过对原始字节数组进行转换,将字节数组转换成相应的内存数据流。需要将内存数据流从字节数组转换回可以在窗体上再次显示的普通字符串。需要使用 Encoding.UTF8.GetString() 方法来实现此转换。