非对称加密等等加密方法在.NET中的应用,本文紧要助教散列加密在.NET中的应用实例

   没时间聊天了,赶紧上车啊。

   没时间聊天了,赶紧上车啊。

 
 在当代社会中,消息安全对于每一个人都是最紧要的,例如我们的银行账户安全、支付宝和微信账户安全、以及邮箱等等,说到信息安全,这就务须得提到加密技术,至于加密的一些息息相关概念,在此间就背着了。

 
 在现世社会中,消息安全对于每一个人都是重点的,例如我们的银行账户安全、支付宝和微信账户安全、以及邮箱等等,说到消息安全,这就务须得提到加密技术,至于加密的有些有关概念,在此地就背着了。

 
 这两次将会首要讲解.NET的加密方法,接下去将会分别介绍散列加密,对称加密,非对称加密等等加密方法在.NET中的应用,本文首要教学散列加密在.NET中的应用实例。

 
 这五次将会首要讲解.NET的加密方法,接下去将会分别介绍散列加密,对称加密,非对称加密等等加密方法在.NET中的应用,本文首要教学散列加密在.NET中的应用实例。

一.DotNet散列算法概述:

 
 说到散列应该都不会陌生,并且首先都会想到MD5加密,然而对于散列更加深刻的询问,恐怕知道的人就不会那么多了。散列算法成立了一个散列码,也称之为“信息摘要”或“信息指纹”,看到“音讯指纹”这些词,我先是想到的是足以唯一识别一个音讯或者说可以唯一的标识一个人。

一.DotNet散列算法概述:

 
 说到散列应该都不会陌生,并且首先都会想到MD5加密,可是对于散列更加深切的垂询,恐怕知道的人就不会那么多了。散列算法创造了一个散列码,也叫做“音信摘要”或“音讯指纹”,看到“音讯指纹”那个词,我首先想到的是可以唯一识别一个音讯或者说能够唯一的标识一个人。

   1.散列算法原理概述:

 散列算法的主干是一个数学函数,在几个定位大小的多寡块中运作它可以创立一个散列码。在散列算法中需要指定一个“种子值”,该值和第一块新闻数据一同载入散列函数这就生成了第一个散列码,依照上一步的不二法门,散列码依次进入下一个散列函数运算,最终取得散列码,如下图所示:

   365体育网投 1

 
 散列码是运用双重调用散列函数的链创设的,散列码依赖于音信的单个位的值。散列函数是由此操作两块固定长度的二进制数据来生成散列码,散列算法则讲述类使用散列函数为新闻成立散列码的历程,散列算法是行使散列函数的说道,指定类如何诠释音信及怎么着链接从前音讯快爆发的结果。散列码的尺寸也持有限制,散列码长度较长时,需要的破解时间就会较长,那就是暴力破解的模式,然而散列码较长,生成散列码的刻钟就是相比长,任何政策都是需要付出代价的。

   1.散列算法原理概述:

 散列算法的主干是一个数学函数,在七个定位大小的数据块中运行它可以创立一个散列码。在散列算法中需要指定一个“种子值”,该值和第一块音讯数据一同载入散列函数这就生成了第一个散列码,遵照上一步的法子,散列码依次进入下一个散列函数运算,最终得到散列码,如下图所示:

   365体育网投 2

 
 散列码是行使双重调用散列函数的链创设的,散列码依赖于音讯的单个位的值。散列函数是透过操作两块固定长度的二进制数据来生成散列码,散列算法则讲述类使用散列函数为信息成立散列码的进程,散列算法是选拔散列函数的商谈,指定类怎么着分解消息及怎样链接此前音信快发生的结果。散列码的长短也有着限制,散列码长度较长时,需要的破解时间就会较长,这就是暴力破解的艺术,不过散列码较长,生成散列码的岁月就是相比较长,任何政策都是亟需付出代价的。

   2.DotNet的散列算法系列:

    在.NET中,常用的散列算法序列有如下三种:

365体育网投 3

   
在以上列举的三种散列算法中,MD5是.NET含有的最快的散列算法。假设基础算法有欠缺,越长的散列码并不一定可以提供越好的哈密。

   2.DotNet的散列算法体系:

    在.NET中,常用的散列算法体系有如下三种:

365体育网投 4

   
在以上列举的几种散列算法中,MD5是.NET含有的最快的散列算法。如果基础算法有缺点,越长的散列码并不一定可以提供越好的平安。

二.DotNet散列算法应用解析:

 
 以上对散列算法,以及散列算法在.NET中分类做了一个简便的牵线,接下去大家实际看一下再.NET中实现这三种散列算法的类。

 
 在.NET中System.Security.Cryptography命名空间下的HashAlgorithm类,表示所有加密哈希算法实现均必须从中派生的基类。有如下类结构:

365体育网投 5

 
 在.NET中有二种档次的兑现类,一个是以“Managed”结尾,这个类都被写入托管.NET语言,一种是以“CryptoService(Service)Provider”结尾,那多少个类是基于Windows
CryptoAPI的。接下来大家实际的问询一下HashAlgorithm类的一部分办法:

二.DotNet散列算法应用解析:

 
 以上对散列算法,以及散列算法在.NET中分类做了一个简单易行的牵线,接下去大家实际看一下再.NET中落实这二种散列算法的类。

 
 在.NET中System.Security.Cryptography命名空间下的HashAlgorithm类,表示拥有加密哈希算法实现均必须从中派生的基类。有如下类结构:

365体育网投 6

 
 在.NET中有三种档次的兑现类,一个是以“Managed”结尾,这个类都被写入托管.NET语言,一种是以“Crypto瑟维斯(Service)(Service)Provider”结尾,那个类是基于Windows
CryptoAPI的。接下来大家现实的问询一下HashAlgorithm类的有些艺术:

   1.HashAlgorithm类方法和特性解析:

     (1).Hash属性:获取统计所得的哈希代码的值。

public virtual byte[] Hash
    {
      get
      {
        if (this.m_bDisposed)
          throw new ObjectDisposedException((string) null);
        if (this.State != 0)
          throw new CryptographicUnexpectedOperationException(Environment.GetResourceString("Cryptography_HashNotYetFinalized"));
        return (byte[]) this.HashValue.Clone();
      }
    }

 
该属性再次来到类总结机的散列码值,该属性是一个字节数组,由代码可以见到该属性是只读的,重返统计所得的哈希代码的当前值。

     (2).Create()方法:创造哈希算法的指定实现的实例。

  public static HashAlgorithm Create(string hashName)
    {
      return (HashAlgorithm) CryptoConfig.CreateFromName(hashName);
    }

365体育网投,   
 由代码可知,指定哈希算法的新实例,如若hashName不是有效哈希算法,则为
null,该模式应用名称创造一个HashAlgorithm对象的新实例。

     (3).ComputeHash()方法:从字节数组和数目流中创立散列码。

 public byte[] ComputeHash(byte[] buffer)
    {
      if (this.m_bDisposed)
        throw new ObjectDisposedException((string) null);
      if (buffer == null)
        throw new ArgumentNullException("buffer");
      this.HashCore(buffer, 0, buffer.Length);
      this.HashValue = this.HashFinal();
      byte[] numArray = (byte[]) this.HashValue.Clone();
      this.Initialize();
      return numArray;
    }

 
 以上是ComputeHash()方法的一个重载版本,使用字节数组来成立一个散列码,该情势重返一个字节数组,该数组含有信息数据的散列码。HashCore()将写入对象的数据路由到哈希算法以总结哈希值,HashFinal()在加密流对象处理完最终的数额后完成哈希总计。

   1.HashAlgorithm类主意和总体性解析:

     (1).Hash属性:获取总计所得的哈希代码的值。

public virtual byte[] Hash
    {
      get
      {
        if (this.m_bDisposed)
          throw new ObjectDisposedException((string) null);
        if (this.State != 0)
          throw new CryptographicUnexpectedOperationException(Environment.GetResourceString("Cryptography_HashNotYetFinalized"));
        return (byte[]) this.HashValue.Clone();
      }
    }

 
该属性再次回到类总结机的散列码值,该属性是一个字节数组,由代码可以看看该属性是只读的,重返统计所得的哈希代码的脚下值。

     (2).Create()方法:创立哈希算法的指定实现的实例。

  public static HashAlgorithm Create(string hashName)
    {
      return (HashAlgorithm) CryptoConfig.CreateFromName(hashName);
    }

   
 由代码可知,指定哈希算法的新实例,假使hashName不是有效哈希算法,则为
null,该方法应用名称成立一个HashAlgorithm对象的新实例。

     (3).ComputeHash()方法:从字节数组和多少流中创制散列码。

 public byte[] ComputeHash(byte[] buffer)
    {
      if (this.m_bDisposed)
        throw new ObjectDisposedException((string) null);
      if (buffer == null)
        throw new ArgumentNullException("buffer");
      this.HashCore(buffer, 0, buffer.Length);
      this.HashValue = this.HashFinal();
      byte[] numArray = (byte[]) this.HashValue.Clone();
      this.Initialize();
      return numArray;
    }

 
 以上是ComputeHash()方法的一个重载版本,使用字节数组来成立一个散列码,该措施重返一个字节数组,该数组含有信息数据的散列码。HashCore()将写入对象的数据路由到哈希算法以总结哈希值,HashFinal()在加密流对象处理完最终的数据后成功哈希统计。

   2.HMAC类: 表示按照哈希的消息证实代码 (HMAC) 的富有实现必须从中派生的抽象类。

     创造加密散列码(信息验证码MACs)有二种方法:

     
 第一种:先合并类密钥和音信数据,再采纳普通的加密散列算法来为该并集创制散列码。常用的是HMAC标准。

     
 第二种:使用对称算法来加密音讯数据,除了最终几位之外,所有的加密数据位都将被舍弃。

 
 HMAC标准制定了什么样统一音信数据和密钥,不过尚未点名相应选择这种散列算法来创建散列码,这也就表示该规范可以应用于此外算法。

    (1).Key属性:获取或安装用于哈希算法的密钥。

 public override byte[] Key
    {
      get
      {
        return (byte[]) this.KeyValue.Clone();
      }
      set
      {
        if (this.m_hashing)
          throw new CryptographicException(Environment.GetResourceString("Cryptography_HashKeySet"));
        this.InitializeKey(value);
      }
    }

   该属性在这边举行类重写,该属性是一个字节数组,属性可读写。

    (2).Create()方法:成立基于哈希的信息证实代码 (HMAC) 指定实现的实例。

public static HMAC Create(string algorithmName)
    {
      return (HMAC) CryptoConfig.CreateFromName(algorithmName);
    }

   该措施指定的 HMAC
实现的新实例,该形式跟HashAlgorithm类的Create方法类似,这里就不做深刻的剖析。

    (3).HashCore()方法:将写入对象的数据路由给默认 HMAC
哈希算法以总括哈希值。

  protected override void HashCore(byte[] rgb, int ib, int cb)
    {
      if (!this.m_hashing)
      {
        this.m_hash1.TransformBlock(this.m_inner, 0, this.m_inner.Length, this.m_inner, 0);
        this.m_hashing = true;
      }
      this.m_hash1.TransformBlock(rgb, ib, cb, rgb, ib);
    }

   该办法在这里被重写,将写入对象的数据路由给默认 HMAC
哈希算法以总括哈希值。TransformBlock()总结输入字节数组的指定区域的哈希值,将输入字节数组的指定区域复制到指定的区域,输出字节数组。

   2.HMAC类: 表示依照哈希的信息证实代码 (HMAC) 的装有实现必须从中派生的抽象类。

     成立加密散列码(新闻验证码MACs)有二种艺术:

     
 第一种:先合并类密钥和消息数据,再接纳普通的加密散列算法来为该并集创设散列码。常用的是HMAC标准。

     
 第二种:使用对称算法来加密消息数据,除了最终几位之外,所有的加密数据位都将被摈弃。

 
 HMAC标准制定了哪些统一音信数据和密钥,可是从未点名相应运用这种散列算法来创立散列码,这也就表示该专业可以应用于任何算法。

    (1).Key属性:获取或安装用于哈希算法的密钥。

 public override byte[] Key
    {
      get
      {
        return (byte[]) this.KeyValue.Clone();
      }
      set
      {
        if (this.m_hashing)
          throw new CryptographicException(Environment.GetResourceString("Cryptography_HashKeySet"));
        this.InitializeKey(value);
      }
    }

   该属性在这里开展类重写,该属性是一个字节数组,属性可读写。

    (2).Create()方法:成立基于哈希的信息证实代码 (HMAC) 指定实现的实例。

public static HMAC Create(string algorithmName)
    {
      return (HMAC) CryptoConfig.CreateFromName(algorithmName);
    }

   该办法指定的 HMAC
实现的新实例,该措施跟HashAlgorithm类的Create方法类似,这里就不做深切的分析。

    (3).HashCore()方法:将写入对象的数据路由给默认 HMAC
哈希算法以总结哈希值。

  protected override void HashCore(byte[] rgb, int ib, int cb)
    {
      if (!this.m_hashing)
      {
        this.m_hash1.TransformBlock(this.m_inner, 0, this.m_inner.Length, this.m_inner, 0);
        this.m_hashing = true;
      }
      this.m_hash1.TransformBlock(rgb, ib, cb, rgb, ib);
    }

   该方法在此间被重写,将写入对象的数据路由给默认 HMAC
哈希算法以统计哈希值。TransformBlock()总计输入字节数组的指定区域的哈希值,将输入字节数组的指定区域复制到指定的区域,输出字节数组。

三.DotNet散列算法实现实例:

   以上介绍在.NET下的散列加密的紧要类,接下去看一下MD5的现实性实现代码:

  /// <summary>
  /// 表示 MD5哈希算法的所有实现均从中继承的抽象类。
  /// </summary>
  [ComVisible(true)]
  public abstract class MD5 : HashAlgorithm
  {
    /// <summary>
    /// 初始化 MD5 的新实例。
    /// </summary>
    protected MD5()
    {
      this.HashSizeValue = 128;
    }

    /// <summary>
    /// 创建MD5 哈希算法的默认实现的实例。
    /// </summary>
    /// <returns>
    /// <see cref="T:System.Security.Cryptography.MD5"/> 哈希算法的新实例。
    /// </returns>   
    public static MD5 Create()
    {
      return MD5.Create("System.Security.Cryptography.MD5");
    }

    /// <summary>
    /// 创建MD5 哈希算法的指定实现的实例。
    /// </summary> 
    /// <returns>
    public static MD5 Create(string algName)
    {
      return (MD5) CryptoConfig.CreateFromName(algName);
    }
  }

 
 由上述的代码可以看住,在MD5类中,具体的实现格局都是由HashAlgorithm类的Create方法实现,在这边就不再做牵线。

三.DotNet散列算法实现实例:

   以上介绍在.NET下的散列加密的紧要类,接下去看一下MD5的切切实实贯彻代码:

  /// <summary>
  /// 表示 MD5哈希算法的所有实现均从中继承的抽象类。
  /// </summary>
  [ComVisible(true)]
  public abstract class MD5 : HashAlgorithm
  {
    /// <summary>
    /// 初始化 MD5 的新实例。
    /// </summary>
    protected MD5()
    {
      this.HashSizeValue = 128;
    }

    /// <summary>
    /// 创建MD5 哈希算法的默认实现的实例。
    /// </summary>
    /// <returns>
    /// <see cref="T:System.Security.Cryptography.MD5"/> 哈希算法的新实例。
    /// </returns>   
    public static MD5 Create()
    {
      return MD5.Create("System.Security.Cryptography.MD5");
    }

    /// <summary>
    /// 创建MD5 哈希算法的指定实现的实例。
    /// </summary> 
    /// <returns>
    public static MD5 Create(string algName)
    {
      return (MD5) CryptoConfig.CreateFromName(algName);
    }
  }

 
 由上述的代码能够看住,在MD5类中,具体的贯彻情势都是由HashAlgorithm类的Create方法实现,在这边就不再做牵线。

   1.SHA1算法实例:

   public static string GetSha1(string str)
        {
            if (string.IsNullOrEmpty(str))
            {
                throw new ArgumentNullException(str);
            }
            try
            {
                //建立SHA1对象
                SHA1 sha = new SHA1CryptoServiceProvider();
                //将mystr转换成byte[] 
                var enc = new ASCIIEncoding();
                var dataToHash = enc.GetBytes(str);
                //Hash运算
                var dataHashed = sha.ComputeHash(dataToHash);
                //将运算结果转换成string
                var hash = BitConverter.ToString(dataHashed).Replace("-", "");
                return hash;
            }
            catch (ArgumentNullException ex)
            {
                throw ex;
            }
            catch (ArgumentException arex)
            {
                throw arex;
            }
            catch (ObjectDisposedException obex)
            {
                throw obex;
            }

   1.SHA1算法实例:

   public static string GetSha1(string str)
        {
            if (string.IsNullOrEmpty(str))
            {
                throw new ArgumentNullException(str);
            }
            try
            {
                //建立SHA1对象
                SHA1 sha = new SHA1CryptoServiceProvider();
                //将mystr转换成byte[] 
                var enc = new ASCIIEncoding();
                var dataToHash = enc.GetBytes(str);
                //Hash运算
                var dataHashed = sha.ComputeHash(dataToHash);
                //将运算结果转换成string
                var hash = BitConverter.ToString(dataHashed).Replace("-", "");
                return hash;
            }
            catch (ArgumentNullException ex)
            {
                throw ex;
            }
            catch (ArgumentException arex)
            {
                throw arex;
            }
            catch (ObjectDisposedException obex)
            {
                throw obex;
            }

   2.MD5加密实例:

  /// <summary>
        /// 32位大写
        /// </summary>
        /// <returns></returns>
        public static string Upper32(string s)
        {
            var hashPasswordForStoringInConfigFile = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(s, "md5");
            if (hashPasswordForStoringInConfigFile != null)
                s = hashPasswordForStoringInConfigFile;
            return s.ToUpper();
        }

        /// <summary>
        /// 32位小写
        /// </summary>
        /// <returns></returns>
        public static string Lower32(string s)
        {
            var hashPasswordForStoringInConfigFile = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(s, "md5");
            if (hashPasswordForStoringInConfigFile != null)
                s = hashPasswordForStoringInConfigFile;
            return s.ToLower();
        }

        /// <summary>
        /// 16位大写
        /// </summary>
        /// <returns></returns>
        public static string Upper16(string s)
        {
            var hashPasswordForStoringInConfigFile = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(s, "md5");
            if (hashPasswordForStoringInConfigFile != null)
                s = hashPasswordForStoringInConfigFile.ToString();
            return s.ToUpper().Substring(8, 16);
        }

        /// <summary>
        /// 16位小写
        /// </summary>
        /// <returns></returns>
        public static string Lower16(string s)
        {
            var hashPasswordForStoringInConfigFile = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(s, "md5");
            if (hashPasswordForStoringInConfigFile != null)
                s = hashPasswordForStoringInConfigFile.ToString();
            return s.ToLower().Substring(8, 16);
        }

   2.MD5加密实例:

  /// <summary>
        /// 32位大写
        /// </summary>
        /// <returns></returns>
        public static string Upper32(string s)
        {
            var hashPasswordForStoringInConfigFile = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(s, "md5");
            if (hashPasswordForStoringInConfigFile != null)
                s = hashPasswordForStoringInConfigFile;
            return s.ToUpper();
        }

        /// <summary>
        /// 32位小写
        /// </summary>
        /// <returns></returns>
        public static string Lower32(string s)
        {
            var hashPasswordForStoringInConfigFile = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(s, "md5");
            if (hashPasswordForStoringInConfigFile != null)
                s = hashPasswordForStoringInConfigFile;
            return s.ToLower();
        }

        /// <summary>
        /// 16位大写
        /// </summary>
        /// <returns></returns>
        public static string Upper16(string s)
        {
            var hashPasswordForStoringInConfigFile = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(s, "md5");
            if (hashPasswordForStoringInConfigFile != null)
                s = hashPasswordForStoringInConfigFile.ToString();
            return s.ToUpper().Substring(8, 16);
        }

        /// <summary>
        /// 16位小写
        /// </summary>
        /// <returns></returns>
        public static string Lower16(string s)
        {
            var hashPasswordForStoringInConfigFile = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(s, "md5");
            if (hashPasswordForStoringInConfigFile != null)
                s = hashPasswordForStoringInConfigFile.ToString();
            return s.ToLower().Substring(8, 16);
        }

四.总结:

   
以上介绍了散列算法在.NET的采取和规律,希望可以帮到一些人,要是作品中有写的荒唐和不成功的地点,还望大家多多批评指正。

 
友情添加一个加密的helper方法:http://www.cnblogs.com/liqingwen/p/6155694.html

 

四.总结:

   
以上介绍了散列算法在.NET的采纳和原理,希望能够帮到一些人,假诺作品中有写的谬误和不做到的地点,还望我们多多批评指正。

 
友情添加一个加密的helper方法:http://www.cnblogs.com/liqingwen/p/6155694.html

 

加密算法体系:

     
 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

加密算法序列:

     
 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

相关文章