主页 > imtoken2022官网版 > 据说80%的人不懂区块链哈希算法

据说80%的人不懂区块链哈希算法

imtoken2022官网版 2023-06-18 06:55:23

华章图书:《连接未来:拥抱区块链与数字资产新时代》、《区块链发展指南》

本文约9000字+,阅读(观看)需52分钟

说起区块链,难免会听到“哈希”、“哈希函数”、“哈希算法”。 你困惑吗? 别着急,我们先来说说什么是哈哈希腊算法。

哈希是一种加密算法

散列函数(Hash Function),又称散列函数或散列函数。 哈希函数是一个公共函数,可以将一个任意长度的消息M映射成一个较短的定长值H(M)比特币的哈希算法,称为H(M)作为哈希值、散列值(Hash Value)、散列值或消息消化。 它是一种单向密码体制,即从明文到密文的不可逆映射,只有加密,没有解密。

其函数表达式为:h=H(m)

无论输入的数字格式或文件的大小如何,输出都是固定长度的位串。 以比特币使用的Sh256算法为例,无论输入什么数据文件,输出都是256bit。

每个bit是一个0或1,256bit是256个0或1的二进制数字串,用十六进制数表示多少位?

16等于2的4次方,所以每个十六进制数可以表示4位。 那么,256位用16进制数来表示,当然256除以4就等于64位。

所以你平时看到的哈希值是这样的:

00740f40257a13bf03b40f54a9fe398c79a664bb21cfa2870ab07888b21eeba8。

这是从btc.com上随机复制的hash值,不放心的可以算一下,是不是64位的~

哈希函数的特点

哈希函数具有以下特点。

易于压缩:对于任意大小的输入x,Hash值的长度都很小。 在实际应用中,函数H生成的Hash值的长度是固定的。

易于计算:对于任何给定的消息,计算其哈希值都相对容易。

单向:对于给定的Hash值,很难找到计算上不可行的Hash的逆。 给定哈希函数 H 和哈希值 H(M),推导出 M 在计算上是不可行的。也就是说,无法从哈希输出中推导出输入的原始值。 这是哈希函数安全性的基础。

防碰撞:理想的哈希函数是无碰撞的,但在实际算法的设计中很难做到这一点。

抗碰撞性有两种:一种是弱抗碰撞性,即对于给定的消息,发现另一个满足的消息在计算上是不可行的; 另一个是抗碰撞性强,即对于任何不同的消息也是计算不可行的。

高灵敏度:这是从bits的角度来说的,也就是说输入改变1bit,就会引起1/2的bits发生变化。 消息 M 的任何变化都会导致哈希值 H(M) 的变化。 也就是说,如果输入稍有不同,那么哈希运算后的输出必然不同。

哈希算法

将 URL A 转换为数字 1。 URL B,转换为数字 2。

将网站X转换成数字N,根据数字N为下标,可以快速查到网站X的信息。 这个转换过程就是散列算法。

比如这里有10000首歌曲,给你一首新歌X,让你确认这首歌是否在10000首歌曲中。

毫无疑问,将10,000首歌曲一首一首地比较是非常缓慢的。 但是如果有一种方法可以把10000首歌曲的每个数据都压缩成一个数(称为哈希码),然后得到10000个数,然后用同样的算法计算出新歌X的编码,看看Song的编码是不是X在前一万个号码中,可以知道歌曲X是否在前一万首歌曲中。

举个例子,如果要整理那10000首歌曲,一个简单的哈希算法就是用歌曲在硬盘上占用的字节数作为哈希码。 这样就可以把10000首歌曲“按大小排序”,然后遇到一首新歌,只要看新歌的字节数是否与现有10000首歌曲中的一首一样。 如果字节数相同,则可知新歌是否在10000首歌曲之内。

一个可靠的哈希算法应该满足:

详解比特币挖矿算法_比特币算法_比特币的哈希算法

对于给定的数据M,很容易计算出哈希值X=F(M);

很难从X逆向计算M;

很难找到满足 F(N)=F(M) 的 M 和 N

前面说过,哈希函数是防碰撞的。 碰撞是指有人可以找到一个奇数和一个偶数来使哈希结果一致,但这在计算上是不可行的。

首先,当一个大空间的新闻被压缩到一个小空间时,必然存在碰撞。 假设hash值的长度固定为256位,如果序列为1,2,... 2^256+1,则将2^256+1个输入值逐一计算,输入两个可以发现values使得它们的hash值相同。 但是也不要高兴得太早,因为你总得有时间去琢磨,而且是你的。

根据生日悖论,如果随机选择 2^128+1 个输入中的一个,则有 99.8% 的概率找到至少一对碰撞输入。 那么对于一个哈希值长度为256位的哈希函数,平均需要完成2^128次哈希计算才能找到碰撞对。 如果一台计算机每秒进行10000次哈希计算,那么完成2^128次哈希计算大约需要10^27年。 在区块链中,哈希函数的防碰撞特性被用来验证区块和交易的完整性,任何篡改都可以被识别。

前面提到,挖矿需要矿工通过随机数不断计算出一个小于给定难度值的值。 难度值(difficulty)是矿工挖矿时的一个重要参考指标。 它决定了矿工需要经过多少次哈希运算才能生成一个合法的区块。 比特币区块大约每 10 分钟生成一次。 为了维持这个新块生成的速度,难度值必须根据全网算力的变化进行调整。

哈希函数通过调整难度值保证每个区块的挖矿时间在10分钟左右。 通过哈希函数计算出的难度值对于保证区块链系统的安全性具有重要意义。 正如美国几位计算机科学家在合着的书中写道:“哈希密码是密码学的瑞士军刀,在许多独特的应用中都占有一席之地。为了确保安全,不同的应用需要不同的哈希函数特性。事实证明,识别一系列哈希函数以完全实现可证明的安全性是极其困难的。”

工作证明需要有一个目标值。 比特币工作量证明的目标值(target)计算公式如下:

目标值=最大目标值/难度值

其中最大目标值是一个常数值:

0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

目标值的大小与难度值成反比。 比特币工作量证明的实现是矿工计算的区块哈希值必须小于目标值。

我们也可以简单理解,比特币工作量证明的过程就是不断改变区块头(即尝试不同的随机值)作为输入,进行SHA256哈希运算,找到特定格式的哈希值(即某个特定的哈希值)的过程。前导 0 的数量是必需的)。 需要的前导 0 越多,难度就越大。

举个栗子帮助理解

▌场景一,小星和阿呆在篮球场上

小星:阿呆,你口渴吗,要不要买水喝,顺便给我买瓶。

阿呆:呵呵,我不知道你的小心思,你也口渴,你去,我不去。

小星:嘿,不说这些没用的东西了,我们来掷硬币,好吧,你正面,我反面,公平,怎么样?

哑巴:好吧。

…………

▌场景二:小星和阿呆实时聊天

阿呆:小星,今天来我家玩。 来这里的路上,有一家披萨店。 它很美味。 顺便拿一些。

小星:哦,要不你来我家玩吧,顺便带上披萨。

阿呆:小星,你居然这么说。 似乎唯一的解决办法就是抛硬币。

小星:妈的,你怎么把这个扔了,我怎么知道你有没有耍花样。

详解比特币挖矿算法_比特币算法_比特币的哈希算法

阿呆:嗯,没错,要不然。

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.A+123=B

2. B^2=C

3.取C中的第2到第4位组成一个3位的D

4.求D/12的结果的余数,得到E

阿呆:我把E和上面的计算方法告诉你。 你猜A是奇数还是偶数,然后我告诉你A是什么。 大家可以按照上面的计算过程来验证我是不是在说谎。

小星:那我想想,如果阿呆你认为A是5,那么:

5+123=128

128^2=16384

D=638 E=638mod12=53

(mod表示除法的余数)

小星:嘿,真了不起。 A的一个值对应一个E的唯一值,不能从E推导出A。你太贱了,好吧,这很公平,说谎的人都能被识别出来。

小星:笨蛋,出一道题……

这种丢失部分信息的加密方式称为“单向加密”,也称为散列算法。

常见的哈希算法

1 SHA-1算法 SHA-1的输入是最大长度小于264位的信息。 输入消息以 512 位为单位进行处理,输出为 160 位消息摘要。 SHA-1具有执行速度快、易于实施、适用范围广等优点。 其算法描述如下。

填充输入消息:填充后,消息长度模512与448全等。填充方法是第一位为1,其余位为0。然后将填充前的消息长度加上big-endian 模式中上一步中剩下的最后 64 位。 即使消息的长度已经是所需的长度,此步骤也是必要的。 填充长度范围为 1 到 512。

初始化缓冲区:160位可用于存放Hash函数的初始变量、中间摘要、最终摘要,但必须先初始化为每个32位初始变量赋值,即:

比特币的哈希算法_详解比特币挖矿算法_比特币算法

进入消息处理主循环,处理消息块:一次处理512位的消息块,共进行4轮处理,每轮20次操作,如图所示。 4 轮具有相似的结构,但每一轮使用不同的辅助函数和常量。 每轮的输入是当前处理的消息包和缓冲区的当前值A、B、C、D、E,输出仍然放在缓冲区中替换旧的A、B、C、D、E值. 第四轮的输出与第一轮的输入CVq相加生成CVq+1,其中相加是将缓冲区中的五个字CVq分别添加到缓冲区中对应的字体232中。

详解比特币挖矿算法_比特币的哈希算法_比特币算法

图 1. 单个 512 位消息块的处理流程

比特币的哈希算法_详解比特币挖矿算法_比特币算法

Output:所有的消息包处理完后,最后一个包的输出就是得到的消息摘要值。

SHA-1的阶跃函数如图所示。 它是SHA-1最重要的功能,也是SHA-1中最关键的组成部分。

比特币的哈希算法_详解比特币挖矿算法_比特币算法

图 SHA-1 的阶跃函数

SHA-1每次运行step函数时,A、B、C、D的值会依次赋值给B、C、D、E寄存器。 同时,A、B、C、D、E的输入值、常量和子信息块在步进函数运算后赋值给A。

详解比特币挖矿算法_比特币的哈希算法_比特币算法

其中,t为步数,0≤t≤79,Wt为当前512位长包导出的32位字,Kt为加法常数。

基本逻辑函数f的输入是三个32位字,输出是一个32位字,其函数表示如下。

比特币算法_比特币的哈希算法_详解比特币挖矿算法

比特币算法_比特币的哈希算法_详解比特币挖矿算法

对于每个输入包导出的消息包wt,前16个消息字wt(0≤t≤15)为消息输入包对应的16个32位字,剩下的wt(0≤t≤79)可以根据以下公式计算得到:

比特币算法_比特币的哈希算法_详解比特币挖矿算法

其中,ROTLs表示左循环移位s位,如图所示。

详解比特币挖矿算法_比特币算法_比特币的哈希算法

图SHA-1的80个消息词的生成过程

2SHA-2 Algorithm SHA-2系列哈希算法,SHA-2系列哈希算法的输出长度可以是224位、256位、384位、512位,对应SHA-224、SHA-256、SHA-384。 SHA-512。 它还包含另外两种算法:SHA-512/224、SHA-512/256。 与以往的Hash算法相比,它具有更强的安全强度和更灵活的输出长度,其中SHA-256是一种常用的算法。 下面简要介绍前四种算法。

SHA-256算法 SHA-256算法的输入是最大长度小于264位的消息,输出是256位的消息摘要。 输入消息以 512 位数据包为单位进行处理。 该算法描述如下。

(1)在消息的填充中加入一个“1”和几个“0”,使其长度模512和448相等。 消息中附加一个64位长度的块,其值为填充前消息的长度。 这样就生成了一个长度为512的整数倍的消息组,填充后的消息长度最多为264位。

(2) 初始化链接变量链接变量的中间结果和最终结果存放在一个256位的缓冲区中,缓冲区由8个32位的寄存器A、B、C、D、E、F、G表示, and H, and output 仍然放在buffer中,替换旧的A, B, C, D, E, F, G, H。首先要初始化链接变量。 初始链接变量存放在A、B、C、D、E、F、G、H这8个寄存器中:

比特币算法_比特币的哈希算法_详解比特币挖矿算法

初始链接变量取自前 8 个素数(2、3、5、7、11、13、17、19)的平方根的小数部分的二进制表示的前 32 位。

(3)主循环模块的处理 消息块以512位包为单位进行处理,需要进行64步循环操作(如图)。 每一轮的输入是当前处理的消息包和上一轮输出得到的256位缓冲区A、B、C、D、E、F、G、H的值。 每一步使用不同的消息词和常量,下面给出它们的获取方法。

比特币算法_详解比特币挖矿算法_比特币的哈希算法

图 SHA-256 的压缩函数

(4) 得到最终的Hash值 512位的消息块组全部处理完后,最后一组处理后得到的结果就是最终输出的256位消息摘要。

阶跃函数是SHA-256中最重要的函数,也是SHA-256中最关键的组成部分。 其运行过程如图所示。

详解比特币挖矿算法_比特币的哈希算法_比特币算法

详解比特币挖矿算法_比特币算法_比特币的哈希算法

图 SHA-256 的阶跃函数

详解比特币挖矿算法_比特币算法_比特币的哈希算法

寄存器A和E根据T1和T2的值更新。 A、B、C、E、F、G的输入值依次赋给B、C、D、F、G、H。

详解比特币挖矿算法_比特币的哈希算法_比特币算法

详解比特币挖矿算法_比特币的哈希算法_比特币算法

获取Kt的方法是取前64个质数(2,3,5,7,...)的立方根的小数部分,转换成二进制,然后取这64个质数的前64位数字为 Kt。 其作用是提供一个 64 位随机字符串集,以消除输入数据中的任何规律性。

对于每个输入组导出的消息组Wt,直接根据消息输入组对应的16个32位字计算前16个消息字Wt(0≤t≤15)比特币的哈希算法,其他按以下公式:

详解比特币挖矿算法_比特币的哈希算法_比特币算法

图SHA-256的64个消息字的生成过程

SHA-512算法 SHA-512是SHA-2中安全性能较高的一种算法。 主要由明文填充、消息扩展函数变换和随机数变换组成。 初始值和中间计算结果由8个64位的移位寄存器组成。 该算法允许最大输入长度为 2128 位,并生成 512 位的消息摘要。 输入消息被分成几个 1024 位的块进行处理。 具体参数为:消息摘要长度为512位; 消息长度小于2128位; 消息块大小为1024位; 消息字长为 64 位; 步数为80步。 下图展示了处理消息并输出消息摘要的整个过程。 该过程的具体步骤如下。

比特币算法_详解比特币挖矿算法_比特币的哈希算法

图SHA-512的整体结构

消息填充:用一个“1”和若干个“0”填充,使其长度对1024和896取模全等,填充位数为0-1023,填充前的消息长度追加到消息的后面用128位字段填充消息,其值为填充前消息的长度。

链接变量初始化:链接变量的中间结果和最终结果存放在一个512位的缓冲区中,缓冲区由8个64位寄存器A、B、C、D、E、F、G、H表示。 初始化链接变量也存放在A、B、C、D、E、F、G、H这8个寄存器中,其值分别为:

比特币算法_详解比特币挖矿算法_比特币的哈希算法

初始链接变量存储在大端,即字的最高有效字节存储在低地址位置。 初始链接变量取自前 8 个质数的平方根的小数部分的二进制表示的前 64 位。

主循环操作:以1024位为单位处理消息,需要80步循环操作。 每次迭代以512位缓冲区的值A、B、C、D、E、F、G、H作为输入,取值取自上一次迭代压缩的计算结果,和每一步计算都使用不同的消息字和常量。

计算最终的Hash值:报文的N个1024位数据包全部处理完后,N次迭代压缩输出的512位链接变量即为最终的Hash值。

阶跃函数是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(0≤t≤15)分别对应消息输入组后的16个32位字,其余按以下公式计算:

比特币的哈希算法_详解比特币挖矿算法_比特币算法

图SHA-512生成80个消息词的过程

在,

详解比特币挖矿算法_比特币算法_比特币的哈希算法

比特币算法_详解比特币挖矿算法_比特币的哈希算法

式中ROTRn(X)表示将64位变量x右移n位,SHRn(X)表示将64位变量x右移n位。

从图中可以看出,在前16步的处理中,Wt的值等于报文包中对应的64位字,而在剩下的64步的运算中,其值由前面计算得到4个值,4个值中的两个进行平移和旋转。

获取Kt的方法是取前80个质数(2,3,5,7,...)的立方根的小数部分,转换成二进制,然后取这80个的前64位数字作为Kt,它的作用是提供一组64位的随机字符串,用于消除输入数据中的任何规律性。

SHA-224 和 SHA-384SHA-256 和 SHA-512 是非常新的哈希函数。 前者定义一个字为32位,后者定义一个字为64位。 其实两者的结构是一样的,只是在循环运行的次数和使用的常量上有所区别。 SHA-224和SHA-384是上述两种Hash函数的截断版本,它们使用不同的初始值进行计算。

SHA-224 的输入消息长度也和 SHA-256 相同,同样小于 264 位,它的数据包大小也是 512 位。 其处理流程与SHA-256基本相同,但有以下两点不同。

SHA-224的消息摘要取自A、B、C、D、E、F、G这7个寄存器的位字,而SHA-256的消息摘要取自A、B、C、D、E , F, G 和 H 的 8 个寄存器的 32 位字。

SHA-224 的初始链接变量与 SHA-256 的初始链接变量不同。 它以高端格式存储,但它的初始链接变量是取前9到16个素数(23、29、31、37、41、43、47、53),后32位的平方根小数部分的二进制表示,SHA-224的初始链接变量如下:

比特币算法_详解比特币挖矿算法_比特币的哈希算法

SHA-224的详细计算步骤与SHA-256一致。

SHA-384 的输入消息长度与 SHA-512 相同,同样小于 2128 位,其数据包大小也是 1024 位。 处理流程与SHA-512基本相同,但有以下两点不同。

SHA-384的384位消息摘要取自A、B、C、D、E、F这6个64位字,而SHA-512的消息摘要取自A、B、C、D 、E、F、G、H一共是8个64位字。

SHA-384 的初始链接变量与 SHA-512 的初始链接变量不同。 同样以高端格式存储,但它的初始链接变量是取前9到16个质数(23、29、31、37、41、43、47、53),前64位的平方根小数部分的二进制表示,SHA-384的初始链接变量如下:

比特币算法_详解比特币挖矿算法_比特币的哈希算法

SHA-384的详细计算步骤与SHA-512相同。

3 SHA-3算法 SHA-3算法整体采用Sponge结构,分为吸收和抽取两个阶段。 SHA-3 的核心排列 f 作用于一个 5×5×64 的三维矩阵。 整个f有24轮,每轮包含5个环节θ、ρ、π、χ、τ。 算法的五个环节分别作用于三维矩阵的不同维度。 θ链接是作用在列上的线性操作; ρ链接是作用于每个轨道的线性操作,对每个轨道上的64位进行循环移位操作; π链接是将每条轨道上的元素作为一个整体移动到另一条轨道上的线性运算; χ链接是作用于每一行的非线性操作,相当于将每一行的5位替换为另外5位; τ 链接是一个加法常数链接。

目前,公开文献中对SHA-3算法的安全性分析主要从以下几个方面进行。

SHA-3算法的碰撞攻击、原像攻击和二次原像攻击。

SHA-3算法的核心排列分析,这类分析主要是针对算法排列和随机排列的区分进行的。

扩展SHA-3算法的差分特性,主要研究SHA-3替换的高概率差分链,构建差分分频器。

Keccak算法的三维加密思想和海绵结构使得SHA-3优于SHA-2甚至AES。 Sponge 函数创建一个从任意长度的输入到任意长度的输出的映射。

4RIPEMD160算法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 位的缓冲区来存储算法的中间结果和最终的 Hash 值。 这个缓存区由5个32位的寄存器A、B、C、D、E组成,寄存器的初始值如下:

比特币算法_详解比特币挖矿算法_比特币的哈希算法

存储数据时,低字节存放在低地址。

处理算法的核心是一个具有 10 个周期的压缩函数模块,每个周期由 16 个处理步骤组成。 在每个循环中使用不同的原语逻辑函数,将算法的处理分为两种不同的情况,分别使用5个原语逻辑函数,顺序相反。 每个循环以当前分组的消息字和160位缓存值A、B、C、D、E作为输入,得到新的值。 每个循环使用一个附加常数,在上一个循环结束后,计算A、B、C、D、E和A'、B'、C'、D'、E'这两种情况的计算结果和关联变量初始值经过加法运算产生最终输出。 处理完所有 512 位数据包后,得到的 160 位输出就是消息摘要。

RIPEMD算法除了128位和160位版本外,还有256位和320位版本,它们共同构成了RIPEMD家族的四个成员:RIPEMD-128、RIPEMD-160、RIPEMD-256和RIPEMD-320。 128位版本的安全性一直受到质疑,256位和320位版本减少了意外碰撞的可能性,但它们的安全性并不比RIPEMD-128和RIPEMD-160高,因为它们只是在128-bit和160-bit的基础上,修改初始参数和s-box,达到输出256-bit和320-bit的目的。