DotNet加密方法深入分析

   
离度岁又近了一天,回家已然是一墙之隔,有人喜欢有人愁,因为过几天就得阅世一年一度风度翩翩度的显摆大戏,亲朋好朋友加同学的到处装逼,所以得靠豆蔻梢头剂年终奖来装饰一个落到实处的年,在这里地小编想起了四个题目“论说大话的技艺性和第风流倜傥”。

 
 都以老鸟了,不闲谈,站在外面包车型大巴都跻身,然后请后边的把门关一下,我们随后出发。

 
 上大器晚成篇首要介绍.NET的散列加密,散列算法首要用于签名等操作,在我们的门类中,就算对加密还未特地的须要,日常都以选用的相反相成加密方法,因为这种加密方法相较别的加密方法较为轻易,但是这种加密方法相比的急速,所以今日就介绍一下.NET的相辅相成加密方法。

大器晚成.DotNet对称加密概述:

 
 对称加密是应用单密钥加密方法,这也就表示加密和平解决密都是用同二个密钥。依照密码学的连锁定义,对称加密种类的组成都部队分有5个,分别是当众空间,密文空间,密钥空间,加密空间,解密算法。接下来用一个暗中提示图来表示一下:

  图片 1

 
 DotNet对称加密算法的主干是三个密码函数,该函数将定位大小的音讯数据块(纯文本卡塔 尔(英语:State of Qatar)调换来加密数据库(加密文件卡塔 尔(英语:State of Qatar)。转变为加密文书或重新建立为纯文本都急需密钥,加密是可逆的,恐怕说是双向的历程,可以选择密钥来反转加密功能同样注重建纯文本。

 
 大很多对称加密算法是在不一致的密码格局下运营,在密码函数管理数量在此之前,这个方式钦命了预备那几个多少的不如措施。密码格局有:电子代码薄形式,密码块链接,密码反馈情势。

   有关块值填充的内容在底下会讲课到。

二.DotNet对称加密类深入分析:

   1.对称加密分类:

      (1).在.NET中对称加密算法分类犹如下结构图:

图片 2

      (2).对于.NET对称加密算法的求证如下表格:

算法名称

算法说明

DES加密算法 采用的是分组加密方式,使用56位密钥加密64位明文,最后产生64位密文
3DES加密算法 采用168位的密钥,三重加密,速度比较的慢
TripleDES加密算法 用两个密钥对数据进行3次加密/解密运算
RC2加密算法 运用密钥长度可变,对明文采取64位分组加密
RC4加密算法 运用一个密钥长度可变的面向字节流的加密算法,以随机置换为基础
RC5加密算法 运用一种分组长度、密钥长度、加密迭代轮数都可变的分组加密算法。(包含密钥扩展、加密算法、解密算法)
RC6加密算法 RC6继承了RC5的循环移位思想,RC6是输入的明文由原先2个区扩展为4个块区
Rijndael加密算法 运用反复运算的加密算法,允许数据区块及密钥的长度可变。数据区块与密钥长度的变动时各自独立的

   2.DotNet对称加密主旨指标解析:

     在.NET中对称算法的档期的顺序结构如下图:

图片 3

      Ⅰ.SymmetricAlgorithm类解析:

         
SymmetricAlgorithm类允许配置三个算法(选取尺寸,填充形式卡塔尔并制造加密和平解决密数据的实例;不能够利用该类和导出达成类来种子直接管理数据。接下来大家切实通晓一下SymmetricAlgorithm类的一些措施和属性。该类是八个抽象类,是独具对称加密算法基类。在应用派生类时,假诺仅在用完对象后威迫垃圾回笼是非常不够的,要求对该对象出示的调用clear方法,以便在假释对象在此之前将对象中所包括的有所敏感数据衰亡。

         (1).IV属性:获取或安装对称算法的起始化向量。

  public virtual byte[] IV
    {
      get
      {
        if (this.IVValue == null)
          this.GenerateIV();
        return (byte[]) this.IVValue.Clone();
      }
      set
      {
        if (value == null)
          throw new ArgumentNullException("value");
        if (value.Length != this.BlockSizeValue / 8)
          throw new CryptographicException(Environment.GetResourceString("Cryptography_InvalidIVSize"));
        this.IVValue = (byte[]) value.Clone();
      }
    }

   
该归属行使字节数组的款型表示Key,该属性具备get和set属性,证明该属性是可读可写的,该属性为虚属性,能够在子类中重写。Key属性是用来获取或设置对称算法的密钥,密钥就能够使用于加密也能够行使于解密。

   (2).LegalBlockSizes属性: 获取对称算法支持的块大小(以位为单位卡塔尔国。

 public virtual KeySizes[] LegalBlockSizes
    {
      get
      {
        return (KeySizes[]) this.LegalBlockSizesValue.Clone();
      }
    }

  该属性为虚属性,在子类中可重写,该属性是只读属性。

    (3).Create()方法:创立用于施行对称算法的钦命加密对象。

public static SymmetricAlgorithm Create(string algName)
    {
      return (SymmetricAlgorithm) CryptoConfig.CreateFromName(algName);
    }

 
 该办法CryptoConfig.CreateFromName()方法在前头风度翩翩篇介绍过,在那地就不做具体的牵线,Create()接受二个SymmetricAlgorithm类型的字符串参数,钦点此次System.Security.Cryptography.SymmetricAlgorithm字符串。

   (4).Mode属性:获取或安装对称算法的演算格局。

 public virtual CipherMode Mode
    {
      get
      {
        return this.ModeValue;
      }
      set
      {
        if (value < CipherMode.CBC || CipherMode.CFB < value)
          throw new CryptographicException(Environment.GetResourceString("Cryptography_InvalidCipherMode"));
        this.ModeValue = value;
      }
    }

 
 该属性是三个虚属性,获取和设置密码代码,拉取思索数据,由代码能够观看,该属性含有多个枚举类型CipherMode,大家接下去精通一下那几个枚举类型:

     CipherMode枚举类型:钦定用于加密的块加密格局。

    [ComVisible(true)]
    public enum CipherMode
    {
        CBC = 1,
        ECB = 2,
        OFB = 3,
        CFB = 4,
        CTS = 5
    }

 
 CBC(密码块链卡塔 尔(英语:State of Qatar):该格局引进类举报;ECB(电子密码本卡塔 尔(英语:State of Qatar):该形式分别加密每一个块;OFB(输出反馈卡塔尔:该情势将一些些依次增加的纯文本甩卖改成密码文本,并不是以此管理整个块;CFB(密码反馈卡塔尔国:该格局将一丢丢递增的纯文本甩卖成密码文本,并非一回拍卖整个块;CTS(密码文本窃用卡塔尔:该形式处理其余长度的纯文本并发出长度与纯文本长度相称的密码文本。

   (5).Padding属性: 获取或安装对称算法中运用的填写方式。

public virtual PaddingMode Padding
    {
      get
      {
        return this.PaddingValue;
      }
      set
      {
        if (value < PaddingMode.None || PaddingMode.ISO10126 < value)
          throw new CryptographicException(Environment.GetResourceString("Cryptography_InvalidPaddingMode"));
        this.PaddingValue = value;
      }
    }

   该属性是对称算法中使用的填充方式,暗中同意值为
PKCS7。该属性可读可写,填充数据的有的块。由该属性可以见到二个枚举类型PaddingMode。

   
 PaddingMode枚举:钦赐当音信数据块十分的短时要利用的填充类型,比加密操作所需的漫天字节数。

    [ComVisible(true)]
    public enum PaddingMode
    {
        None = 1,
        PKCS7 = 2,
        Zeros = 3,
        ANSIX923 = 4,
        ISO10126 = 5
    }

     该枚举类型有5个成员, None = 1:不填充;PKCS7 =
2:PKCS#7填充字符串由字节系列组成,每一个字节都以相等增添的填充字节的总和; Zeros
= 3:填充字符串由安装为零的字节组成; ANSIX923 = 4:ANSI X
923填充字符串由长度前边填充零的字节系列组成;ISO10126 =
5:ISO10126填充字符串由长度在此之前的私自数据整合。

   Ⅱ.ICryptoTransform:

     
ICryptoTransform定义基本的加密改动运算,该接口的实例能够将文纯文本转产生加密文本,或然将加密文本转变为纯文本,每二个ICryptoTransform都以单向的,只可以被用于其创制的目标。该接口的质量和办法如下:

    /// <summary>
    /// 获取输入块大小。
    /// </summary>
    int InputBlockSize { get; }
    /// <summary>
    /// 获取输出块大小。
    /// </summary>
    int OutputBlockSize { get; }
    /// <summary>
    /// 获取一个值,该值指示是否可以转换多个块。
    /// </summary>
    bool CanTransformMultipleBlocks { get; }
    /// <summary>
    /// 获取一个值,该值指示是否可重复使用当前转换。
    /// </summary>
    bool CanReuseTransform { get; }
    /// <summary>
    /// 转换输入字节数组的指定区域,并将所得到的转换复制到输出字节数组的指定区域。
    /// </summary>
    int TransformBlock(byte[] inputBuffer, int inputOffset, int inputCount, byte[] outputBuffer, int outputOffset);
    /// <summary>
    /// 转换指定字节数组的指定区域。
    /// </summary>
 byte[] TransformFinalBlock(byte[] inputBuffer, int inputOffset, int inputCount);

 
  ICryptoTransform接口实例并不能够接纳于本身,.NET提供了CryptoStream类,定义将数据流链接到加密调换的流。成立CryptoStream的实例需求三个真实流、ICryptoTransform、CryptoStreamMode枚举的值。

三.DotNet对称加密实例:

   1.DES算法加密实例:

        /// <summary> 
        /// 加密数据 
        /// </summary> 
        /// <param name="text"></param> 
        /// <param name="sKey"></param> 
        /// <returns></returns> 
        public static string Encrypt(string text, string sKey)
        {
            if (string.IsNullOrEmpty(text))
            {
                throw new ArgumentNullException(text);
            }
            if (string.IsNullOrEmpty(sKey))
            {
                throw new ArgumentNullException(sKey);
            }
            MemoryStream ms = null;
            DESCryptoServiceProvider des = null;
            try
            {
                des = new DESCryptoServiceProvider();
                var inputByteArray = Encoding.Default.GetBytes(text);
                var bKey = Encoding.ASCII.GetBytes(Md5Hash(sKey).Substring(0, 8));
                des.Key = bKey;
                des.IV = bKey;
                ms = new MemoryStream();
                var cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
                cs.Write(inputByteArray, 0, inputByteArray.Length);
                cs.FlushFinalBlock();
                var ret = new StringBuilder();
                foreach (byte b in ms.ToArray())
                {
                    ret.AppendFormat("{0:X2}", b);
                }
                return ret.ToString();
            }
            catch (NotSupportedException nsex)
            {
                throw nsex;
            }
            catch (ArgumentNullException arnex)
            {
                throw arnex;
            }
            catch (EncoderFallbackException efex)
            {
                throw efex;
            }
            catch (ArgumentException arex)
            {
                throw arex;
            }
            catch (CryptographicException crex)
            {
                throw crex;
            }
            finally
            {
                if (ms != null)
                {
                    ms.Close();
                }
                if (des != null)
                {
                    des.Clear();
                }
            }
        }

    2.DES算法解密实例:

        /// <summary> 
        /// 解密数据 
        /// </summary> 
        /// <param name="text"></param> 
        /// <param name="sKey"></param> 
        /// <returns></returns> 
        public static string Decrypt(string text, string sKey)
        {
            if (string.IsNullOrEmpty(text))
            {
                throw new ArgumentNullException(text);
            }
            if (string.IsNullOrEmpty(sKey))
            {
                throw new ArgumentNullException(sKey);
            }
            MemoryStream ms = null;
            DESCryptoServiceProvider des = null;
            try
            {
                des = new DESCryptoServiceProvider();
                var len = text.Length / 2;
                byte[] inputByteArray = new byte[len];
                int x;
                for (x = 0; x < len; x++)
                {
                    var i = Convert.ToInt32(text.Substring(x * 2, 2), 16);
                    inputByteArray[x] = (byte)i;
                }
                var bKey = Encoding.ASCII.GetBytes(Md5Hash(sKey).Substring(0, 8));
                des.Key = bKey;
                des.IV = bKey;
                ms = new MemoryStream();
                CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
                cs.Write(inputByteArray, 0, inputByteArray.Length);
                cs.FlushFinalBlock();
                return Encoding.Default.GetString(ms.ToArray());
            }
            catch (NotSupportedException nsex)
            {
                throw nsex;
            }
            catch (ArgumentNullException arnex)
            {
                throw arnex;
            }
            catch (EncoderFallbackException efex)
            {
                throw efex;
            }
            catch (ArgumentException arex)
            {
                throw arex;
            }
            catch (CryptographicException crex)
            {
                throw crex;
            }
            finally
            {
                if (ms != null)
                {
                    ms.Close();
                }
                if (des != null)
                {
                    des.Clear();
                }
            }
        }

四.总结:

   
这篇博文首要批注.NET的扬长避短加密方法,从规律上教学和源码深入分析,以致提供了对应的实例,扶持大家去驾驭加密。如有错误和美中不足,接待评批指正。

 

加密算法连串:

     
 DotNet加密方法解析–散列加密:http://www.cnblogs.com/pengze0902/p/6268700.html

     
 DotNet加密方法分析–对称加密:http://www.cnblogs.com/pengze0902/p/6268702.html

     
 DotNet加密方法剖判–数字签字:http://www.cnblogs.com/pengze0902/p/6268709.html

     
 DotNet加密方法解析–非对称加密:http://www.cnblogs.com/pengze0902/p/6268705.html

admin

网站地图xml地图