《区块链原理、架构及应用》读书笔记二

哈希算法简介

  Hash算法,或密码学Hash函数,是密码学应用的重要组成部分。Has函数由于其压缩特性,常用于消息的核实和认证。Hash函数是区块链技术中加密的关键技术。
  一、Hash函数的定义
   Hash函数又称为杂凑函数、哈希函数或散列函数,其功能是将一串任意长度的消息映射为一个较短的固定长度的输出串。该固定长度的输出串与初始消息的所有比特相关,通常称该输出串为消息的Hash值。
   Hash函数通常用来构造数据的“数字指纹”,以验证传输数据的完整性。对于特定的数据来说,它的Hash值是惟一的,一旦数据发生变化,对应的“数字指纹”也会发生变化。因此,通过对“数字指纹”的验证就能确认数据的完整性。
 1、Hash函数的定义
 设M为所有可能消息m的集合,Y为所有可能的消息摘要y构成的有限集,则把从M到Y的映射
  H:M→Y
 称为Hash函数。在以上的定义中。M为无限集,Y为有限集。
 2、Hash函数的性质
Hash函数必须满足以下性质:
(1)输入消息的长度没有限制,Hash函数应能作用于任何大小的数据分组。
(2)压缩性:Hash函数作用于任意长度的消息后得到固定长度的输出。
(3)正向计算简单性:对任意给定消息m,计算y=H(m)比较容易,适合于软、硬件快速实现。
(4)雪崩性:对任意给定的消息m,消息摘要y=H(m)与m每一比特信息高度相关,只要改变m的任意一个比特,摘要值就会发生显著的改变。
(5)单向性:对任意给定的消息摘要y=H(m),找到满足y=H(m)的消息m是很困难的,即Hash函数求逆在计算上不可行。
(6)弱抗碰撞性:对任意给定的消息m,找到另一个不同的消息m^',使得H(m)=H(m^')在计算上不可行。
 (7)强抗碰撞性:找到任何满足H(m1)=H(m2)在计算上不可行。
  二、常见Hash函数介绍
    Hash函数的算法有很多,但不一定都很有效。Hash函数中比较有名的是MD系列算法和SHA(Secure Hash Algorithm)系列算法。MD系列算法是由Ron Rivest提出的,MD2是为8位计算机系统设计的,MD4、MD5是为32位计算机系统开发的。MD4算法易于实现,其组成结构中需要填充比特位使消息长度模512等于448,再将消息的原始长度以64bit表示,填充在最后一个消息分组中。输入信息以512bit分组,每个分组通过3轮共48个步骤的处理,得到128bit的摘要值。MD4公布后,很快就发现其存在缺陷,在极短的时间内就能找到MD4的碰撞,于是MD4被淘汰。
  Rivest又提出了MD5作为MD4的改进。MD4、MD5处理消息时都以512作为分组,输出128bit的消息摘要。MD5在MD4的基础上增加了计算的轮次,运行速度比MD4慢,但增加了安全性。MD5的压缩函数共需要进行64次运算,并对4个非线性基本逻辑函数F、G、H、I的没一个进行16次迭代。MD5复杂的结构使得输出对输入依赖性非常大,输出的每一位都是输入每一位的函数。也就是说。随机选择两条消息,即使它们具有相同的规律性,也不可能产生相同的Hash值。
 安全Hash函数SHA是由美国国家标准与技术研究所(NIST)设计并于1993年作为联邦信息处理标准发布。人们很快发现了SHA的一个弱点,于是NIST又于1995年发布了它的一个修改版SHA-1。SHA-1是国际上使用较为广泛的Hash函数。
   SHA-1产生160bit的消息摘要值,其设计思想来源于MD4,其基本框架与MD5类似,采用迭代技术构造。SHA-1算法的输入不可无限长,是长度小于264的任意消息,将原始输入消息按512bit进行分组进行处理,最后一组通过填充成为整块。通过压缩函数的反复迭代过程。最后输出160bit的消息摘要值。
   SHA-1和MD5的消息摘要长度分别为160bit和128bit,所以穷举搜索攻击的方法寻找具有给定消息摘要的消息分别需做2160和2128次运算,因此SHA抗穷举搜索攻击的强度要高于MD5。此外,安全的Hash函数设计的关键点是压缩函数,好的压缩函数的输入位应该影响多的输出位,SHA-1的压缩函数输入位影响的输出位较多,因此SHA-1安全性比MD5要高,但运行速度慢一些。
  2002年.NIST发布了修订版FIPS-2替换了FIPS-1。在FIPS-2中,除SHA-1外,新增了SHA-256、SHA-384和SHA-512三个Hash算法,这些新算法统称为SHA-2。与SHA-1相比,SHA-2具有更复杂的描述,其中安全性能最高的SHA-512算法的消息摘要长度为512bit,因此寻找具有给定消息摘要的消息需要2512次运算,因此SHA-512的抗穷举搜索攻击的强度在SHA系列算法中最高。
 三、Hash算法的用途
 1、文件校验
 我们比较熟悉的校验算法有奇偶校验和CRC校验,这2种校验并没有抗数据篡改的能力,它们一定程度上能检测并纠正数据传输中的信道误码,但却不能防止对数据的恶意破坏。
 MD5 Hash算法的“数字指纹”特性,使它成为目前应用最广泛的一种文件完整性校验和(Checksum)算法,不少Unix系统有提供计算md5 checksum的命令。
2、数字签名
 Hash 算法也是现代密码体系中的一个重要组成部分。由于非对称算法的运算速度较慢,所以在数字签名协议中,单向散列函数扮演了一个重要的角色。 对 Hash 值,又称“数字摘要”进行数字签名,在统计上可以认为与对文件本身进行数字签名是等效的。而且这样的协议还有其他的优点。
 3、鉴权协议
 如下的鉴权协议又被称作挑战--认证模式:在传输信道是可被侦听,但不可被篡改的情况下,这是一种简单而安全的方法。
三、Hash算法结构
目前,一般使用迭代技术来构造Hash函数,它是由Merkle于1989年提出,曾广泛使用的MD4、MD5以及安全Hash算法(SHA-1、SHA-2)等都是基于这种结构,采用这种方法构造的Hash函数称为迭代Hash函数。该结构大体上分为:预处理、迭代压缩过程和输出变换,其核心为迭代压缩过程中使用的压缩函数。
1、预处理
由于将不限长度的消息压缩成定长度输出的摘要值,首先必须将输入消息m划分成固定长度(rbit)的分组mi(i=1,…,t),对最后一个分组mt填充若干比特,使该分组等于固定值r。填充的比特中包括原始输入消息m的长度。
 2、迭代压缩过程
对每一个消息分组进行迭代压缩,此过程中重复使用一个压缩函数f。压缩函数f有两个输入:一个是本次迭代的第i个分组mi(长度为rbit);另一个是链接变量Hi-1(上一个分组mi-1经f函数处理以后的输出)。然后,f函数产生一个nbit的输出Hi,此输出作为下一次迭代的链接变量。通常r≥n,故称函数f为压缩函数。在开始迭代压缩之前,链接变量有一个nbit长度的初始值IV。
迭代压缩的逻辑关系为
H0=IV
Hi=f(Hi-1,mi)
3、输出变换
T轮迭代后的链接变量Ht经输出变换函数g变换后得到输入消息m的摘要值为
 H(m)=g(Ht)
   为了减少碰撞,输入消息m的长度信息作为填充的数据包含在最后一个消息的分组中,因此攻击者在试图找到伪消息m1与发送消息m的消息摘要一致时,必须保证m1的长度和m的长度一致才合法,从而大大增加了攻击的难度。这种技术称为MD的强化技术。有学者证明,经过MD强化后,Hash函数抗碰撞的强度等价于压缩函数f抗碰撞的强度。如果压缩函数f是单向的、抗碰撞的,那么这个Hash函数也是单向的、抗碰撞。攻击者对算法的攻击重点是f的内部结构,由于和分组密码一样是由若干轮处理过程组成的,所以对f的攻击需通过对各轮之间的位模式的分析来进行。分析时需要先找出f的碰撞,因此、设计安全的Hash函数就转变成设计抗碰撞的压缩函数f,并且该压缩的输入是固定长度的。

你可能感兴趣的:(《区块链原理、架构及应用》读书笔记二)