没时间拉了,赶紧上车吧。

想必当您走有车门的用对下肢走路的时刻,绵延不绝之土地并无是你能够观看底绝无仅有事物。——乔伊斯    《一个人的朝圣》

 
 在现代社会被,信息安全于每一个人还是第一的,例如我们的银行账户安全、支付宝与微信账户安全、以及邮箱等等,说及信息安全,那就得得干加密技术,至于加密的组成部分相关概念,在此虽不说了。

《一个人数之巡礼》

作者:蕾秋·乔伊斯

出版社:北京联合出版社

出版年:2017

图书馆索书号:I561.45/Q343-2

《一个丁的巡礼》封面。    图片源于网络

 
 这同一不良以会晤要出口解.NET的加密方法,接下将会见独家介绍散列加密,对如加密,非对如加密等等加密方法以.NET中之运,本文主要教授散列加密在.NET中之以实例。

内容简介

哈罗德·弗莱 (Harold
Fry),六十五年,在酿酒厂干了四十年销代表后悄悄退休,没有晋级,既无对象,也不管敌人,退休时企业还并欢送会都尚未起来。他及隔阂很酷的贤内助已在英国的村村落落,生活平静,夫妻疏离,日复一日。

一致天早晨,他收受一模一样查封信,来自二十年无显现底老友奎妮。她身患了癌症,写信告别。震惊、悲痛之下,哈罗德写了回信,在寄出的旅途,他是因为奎妮想到了友好的人生,经过了一个而且一个信箱,越走越远,最后,他自英国绝西南联合动至了不过东北,横跨整个英格兰。87龙,627英里,只凭一个信念:只要他走,老友就会见生下来!这是哈罗德千里跋涉的故事。从他脚步迈开的那一刻于,与他六百大多英里旅程并行的,是外穿越时光隧道的别样一样庙会旅行。

一.DotNet散列算法概述:

 
 说交散列应该都未会见生,并且首先都见面想到MD5加密,但是于散列更加深刻的询问,恐怕知道之人即不见面那么基本上矣。散列算法创建了一个散列码,也号称“消息摘要”或“消息指纹”,看到“消息指纹”这个词,我先是想到的凡好唯一识别一个信还是说可以唯一的标识一个总人口。

作者简介

蕾秋·乔伊斯,英国显赫一时剧作家。写了二十年的播放剧本,也早已活跃于舞台剧界,拿过很多剧本奖。《一个人口之朝拜》是其的处女作,已畅销三四十单国,入围2012年“布克奖”。

乔伊斯个人独照。    图片源于网络

   1.散列算法原理概述:

 散列算法的着力是一个数学函数,在有限独定点大小的数码块被运行它们好创造一个散列码。在散列算法中需要指定一个“种子值”,该值和第一块消息数据并载入散列函数这就挺成了第一独破列码,按照上一样步的章程,散列码依次进来下一个散列函数运算,最后获得散列码,如下图所示:

   图片 1

 
 散列码是应用重复调用散列函数的链创建的,散列码依赖让信息的单个位之价。散列函数是通过操作简单块固定长度的二进制数据来生成散列码,散列算法则描述类使用散列函数为信息创建散列码的过程,散列算法是下散列函数的说道,指定类如何说消息及如何链接之前信息快出的结果。散列码的长也装有限制,散列码长度比丰富时,需要之破解时间就是会见比丰富,这虽是暴力破解的章程,但是散列码较丰富,生成散列码的年华纵是比丰富,任何政策都是亟需付代价的。

媒体评价

当下按照小说是轻柔的,带有几喜剧色彩,用强硬的初声音表达有了一个古的英式故事,独创,细腻,感人。

——布克文艺奖入围语

《一个口的巡礼》不仅关于善之夺,还关于日常生活的信心和万物之美,从哈罗德将同单独脚放到其它一样独自前面的轻动作开始。

——《纽约时报》

Wonderful!

——《卫报》

顿时回旅程穿过自我、走过现代社会百状态、跨越时空跟地理景观。

——《泰晤士报》

   2.DotNet之散列算法种类:

    在.NET中,常用之散列算法种类有如下几种植:

图片 2

   
在上述列举的几乎种植散列算法中,MD5是.NET含有的极端抢的散列算法。如果基础算法来毛病,越长的散列码并不一定能够提供更为好之安康。

经典语录

“但没人知道他们内心深处的担子。有时他们用付出简直不也性交的奋力来串‘正常’,每一样天且如假装,还要装得松散平常。那种不为性交的孤独感。

每当旅途,他解放了团结过去二十年来大力规避的记,任由这些回忆在他头脑里絮絮说正话,鲜活而跳跃,充满了能。他不再需要因此英里丈量自己走过的里程。他因而底凡回忆。哈罗德的小儿连无开心,导致他自幼性格孤僻,不甘于与人打交道。哈罗德·弗莱是个伟大的丈夫,却一辈子变更着腰在。他既是无对象,也管敌人,退休时要他所乐意,连告别会吧从来不开。”

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

 
 以上对散列算法,以及散列算法在.NET中分类做了一个简练的牵线,接下我们切实看一下再.NET中落实这几种植散列算法的切近。

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

图片 3

 
 在.NET中生出零星种类型的落实类似,一个是坐“Managed”结尾,这些类似都受勾勒副托管.NET语言,一栽是为“CryptoServiceProvider”结尾,这些类似是基于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);
    }

   
 由代码可知,指定哈希算法的新实例,如果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()计算输入字节数组的指定区域的哈希值,将输入字节数组的指定区域复制到指定的区域,输出字节数组。

三.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;
            }

   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

 

加密算法系列:

     
 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