区块链哈希加密算法,看完这篇文章你就懂算你狠了
我们来谈谈哈希的算法是什么。
哈希是一种加密算法。
![]()
哈希函数(哈希函数),又称散列函数或散列函数。哈希函数是一个公共函数,可以将任意长度的消息M映射为更短的固定长度值H(M)。 H(M)称为哈希值、散列值、散列值或消息摘要。它是一种单向密码系统,意味着从明文到密文的不可逆映射,只有一次加密过程,没有解密过程。
其函数表达式为:h=H(m)
无论输入是什么数字格式、文件有多大,输出都是一个固定长度的比特串。以比特币使用的Sh256算法为例,无论输入什么数据文件,输出都是256位。
每一位都是一个0或1。256bit就是256个0或1的二进制数字串。用十六进制数表示时,有多少位?
16 等于 2 的四次方,因此任何一个十六进制数都可以表示 4 位。那么256位用十六进制数表示。当然,256除以4等于64位。
所以你平时看到的哈希数值是这样的:
00740f40257a13bf03b40f54a9fe398c79a664bb21cfa2870ab078888b21e。
这是从上面随机复制的哈希值。如果不担心的话,你可以数一数,看看是不是64位的~
哈希函数的特点
哈希函数有以下特点。
易于压缩:对于任何大小的输入x,哈希值的长度都非常小。在实际应用中,函数H生成的哈希值的长度是固定的。
易于计算:对于任何给定的消息,计算其哈希值都相对容易。
单向性:对于给定的哈希值,在计算上无法找到该哈希的逆,即很难找到该哈希的逆。给定一定的哈希函数H和哈希值H(M),在计算上不可能推导出M。即原始的数值输入不能被哈希的输出逆转。这是哈希功能保障的基础。
抗碰撞:理想的哈希函数是无碰撞的,但目前的算法设计很难实现这一点。
碰撞抵抗有两种类型:一种是弱碰撞抵抗,即对于给定的消息,计算上不可能找到另一条消息;另一个是抗碰撞性强,即对于每一对不同的消息,计算上是不可能的。
高灵敏度:这是从位的角度来看,意味着输入改变1位会改变1/2位。消息M的任何改变都会改变哈希值H(M)。也就是说,如果输入稍有不同,那么哈希操作后输出一定会有所不同。
哈希算法
将URL A转换为数字1。URL B,转换为数字2。
将网站地址X转换为数字N。以数字N作为订阅,给出网站地址的信息,这个转换过程就是哈希算法。
比如这里有10000首歌曲。我给你一首新歌X,请你确认这首歌是否在这10,000首歌曲中。
疑惑,一万首歌曲一一比较速度很慢。但如果有一种方法,可以把一万首歌曲的所有数据压缩成一个数字(称为哈希代码),从而得到一万个数字,然后用同样的算法计算出新歌X的代码,看看如果歌曲X的代码在前一万个数字中,就可以知道歌曲X是否在这万首歌曲中。
举个例子,如果你想整理这10000首歌曲,一个简单的哈希算法就是用歌曲占用的硬盘字节数作为哈希码。在这种情况下,你可以按大小对 10000 首歌曲进行“排序”,然后当遇到新歌曲时,只需检查新歌曲的字节数是否与现有 10000 首歌曲中的一首相同。如果字节数相同,就知道新歌是否在这 10,000 首歌曲中。
一个可靠的哈希算法应该满足:
对于给定的数据M,很容易计算出哈希值X=F(M);
很难根据Find M和N反算出M,使得F(N)=F(M)
前面提到过,哈希的函数是防碰撞的。碰撞意味着有人可以找到奇数和偶数,所以哈希的结果是一致的,但这在计算上是不可能的。
首先,如果将大空间的消息压缩到小空间,肯定会存在冲突。假设哈希数值的长度固定为256位,如果顺序是1,2,...2^256+1,则这2^256+1个输入值都为他们的哈希一一计算出来值,我们肯定会找到两个输入值使得他们的哈希值相同。但别高兴得太早,因为在它属于你之前你必须有时间去弄清楚。
根据生日悖论,如果随机选择 2^128+1 个输入,则有概率找到至少一对冲突输入。那么对于哈希值长度为256位的哈希函数,平均需要2^128次哈希计算才能找到碰撞对。如果计算机每秒进行 10,000 次哈希计算,则大约需要 10^27 年才能完成 2^128 次哈希计算。在区块链中,利用哈希功能的抗碰撞性来验证区块和交易的完整性,任何篡改都可以被识别。
前面提到,挖矿需要矿工通过随机数不断计算出小于某个难度值的值。难度值(difficulty)是矿工挖矿的重要参考指标。它决定了矿工必须经过哈希操作多少次才能生成合法区块。比特币区块大约每 10 分钟生成一次。为了维持这个速度产生新区块,难度值必须根据全网算力的变化进行调整。
哈希的功能调整难度值,保证每个区块的挖矿时间在10分钟左右。哈希函数计算出的难度值对于保证区块链系统的安全具有重要意义。正如美国一些计算机科学家在合着的书中写道:“哈希密码是密码学的瑞士军刀,他们在许多独特的应用中找到了一席之地。为了保证安全,不同的应用会有不同的哈希密码。” '需要明函数属性。事实证明,确定一系列哈希函数以达到完全可证明的安全性是极其困难的。
工作量证明需要一个目标值。目标值(目标)的计算公式比特币工作量证明如下:
目标值 = 最大目标值 / 难度值
其中,最大目标值是一个常数:
0FFFFFFFFFFFFFFFF000FFFFFFFFFFFFFF000FFFFFFFFFFFF00 FFFF
目标值的大小是与难度值成反比。比特币工作量证明的实现是矿工计算出的区块哈希值必须小于目标值。
我们也可以很容易理解,比特币工作量证明的过程就是不断改变区块头(即尝试不同的随机值)作为输入,进行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=6881 E =53
(Mod代表剩下的师)
小星:嘿嘿,太神奇了。一个A值对应一个唯一的E值。 A不能根据E计算。你真是个贱人,好吧,这很公平,谁说谎都能被识破。
小星:笨蛋,你来提问吧……
这种丢失部分信息的加密方式,被称为“单向加密”,也叫哈希算法。
常用哈希算法
1 SHA-1 算法 SHA-1 的输入是最大长度小于 264 位的消息。输入消息以 512 位分组进行处理,输出为 160 位消息摘要。 SHA-1具有实现速度快、实现简单、应用范围广等优点。其算法描述如下。
对输入报文进行填充:填充后,报文长度应与448模512全等。填充方式为第一位为1,其他位全为0。填充前的报文长度以大端方式到上一步中剩下的最后 64 位。即使消息已经达到所需的长度,也需要执行此步骤。填充长度范围是1到512。
初始化缓冲区:160位可用于存储哈希函数的初始变量、中间摘要和最终摘要,但必须先初始化并为每个32位初始变量赋值,即:
进入消息处理顺序,处理消息块:一次处理512位消息块,共处理4轮,每轮做20次操作,如图。这四轮处理的结构类似,但每轮使用的辅助函数和常量不同。每轮的输入是当前处理的消息组和缓冲区的当前值A、B、C、D和E。输出仍被缓冲以替换 A、B、C、D 和 E 的旧值。然后将第四轮的输出与第一轮的输入CVq相加,生成CVq+1,其中相加是将缓冲器中的5个单词CVq中的每个单词与对应的单词模型232相加。处理完后,最后一组的输出就是接收到的消息摘要值。
SHA-1的阶跃函数如图所示。它是SHA-1最重要的功能,也是SHA-1最关键的组成部分。
图SHA-1阶跃函数
SHA-1每次运行阶跃函数时,A、B、C、D的值按顺序分配给寄存器B、C、D、E 。同时,A、B、C、D、E 的输入值、常量和子信息块经过阶跃函数运算后赋给 A。
其中,t为步数,0≤t≤79,Wt为当前512位长组导出的32位字,Kt为加法常数。
基本逻辑函数f的输入是3个32位字,输出是1个32位字。其功能表述如下。
对于每个输入组导出的消息组wt,前16个消息字wt(0≤t≤15)是消息输入组对应的16个32位字,其余wt(0≤t≤ 79) 可以根据以下公式得到:
其中,ROTLs 表示左循环移位 s 位,如图所示。
图SHA-1
2SHA-2算法SHA-2系列哈希算法80个消息字的生成过程,其输出长度已知。 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 消息中添加一个64位长度的块,其值为填充前消息的长度。这样得到的消息包的长度为整数512,填充后的消息长度最多为264位。
(2) 初始化链接变量。链接变量的中间结果和最终结果存储在256位缓冲区中。缓冲器使用8个32位寄存器A、B、C、D、E、F、G和H。G、H。首先,必须初始化链接变量。初始链接变量存储在 8 个寄存器 A、B、C、D、E、F、G 和 H 中:
初始链接变量取自前 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)获取最终哈希值所有512位消息块组处理完毕后,处理最后一组得到的结果就是最终输出的256位消息消化。
阶跃函数是 SHA-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个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全等,数字填充1023, padding 前一条消息的长度作为 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(0≤t≤15)分别对应于根据消息输入组的16个32位字。其他按照以下公式计算:SHA-512的
图 80。位变量x右移n位,SHRn(X)表示64位变量x右移n位。
从图中可以看出,在前16步处理中,Wt的值等于消息组中对应的64位字,而在其余64步操作中,其值为根据前 4 个值计算。 ,四个值中的两个必须进行移位和旋转。
获得Kt的方法是取前80个素数(2,3,5,7,...)的立方根的小数部分,将其转换为二进制,然后将前64位取这 80 个数字的总和作为 Kt,其中 函数是提供一个 64 位随机字符串,消除输入数据中的任何规律性。
SHA-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的消息摘要取自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位消息摘要取自总共6个64位字A、B、C、D、E和F,而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相同。
3SHA-3算法 SHA-3算法整体采用海绵结构,分为吸收和提取两个阶段。 SHA-3 的核排列 f 在 5 × 5 × 64 三维矩阵上运行。 f 总共有 24 轮,每轮包含 5 个链接 θ、ρ、π、χ 和 τ。算法的五个环节作用于三维矩阵的不同维度。 θ连杆是作用于立柱的线性运算; ρ链接是作用于每个通道的线性运算,对每个通道的64位进行循环移位操作; π链接将每个通道上的整个元素移动到另一个通道
的线性操作 目前,公开文档中SHA-3算法的安全性分析主要从以下几个方面进行。
SHA-3算法的碰撞攻击、原像攻击和二次原像攻击。
SHA-3算法的内核排列分析。这类分析主要关注算法排列和随机排列之间的区别。
扩展SHA-3算法的差分特性,主要研究SHA-3替换的高概率差分链,构建差分差分。
Keccak算法的三维加密思想和海绵结构使得SHA-3优于SHA-2甚至AES。海绵函数从任意长度的输入映射到任意长度的输出。
4RIPEMD160算法RIPEMD(RACE完整性原语评估消息摘要),即RACE原始完整性检查消息摘要。RIPEMD采用了MD4的设计原理,改进了MD4的算法错误。 RIPEMD-128版本于1996年首次发布,性能与SHA-1相似。
RIPEMD-160是RIPEMD-128的改进,是RIPEMD的通用版本。 RIPEMD-160 输出 160 位哈希值。对160位哈希函数的暴力碰撞搜索攻击需要280次计算,其计算强度大大提高。 RIPEMD-160的设计完全吸收了MD4、MD5和RIPEMD-128的一些特性,使其具有更好的抗强烈碰撞能力。它旨在取代 128 位哈希函数 MD4、MD5 和 RIPEMD。
RIPEMD-160使用160位的缓冲区来存储算法的中间结果和最终的哈希值。该缓冲区由 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 -160,RIPEMD -160 256,RIPEMD-320。128位版本的安全性受到质疑。 256 位和 320 位版本降低了意外冲突的可能性,但与 RIPEMD-128 和 RIPEMD-160 相比,它们并没有更高级别的安全性,因为它们仅基于 128 位和 160 位,改变s-box中的初始参数以实现256位和320位的输出。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
code前端网