谈到区块链,你不可避免地会听到哈希,哈希函数和哈希算法。你困惑吗?唐别担心,让我们让我们在这节课中讨论散列算法。
一个
哈希是一种加密算法。
哈希函数,也称哈希函数或哈希函数。hash函数是一个公共函数,可以将任意长度的消息M映射成一个短而固定的值H(M),称为hash值、Hash值、Hash值或消息摘要。它是单向密码体制,即从明文到密文的不可逆映射,只有加密过程,没有解密过程。
其函数表达式为:h=H(m)
无论输入是什么数字格式,文件有多大,输出都是固定长度的位串。以比特币使用的Sh256算法为例。无论输入的是什么数据文件,输出都是256位。
每一位是0或1,256位是256串0或1二进制数。如果用十六进制数表示,有多少位?
6等于2的4次方,所以每个十六进制数字可以代表4位。然后,256位用十六进制数表示。当然,256除以4等于64位。
所以你平时看到的哈希值是这样的:
00740 f 40257 a 13 BF 03 b 40 f 54 a 9 Fe 398 c 79 a 664 bb 21 CFA 2870 ab 07888 b 21 eeba 8 .
这是从btc.com随机复制的哈希值。如果你不不放心,可以数数。是64位吗~
2
哈希函数的特征
哈希函数具有以下特征。
易于压缩:对于任何大小的输入X,哈希值的长度都很小。在实际应用中,函数H生成的哈希值长度是固定的。
容易计算:对于任何给定的消息,很容易计算它的哈希值。
单向:对于给定的哈希值,很难找到使其在计算上不可行的哈希值的逆。给定某个hash函数H和hash值H(M),要获得M在计算上是不可行的,即不能从hash输出中推导出输入的原始数值。这是哈希函数安全性的基础。
防碰撞:理想的哈希函数是无碰撞的,但在实际的算法设计中很难做到这一点。
防碰撞有两种:一种是弱防碰撞,即对于给定的消息,寻找另一个消息在计算上是不可行的;另一个是强防冲突,这使得它对于任何一对不同的消息在计算上都是不可行的。
灵敏度高:这是从bit的角度来说的,意思是1 bit的输入变化会引起1/2 bit的变化。消息M的任何改变都将导致散列值H(M)改变。也就是说,如果输入稍有不同,哈希运算后的输出必然不同。
三
散列算法
将URL A转换成数字1。b,URL,并将其转换为数字2。
一个URL X转换成一个数字N,根据数字N作为下标可以快速找到URL X的信息。这个转换过程就是哈希算法。
比如这里有一万首歌。我我给你一首新歌X,请你确认这首歌是否在那一万首歌里。
毫无疑问,一万首歌一首一首的对比是非常慢的。但是如果有办法把一万首歌的每一个数据都浓缩成一个数(叫做hash码),然后得到一万个数,再用同样的算法计算出新歌X的码,看看歌X的码是不是在前面的一万个数里,就可以知道歌X是不是在那一万首歌里。
举个例子,如果你想把那一万首歌组织起来,一个简单的哈希算法就是用歌曲占用硬盘的字节数作为哈希码。这样,你就可以排序大小一万首歌,然后遇到一首新歌。只要看看新歌的字节数是否与现有的一万首歌中的一首相同,就知道新歌是否在那一万首歌中。
可靠的哈希算法应满足以下要求:
对于给定的数据M,很容易计算出哈希值X=F(M);
很难从x计算出m;
很难找到M和N使得F(N)=F(M)
前面提到哈希函数有防碰撞,就是有人实现了找奇找偶使哈希结果一致,但这在计算上是不可行的。
首先,如果把大空间的消息压缩到小空间,肯定会有碰撞。假设哈希值的长度固定为256位,如果顺序为1,2,…2 ^ 256 ^ 1,逐一计算这2 ^ 256 ^ 1个输入值的哈希值,可以找到两个输入值使其哈希值相同。但是唐不要太高兴,因为你必须有时间来解决它,这是你的。
根据生日悖论,如果随机选择2 ^ 128 ^ 1个输入,有99.8%的概率找到至少一对碰撞输入。然后,对于散列值为256位的散列函数,平均需要2 ^ 128次散列计算才能找到冲突对。如果计算机每秒执行10000次哈希计算,完成2 128次哈希计算大约需要10 ^ 27年。在区块链中,哈希函数的防冲突特性用于验证块和事务的完整性,任何篡改都可以被识别。
如上所述,采矿需要矿工通过随机数不断计算出小于给定难度值的值。难度是挖掘者在挖掘中的一个重要参考指标,它决定了挖掘者需要进行多少次哈希运算才能产生一个合法的块。大约每10分钟就会产生一个比特币块。为了基本保持生成新块的速率,难度值必须根据全网计算能力的变化进行调整。
哈希函数调整难度值,保证每块花10分钟左右挖出来。哈希函数计算的难度值对于保证区块链系统的安全性具有重要意义。正如美国的几位计算机科学家在合著的一本书中所写的那样:散列密码是密码学中的瑞士军刀,它们已经在许多独特的应用中找到了一席之地。为了保证安全性,不同的应用需要不同的哈希函数特性。事实证明,要全面达到可证安全性,确定一系列哈希函数是极其困难的。"
工作量证明需要目标值。比特币工作量证书目标值的计算公式如下:
目标值=最大目标值/难度值
其中最大目标值是恒定值:
0x 000000000 fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
目标的大小与难度值成反比。比特币工作量证明的达成,意味着矿工计算的哈希值必须小于目标值。
我们也可以简单的理解为,比特币工作量证明的过程就是通过不断改变块头(即尝试不同的随机值)作为输入来进行SHA256哈希运算,从而找到一个特定格式的哈希值(即要求一定数量的前导零)的过程。需要的前导零越多,难度越大。
四
举个栗子帮助理解。
场景一、小星和阿呆在篮球场上。
肖兴:阿呆,你渴吗?你想买点水给我买一瓶吗?
阿呆:呵呵,我不I don’我不知道你在说什么。我们正在考虑。你你自己也渴了。你走了,但我赢了.
肖兴:嘿嘿,让咱们掷硬币而不是胡说八道,好吗?正面你走,反面我走。公平吧。
阿呆:好吧。
………
场景二、小星和阿呆正在实时聊天。
阿呆:小星,今天来我家玩吧。路上有个披萨店,很好吃。请随身携带一些。
肖兴:哦,为什么不你为什么不到我家来,并且带着比萨饼呢?
阿呆:晓星,我可以I don’我不相信你说过那样的话。看来我们只能抛硬币了。
小星:丫,这怎么扔?我怎么知道你是否你在策划什么?
阿呆:嗯,那这是真的。这个怎么样?
1.考虑加密结果。
阿呆:我脑子里想到一个数,假设是A,然后A乘以一个数B得到结果c,A是我的密钥,我我告诉你结果c。你可以猜A是奇数还是偶数。如果你猜对了,你就赢了。
小星:这个赢了不工作。如果你告诉我C是12,我猜A是奇数,你可以说A是4,B是3。我猜A是偶数,你可以说A是3,B是4。当你告诉我C是什么,告诉我B是什么。
阿呆:然后它赢了不工作。告诉你C和B不我的意思是告诉你A是多少。你猜怎么着。不,我们必须用另一种方法。
2.不可逆加密
阿呆:晓星,你觉得这样可以吗?我想要一个A,经过以下过程:
1.A123=B2。B2=C3。取C的第2 ~ 4位组成3位D4。D/12结果,求余数得到e。
阿呆:我我来告诉你E和上面的计算方法。猜A是奇数还是偶数,然后我我来告诉你什么是A。你可以按照上面的计算过程来验证I 我在撒谎。
肖兴:嗯,让我想想。如果阿呆 A是5,那么:
5 123=128128^2=16384d=638 e=638 mod 12=53
(mod表示除法的余数)
小星:咦,这太神奇了。一个A值对应一个唯一的E值,一个can 不要按e算,你太贱了。这很公平。任何说谎的人都能被认出来。
肖星:阿呆,请写这个问题.
这种丢失部分信息的加密方法称为单向加密",也称为哈希算法。
五
的通用哈希算法
1、SHA-1算法
SHA-1的输入是最大长度小于264位的消息。输入消息以512位的数据包进行处理,输出是160位的消息摘要。SHA-1具有实现速度快、容易实现、应用范围广的优点。其算法描述如下。
填写输入消息:填写后,消息的长度模块512应与448全等。填充方法是第一位为1,其余位为0。在以大端方式将消息填充到上一步中剩余的最后64位之前,添加消息的长度。这一步是必要的,即使消息的长度已经是期望的长度。填充的长度范围是1到512。
初始化缓冲区:160位可用于存储Hash函数的初始变量、中间摘要和最终摘要,但必须先初始化,每个32位初始变量赋一个值,即:
进入消息处理主循环,处理消息块:一次处理512位消息块,共进行4轮处理,每轮20次操作,如图所示。四轮处理的结构相似,但每轮使用的辅助函数和常数不同。每一轮的输入是当前处理的消息分组和缓冲器的当前值A、B、C、D和E,并且输出仍然被放置在缓冲器中以替换A、B、C、D和E的旧值。第四轮的输出与第一轮的输入CVq相加以生成CVq 1,其中该相加是缓冲器中的五个字CVq中的每一个与对应的字模块232相加。
图单个512位消息块的处理流程
输出:处理完所有消息包后,最后一个包的输出就是消息摘要值。
SHA-1的阶跃函数如图所示。这是SHA-1最重要的功能和最关键的组成部分。
数字SHA-1的阶跃函数
SHA-1每次运行阶跃函数时,A、B、C、D的值会依次赋给寄存器B、C、D、E。同时,A、B、C、D和E的输入值、常数和子消息块将被分配给一个后步骤功能操作。
其中,t是步进数,0t79,Wt是从当前512位数据包获得的32位字,Kt是加法常数。
基本逻辑函数F的输入是三个32位字,输出是一个32位字。其功能表述如下。
对于从每个输入包导出的报文包wt,前16个报文字wt(0t15)是报文输入包对应的16个32位字,其余wt(0t79)可由下式得到:
其中ROTLs表示向左循环移位S位,如图所示。
《SHA-1》中80个信息词的生成过程
2、SHA-2算法
SHA-2系列哈希算法的输出长度可以是224位、256位、384位和512位,分别对应SHA-224、 SHA-256、 SHA-384、 SHA-512。它还包含另外两种算法:SHA-512/224、 SHA-512/256。与以往的哈希算法相比,具有更强的安全强度和更灵活的输出长度,其中SHA-256是常用的算法。下面将简要描述前四种算法。
SHA-256算法
SHA-256算法的输入是最大长度小于264位的消息,输出是256位的消息摘要。输入消息以512位数据包的形式进行处理。该算法描述如下。
(1)消息的填充
添加一个1 还有几个0s"以使其长度模数512与448一致。64位长度的块被附加到消息中,其值是填充前的消息长度。从而生成长度为512整数倍的消息包,填充后的消息长度最多为264位。
(2)初始化链接变量
链接变量的中间结果和最终结果存储在一个256位缓冲器中,该缓冲器由8个32位寄存器A、B、C、D、E、F、G和H表示。输出仍放在缓冲器中,以替换旧的A、B、C、D、E、F、G和H。为了首先初始化链接变量,初始链接变量存储在8个寄存器A、B、C、D、E、F、G和H中:
初始链接变量是前八个质数的平方根的小数部分(2、3、5、7、11、13、17、19)。
(3)加工主循环模块
消息块以512位的包进行处理,需要64步循环操作(如图)。每一轮的输入是当前处理的消息包和从前一轮的输出获得的256位缓冲区A、B、C、D、E、F、G和H的值。在每一步中,使用不同的消息字和常数,下面将给出获取它们的方法。
图形SHA-256的压缩函数
(4)得到最终的哈希值。
处理完所有512位消息块数据包后,最后一个数据包处理的结果就是最终输出的256位消息摘要。
台阶是SHA-256最重要的功能和最关键的组成部分。操作过程如图所示。
数字SHA-256的阶跃函数
根据T1、T2的值更新寄存器a和e。A、B、C、E、F、G的输入值依次赋给B、C、D、F、G、H。
获取Kt的方法是取前64个素数(2,3,5,7,…)的立方根的小数部分,转换成二进制,然后取这64个数的前64位作为Kt。它的功能是提供一个64位随机字符串集,以消除输入数据中的任何规律性。
对于每一个输入包派生出的报文包Wt,前16个报文字Wt(0t15)直接根据报文输入包对应的16个32位字计算,其余按以下公式计算:
《SHA-256》中64个信息词的生成过程
SHA-512算法
SHA-512是SHA-2一种安全性能很高的算法。主要由明文填充、消息扩散函数变换和随机数变换组成。初始值和中间计算结果由8个64位移位寄存器组成。该算法允许最大输入长度为2128位,并生成一个512位的消息摘要。输入消息被分成几个1024位的块进行处理。具体参数为:报文摘要长度为512位;消息长度小于2128位;消息块大小是1024比特;消息大小为64位;步数是80。下图显示了处理消息和输出消息摘要的整个过程。这个过程的具体步骤如下。
人物SHA-512的整体结构
邮件填充:填充1 还有几个0 & gt;使得其长度模数1024与896一致,并且填充比特是0-1023。填充前的消息长度通过一个128位字段附加到填充消息的后面,该字段的值是填充前的消息长度。
链接变量的初始化:链接变量的中间结果和最终结果存储在一个512位的缓冲区中,由8个64位寄存器A、B、C、D、E、F、G、H表示,初始链接变量也存储在8个寄存器A、B、C、D、E、F、G、H中,它们的值分别为:
初始链路变量以大端模式存储,即字的最高有效字节存储在低位地址位置。初始链路变量取自前8个素数的平方根的小数部分的二进制表示的前64位。
主循环操作:消息以1024位的包进行处理,需要80次循环操作。每次迭代取512位缓冲区A、B、C、D、E、F、G、H的值作为输入,它们的值取自上一次迭代的压缩计算结果。在每个计算步骤中使用不同的消息字和常数。
计算最终哈希值:消息的N个1024位包全部处理完毕后,第N次迭代压缩输出的512位链接变量就是最终哈希值。
功能是SHA-512最关键的组成部分,其操作流程与SHA-256类似。每一步的计算公式如下所示。B、C、D、F、G和H的更新值分别是A、B、C、E、F和G的输入状态值。同时,产生两个临时变量来更新寄存器A和e。
对于80步操作中的每一步T,使用一个64位消息字Wt,其值从当前处理的1024位消息包Mi中导出。推导方法如图所示。前16个报文字Wt(0t15)分别对应报文输入包后的16个32位字,其余按下式计算:
80个信息词的生成过程
其中,
在这个公式中,ROTRn(X)表示64位变量X循环右移n位,SHRn(X)表示64位变量X右移n位。
从图中可以看出,在前16步中,Wt的值等于消息包中对应的64位字,而在剩下的64步中,它的值是由前四个值计算出来的,四个值中的两个被移位循环移位。
获取Kt的方法是取前80个素数(2,3,5,7,…)的立方根的小数部分,转换成二进制,然后取这80个数的前64位作为Kt。它的功能是提供一个64位随机字符串集,以消除输入数据中的任何规律性。
沙-224和SHA-384
SHA-256和SHA-512是非常新的散列函数。前者将一个字定义为32位,后者将一个字定义为64位。实际上,这两种系统的结构是相同的,但它们在循环次数和使用常数方面不同。SHA-224和SHA-384是上述两种哈希函数的截断版本,它们使用不同的初始值进行计算。
SHA-224的输入报文长度与SHA-256相同,也小于264位,其数据包大小为512位。其处理流程与SHA-256基本相同,但有以下两点不同。
SHA-224的报文摘要取自7个寄存器A、B、C、D、E、F和G的位字,而SHA-256的报文摘要取自8个寄存器A、B、C、D、E、F、G和h的32位字
SHA-224的初始链路变量不同于SHA-256的初始链路变量。它以高端格式存储,但其初始链接变量是通过取前9到16个素数(23、29、31、37、4010-010)获得的
SHA-224的详细计算步骤与SHA-256一致。
SHA-384的输入报文长度与SHA-512相同,但也小于2128位,数据包大小也是1024位。处理流程与SHA-512的流程基本相同,但有以下两处不同。
SHA-384的384位报文摘要取自6个64位字A、B、C、D、E、F,而SHA-512的报文摘要取自8个64位字A、B、C、D、E、F、G、h
SHA-384的初始链接变量不同于SHA-512。它也以高端格式存储,但它的初始链接变量是通过取前9到16个素数(23、29、31、37、4010-010)获得的
SHA-384的具体计算步骤与SHA-512相同。
3、SHA-3算法
SHA-3算法整体采用海绵结构,分为吸收和提取两个阶段。SHA-3的核心置换F作用于5564的三维矩阵。F有24轮,每轮包括,,,,五个环节。算法的五个环节分别作用于三维矩阵的不同维度。 link是作用在柱上的线性运算; link是作用在每个通道上的线性运算,每个通道上的64位循环移位;-link是将每个通道上的全部元素移动到另一个通道的线性运算; link是作用在每一行上的非线性运算,相当于用另外5位替换每一行中的5位;链接是一个不断添加的链接。
目前公开文献中对SHA-3算法的安全性分析主要从以下几个方面进行。
对SHA-3算法的碰撞攻击、原始图像攻击和二次原始图像攻击。
对SHA-3算法核心排列的分析主要集中在算法排列和随机排列的区分上。
开发了SHA-3算法的差分特性,主要针对SHA-3排列的高概率差分链,构造差分鉴别器。
Keccak算法的三维加密思想和海绵结构使得SHA-3优于SHA-2甚至AES。海绵函数可以建立从任意长度输入到任意长度输出的映射。
4、RIPEMD160算法
ripemd(RACE integrity primitives evaluation message digest),即RACE原始完整性检查的消息摘要。RIPEMD采用了MD4的设计原理,改进了MD4的算法缺陷。RIPEMD-128于1996年首次发布,性能与SHA-1相似。
RIPEMD-160是对RIPEMD-128的改进,是RIPEMD中最常见的版本。RIPEMD-160输出一个160位的Hash值,对160位Hash函数的暴力碰撞搜索攻击需要280次计算,因此计算强度大大提高。RIPEMD-160的设计充分吸收了MD4、 MD5、 RIPEMD-128的一些特性,使其具有更好的防撞能力。它旨在取代128位哈希函数MD4、MD5和RIPEMD。
RIPEMD-160使用160位缓冲区来存储算法的中间结果和最终哈希值。该缓冲器由五个32位寄存器A、B、C、D和e组成,寄存器的初始值如下:
数据以低位字节的形式存储在低位地址。
该算法的核心是一个具有10个循环的压缩函数模块,其中每个循环由16个处理步骤组成。每个循环使用不同的原始逻辑函数,算法的处理分为两种不同的情况。在这两种情况下,五个原始逻辑函数以相反的顺序使用。每个周期将当前数据包的消息字和160位缓存值A、B、C、D、E作为输入,以获得新值。每个周期使用一个额外的常数。最后一个循环结束后,将A、B、C、D、E两种情况的计算结果和A、B、C、D、E的初始值以及链接变量相加一次,产生最终输出。处理完所有512位数据包后,最终输出的160位数据包就是消息摘要。
除了128位和160位版本,还有256位和320位版本的RIPEMD,它们共同构成了RIPEMD家族的四个成员:RIPEMD-128、RIPEMD-160,RIPEMD-256、RIPEMD-320。其中128位版本的安全性受到了质疑,256位和320位版本降低了意外碰撞的可能性。然而,与RIPEMD-128和RIPEMD-160相比,它们不具有更高的安全级别,因为他们只是在128位和160位的基础上修改了初始参数和s盒,以达到输出256位和320位的目的。
标签:消息值算法