最后更新:2020-06-23 10:35:12 手机定位技术交流文章
机器心脏报告
机器编辑部之心
什么是哈希算法?它是如何工作的?格雷格·沃克通过视频给出了一个视觉解决方案,并在GitHub上分享。详细介绍了SHA-256函数的工作原理。

项目链接:https://github.com/in3rsha/sha25animation
格雷格·沃克喜欢建立一些教育网站,并简单易懂地解释一些流行的科学算法。
在这段解释SHA-256的视频中,他不仅介绍了哈希计算,还涉及了比特币挖掘、基本运算、函数、常数等知识。
什么是散列函数?
哈希是最常见的软件操作之一,它将不同的输入映射到唯一的固定长度值(也称为“哈希值”)。许多网络服务使用哈希函数来生成标识用户身份和权限的令牌。
它是如何工作的?哈希函数可以将给定的数据转换成固定长度的不规则值。为了方便读者,我们在我的第一本书《算法》中使用了这个类比:把散列函数想象成一个混合器。

圆圆:我的第一本算法书
将数据“abc”放入搅拌机中,经过哈希函数计算后,输出一个固定长度的不规则值,这个不规则值就是“哈希值”,在大多数情况下用十六进制表示。

哈希函数有一系列特性。如上图所示,输出哈希值与输入数据的大小和长度无关。

如果输入相同,输出的哈希值必须相同。

如果输入不同,输出的哈希值也必须不同,即使只是略有不同。

当输入数据完全不同时,输出哈希值可能相同。这几种特殊情况被称为“哈希冲突”。

同时,哈希值是不可逆的,也就是说,不可能通过哈希值反向计算原始数据。
格雷格·沃克也在这个项目中通过视频介绍了上述功能。

SHA-256
SHA包括SHA-0、SHA-1、SHA-2和SHA-3系列,SHA-256是SHA-2系列的功能之一。它的摘要长度是256位,即32字节,所以它被称为SHA-256。SHA-256经常出现在比特币中。
那么SHA-256到底是什么样的呢?格雷格·沃克提供了一个动画演示。

动画秀SHA-256,你也能做到。
只需对需要哈希处理的数据运行sha256.rb脚本。
# simpleruby sha256.rb abc
#使用“0b”或“0x”前缀sha 256 . Rb 0b 01100001 ruby sha 256 . Rb 0x aabbccdd哈希二进制或十六进制数据
#加速或逐步播放动画(可选)ruby sha 256 . Rb ABC normal # default ruby sha 256 . Rb ABC fast ruby sha 256 . Rb ABC enter
输入二进制字符串作为在SHA-256运行每个函数的参数:
ruby SHR . Rb 1111111111111100000000000000 22 ruby rotr . Rb 111111111111100000000000000000000022 ruby sigma 0 . Rb 11111111111111111100000000000000000 ruby sigma 1 . Rb 11111111110000000000000 ruby sigma 1 . Rb 111111111000000000000
你也可以用hash256.rb来双击SHA256。默认情况下,脚本接受十六进制数据,如事务数据等。
ruby hash 256 . Rb 010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003 ba 3 edfd 7b 7 a 7b 7 AC 72 C3 e 67768 f 617 fc 81 BC 3888 a 51323 a9 FB 8 aa 4 B1 e5e 4a 29
SHA-256是如何工作的
基本操作
这里,只简单介绍一下SHA-256的基本运作。
SHA-256对单词使用四种基本的逐位运算。
SHA-256对单词使用四种逐位基本运算。
Shr.rb

SHRn(x) = x >。>。n
比特向右移动几个位置,而向右移动的比特丢失。
Rotr.rb

将位向右移动几个位置,然后将移动的位放在左边,也称为“循环右移”
异或(异或)

x ^ y ^ z
异或的输入为两位,如果其中只有一位为1,则输出为1。当合并多个比特时,通过多个异或运算来执行,并且同时获得多个比特的“平衡表示”。
Add.rb

(v + w + x + y + z) % 232
这是一个非常标准的整数加法运算,除了结果模数是2 ^ 32,因此将结果限制为32位。
功能
结合以上操作,您可以创建一个函数。
前四个函数使用希腊符号西格玛(小写西格玛和大写西格玛)命名。
σ0 (sigma0.rb)

σ0(x) =罗特7(x) ^罗特18(x) ^ SHR3(x)
σ1 (sigma1.rb)

σ1(x) =罗特17(x) ^罗特19(x) ^ SHR10(x)
σ0(usig ma 0 . Rb)

σ0(x)=罗特2(x) ^罗特13(x) ^罗特22(x)
σ1(usig ma 1 . Rb)

σ1(x)=罗特6(x) ^罗特11(x) ^罗特25(x)
最后两个功能“选择”和“多数”可以接受三种不同的输入,如下所示:
选择(ch.rb)

该功能根据x位在y位和z位之间进行选择。如果x = 1,则选择y位;如果x = 0,则选择z位。
Ch(x,y,z) = (x &。y)^(~ x & amp;z)
多数(maj.rb)

该函数返回三位的大部分。
Maj(x,y,z)=(x & amp;y)^(x & amp;z)^(y & amp;z)
压缩
本教程还介绍了许多有趣的基础知识,这里不再重复。我们重点研究哈希函数的压缩函数,这也是它的核心功能。
对于消息调度中的每个字,我们使用“状态寄存器”中的当前值来计算两个新的临时字(设置为t1和T2)。

临时字1 (t1.rb)

t1 =σ1(e)+Ch(e,f,g) + h + Kt + Wt
这个临时字与列表中的下一个常量一起运行消息调度中的下一个字。
临时词2 (t2.rb)
2
T2 =σ0(a)+Maj(a,b,c)
该临时字的计算方法是旋转状态寄存器中的第一个值σ _ 0,并将前三个寄存器中的“多数”值相加。
Rb)

计算两个临时字后,将状态寄存器中的值移到下一个位置,并更新寄存器:
状态寄存器中的第一个值变为t1+T2,而t1已被添加到状态寄存器中的第五个值。
这是一轮压缩,将对信息调度中的每个单词重复该过程。
在压缩整个消息调度之后,我们将哈希值添加到初始哈希值,从而获得消息块的最终哈希值。
但是,如果有其他消息块要处理,当前哈希值将用作下一次压缩的初始哈希值。如下图所示:

本文由 在线网速测试 整理编辑,转载请注明出处。