对SHA-256感到好奇?这个项目教你如何可视化哈希函数的工作原理

      最后更新: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已被添加到状态寄存器中的第五个值。

      这是一轮压缩,将对信息调度中的每个单词重复该过程。

      在压缩整个消息调度之后,我们将哈希值添加到初始哈希值,从而获得消息块的最终哈希值。

      但是,如果有其他消息块要处理,当前哈希值将用作下一次压缩的初始哈希值。如下图所示:

      本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/8173.html

          热门文章

          文章分类