Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >对SHA-256感到好奇?这个项目教你如何可视化哈希函数的工作原理

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

作者头像
机器之心
发布于 2020-06-29 08:06:44
发布于 2020-06-29 08:06:44
1.4K04
代码可运行
举报
文章被收录于专栏:机器之心机器之心
运行总次数:4
代码可运行

机器之心编辑部

哈希算法到底是什么?它又是如何运行的?Greg Walker 用视频给出了一个可视化的解答,并在 GitHub 上进行了共享,详细介绍了 SHA-256 函数的工作原理。

项目链接:https://github.com/in3rsha/sha256-animation

Greg Walker 喜欢构建一些教育性网站,简单易懂地讲解一些科普类算法。

他在这个解释 SHA-256 的视频中,不仅介绍了哈希计算,还涉及比特币挖矿、基础运算、函数、常量等知识。

什么是哈希函数

哈希就是将不同的输入映射成独一无二的、固定长度的值(又称 "哈希值"),是最常见的软件运算之一。很多网络服务会使用哈希函数,产生一个 token,标识用户的身份和权限。

那它是如何运行的呢?哈希函数可以把给定的数据转换成固定长度的无规律数值。此处为方便读者理解,我们借用《我的第一本算法书》里的比喻:将哈希函数想象成搅拌机。

图源:《我的第一本算法书》

将数据 “abc” 放入搅拌机里,经过哈希函数计算后,会输出固定长度且无规律的数值,而这个无规律数值就是“哈希值”,绝大多数情况用十六进制来表示。

哈希函数有一系列特征,如上图所示,输出的哈希值与输入数据的大小、长度等没有任何关系。

若输入相同,输出的哈希值也必定相同。

如输入不同,输出的哈希值也必然不同,哪怕是只有细微区别。

在输入数据完全不同的情况下,输出的哈希值有可能是相同的,这种少数特殊情况称为“哈希冲突”。

同时,哈希值是不可逆的,也就是说,通过哈希值不可能反向推算出原本的数据。

在本项目中,Greg Walker 也通过视频介绍了以上几大特征。

SHA-256

SHA 包括 SHA-0、SHA-1、SHA-2 和 SHA-3 系列,SHA-256 是 SHA-2 系列的函数之一。其摘要长度为 256 bits,即 32 个字节,故称 SHA-256。SHA-256 常出现于比特币领域。

那么 SHA-256 到底是什么样的呢?Greg Walker 提供了动画展示。

动画展示 SHA-256,你也能做到

只需对需要进行 hash 处理的数据运行 sha256.rb 脚本即可。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# simple
ruby sha256.rb abc

# hash binary or hex data by using `0b` or `0x` prefixes
ruby sha256.rb 0b01100001
ruby sha256.rb 0xaabbccdd

# speed up or step through the animation (optional)
ruby sha256.rb abc normal # default
ruby sha256.rb abc fast
ruby sha256.rb abc enter

输入二进制字符串作为参数,从而运行 SHA-256 中的各个函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ruby shr.rb 11111111111111110000000000000000 22
ruby rotr.rb 11111111111111110000000000000000 22
ruby sigma0.rb 11111111111111110000000000000000
ruby sigma1.rb 11111111111111110000000000000000
ruby usigma0.rb 11111111111111110000000000000000
ruby usigma1.rb 11111111111111110000000000000000
ruby ch.rb 11111111111111110000000000000000 11110000111100001111000011110000 00000000000000001111111111111111
ruby maj.rb 11111111111111110000000000000000 11110000111100001111000011110000 00000000000000001111111111111111

你也可以使用 hash256.rb 来进行 double-SHA256,该脚本默认接受十六进制数据,如交易数据等。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ruby hash256.rb 0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a29ab5f49ffff001d1dac2b7c # genesis block header

SHA-256 的工作原理

基础运算

这里只对 SHA-256 的基础运算进行简单介绍。

SHA-256 uses four basic bitwise operations on words.

SHA-256 对 words 使用 4 种 bitwise 基础运算。

右移 (shr.rb)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SHRn(x) = x >> n

将 bits 向右移动多个位置,同时从右侧移出的 bits 丢失。

向右旋转 (rotr.rb)

将 bits 向右移动多个位置,然后将移动后的 bits 放在左侧,也称为「循环右移」。

Exclusive Or (xor.rb)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
x ^ y ^ z

XOR 的输入为两个 bit,如果其中只有一个为 1,则输出 1。在合并多个 bit 时通过多次 XOR 运算进行,同时获得多个 bit 的“平衡表示”(balanced representation)。

加法 (add.rb)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(v + w + x + y + z) % 232

这是非常标准的整数加法运算,唯一的不同是,此处采用结果模数为 2^32,从而将结果限制为 32 位数字。

函数

将上述运算组合起来,就可以创建函数。

前四个函数使用希腊符号 Sigma 命名(小写σ和大写Σ)。

σ0 (sigma0.rb)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
σ0(x) = ROTR7(x) ^ ROTR18(x) ^ SHR3(x)

σ1 (sigma1.rb)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
σ1(x) = ROTR17(x) ^ ROTR19(x) ^ SHR10(x)

Σ0 (usigma0.rb)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Σ0(x) = ROTR2(x) ^ ROTR13(x) ^ ROTR22(x)

Σ1 (usigma1.rb)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Σ1(x) = ROTR6(x) ^ ROTR11(x) ^ ROTR25(x)

最后两个函数 “Choice” 和“Majority”可接受三个不同的输入,如下所示:

Choice (ch.rb)

该函数基于 x 位在 y 位和 z 位之间做出选择。如果 x = 1,则选择 y 位;如果 x = 0,则选择 z 位。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Ch(x, y, z) = (x & y) ^ (~x & z)

Majority (maj.rb)

该函数返回的是三个 bits 中的多数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Maj(x, y, z) = (x & y) ^ (x & z) ^ (y & z)

压缩

该教程中还介绍了很多有趣的基础知识,这里不再赘述。我们重点来看哈希函数的压缩函数,这也是其核心功能。

对于消息调度中的每个词,我们都使用 “状态寄存器” 中的当前值来计算两个新的临时词(设为 T_1 和 T_2)。

Temporary Word 1 (t1.rb)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
T1 = Σ1(e) + Ch(e, f, g) + h + Kt + Wt

此临时词将消息调度中的下一个单词与列表中的下一个常量并在一起运行。

Temporary Word 2 (t2.rb)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
T2 = Σ0(a) + Maj(a, b, c)

通过将状态寄存器中第一个值Σ_0 进行旋转,与前三个寄存器中的 Majority 的值相加来计算这个临时词。

压缩 (compression.rb)

在计算了两个临时词之后,将状态寄存器中的值移至下一个位置,并更新寄存器:

状态寄存器中的第一个值变为 T_1 + T_2,同时状态寄存器中的第五个值已添加了 T_1。

这即是一轮压缩,对于信息调度中的每个词该过程都会重复一次。

在压缩了整个消息调度之后,我们将得到的哈希值添加到初始哈希值中,由此得出消息块的最终哈希值。

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机器之心 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
今日推荐:sha256-animation
关于sha256相信很多人都不陌生,尤其是经常会写接口啥的,在加密中这个哈希使用很频繁。但是这个值到底是怎么生成的,有人好奇么?
仇诺伊
2020/05/15
5350
今日推荐:sha256-animation
SHA-256、MD-5…… 哈希散列函数这些原理你懂了吗?
作者 | wagslane 译者 | 火火酱,责任编| Carol 出品| 区块链大本营(ID:blockchain_camp ) 本文对哈希函数进行简要的介绍,旨在帮助读者理解为什么要使用哈希函数,以及其基本工作原理。文中将省略具体证明和实现细节,而将重点放在高级原理上。 为什么要使用哈希函数 哈希函数被广泛应用于互联网的各个方面,主要用于安全存储密码、查找备份记录、快速存储和检索数据等等。例如,Qvault使用哈希散列将主密码扩展为私人加密密钥。 (Qvault:https://qvault.io/)
区块链大本营
2023/03/31
8680
SHA-256、MD-5…… 哈希散列函数这些原理你懂了吗?
SHA-256
是一个密码散列函数家族,xxx认证的安全散列算法。能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法。且若输入的消息不同,它们对应到不同字符串的机率很高。
vanguard
2020/12/11
1.7K0
asp中的md5/sha1/sha256算法收集
对于asp这种古董级的技术,这年头想找一些有用的资料已经不容易了,下面是一些常用的加密算法: md5 (将以下代码另存为md5.inc) <% Private Const BITS_TO_A_BYTE = 8 Private Const BYTES_TO_A_WORD = 4 Private Const BITS_TO_A_WORD = 32 Private m_lOnBits(30) Private m_l2Power(30) Private Function LShift(lValue, iShif
菩提树下的杨过
2018/01/19
1.3K0
哈希算法
实际上,不管是“散列”还是“哈希”,这都是中文翻译的差别,英文其实就是“Hash”。所以,我们常听到有人把“散列表”叫作“哈希表”“Hash
ruochen
2021/11/23
4920
CUDA PTX ISA阅读笔记(二)
8. 第八章 指令集 这一章占了整个手册的一大半(百十来页吧),主要介绍各种指令,虽然页数很多,但是大多数指令都很简单。 8.1. 指令的形式和语义描述 这章就是主要描述每个PTX指令。除了指令的形式
用户1148523
2018/01/09
5K0
CUDA PTX ISA阅读笔记(二)
以太坊虚拟机EVM的工作原理是怎样的
如果你打算尝试在以太坊区块链上开发智能合约,或者已经在该领域工作了一段时间,可能会遇到EVM一词,EMV是太坊虚拟机的缩写。 虚拟机本质上是在执行代码和执行的机器之间创建一个抽象级别。需要这一层抽象来提高软件的可移植性,以及确保应用程序彼此分离,并与运行它们的主机分离。
用户7634691
2023/02/24
7860
以太坊虚拟机EVM的工作原理是怎样的
[ffffffff0x] 安全工具系列 :SM3国密算法模块学习
国密即国家密码局认定的国产密码算法.主要有 SM1,SM2,SM3,SM4.密钥长度和分组长度均为 128 位.
r0fus0d
2020/12/22
1.6K0
[ffffffff0x] 安全工具系列  :SM3国密算法模块学习
哈希算法原来有这么多应用场景!
这些定义和要求都比较理论,可能还是不好理解,我拿MD5这种哈希算法来具体说明一下。
JavaEdge
2021/10/18
1.4K0
GPU的工作原理
在GPU出现以前,显卡和CPU的关系有点像“主仆”,简单地说这时的显卡就是画笔,根据各种有CPU发出的指令和数据进行着色,材质的填充、渲染、输出等。 较早的娱乐用的3D显卡又称“3D加速卡”,由于大部分坐标处理的工作及光影特效需要由CPU亲自处理,占用了CPU太多的运算时间,从而造成整体画面不能非常流畅地表现出来。 例如,渲染一个复杂的三维场景,需要在一秒内处理几千万个三角形顶点和光栅化几十亿的像素。早期的3D游戏,显卡只是为屏幕上显示像素提供一个缓存,所有的图形处理都是由CPU单独完成。图形渲染适合并行处
刘盼
2018/04/08
3.9K2
GPU的工作原理
[以太坊源代码分析]III. 挖矿和共识算法的奥秘
1.待挖掘区块需要组装 在Ethereum 代码中,名为miner的包(package)负责向外提供一个“挖矿”得到的新区块,其主要结构体的UML关系图如下图所示: 处于入口的类是Miner,它作
月牙寂道长
2018/03/29
1.1K0
[以太坊源代码分析]III. 挖矿和共识算法的奥秘
二进制学习
C 语言的奇技淫巧 https://jin-yang.github.io/post/program-c-tips.html
wywwzjj
2023/05/09
1.1K0
二进制学习
矩阵相乘在GPU上的终极优化:深度解析Maxas汇编器工作原理
在从事深度学习框架的实现工作时,了解到 Nervana 有一个称为 Maxas 的汇编代码生成器项目,可以生成性能超过 nVidia 官方版本的矩阵相乘的 GPU 机器码,由此对其工作原理产生兴趣。
机器之心
2020/05/19
9340
矩阵相乘在GPU上的终极优化:深度解析Maxas汇编器工作原理
深入理解 Lua 虚拟机
作者:nicochen,腾讯 IEG 游戏开发工程师 本文从一个简单示例入手,详细讲解 Lua 字节码文件的存储结构及各字段含义,进而引出 Lua 虚拟机指令集和运行时的核心数据结构 Lua State,最后解释 Lua 虚拟机的 47 条指令如何在 Lua State 上运作的。 为了达到较高的执行效率,lua 代码并不是直接被 Lua 解释器解释执行,而是会先编译为字节码,然后再交给 lua 虚拟机去执行。lua 代码称为 chunk,编译成的字节码则称为二进制 chunk(Binary chun
腾讯技术工程官方号
2020/06/22
4.7K0
CTF&爬虫:掌握这些特征,一秒识别密文加密方式
爬虫工程师在做加密参数逆向的时候,经常会遇到各种各样的加密算法、编码、混淆,每个算法都有其对应的特征,对于一些较小的网站,往往直接引用这些官方算法,没有进行魔改等其他操作,这种情况下,如果我们能熟悉常见算法的特征,通过密文就能猜测出使用的哪种算法、编码、混淆,将会大大提高工作效率!在 CTF 中通常也会有密码类的题目,掌握一些常见密文特征也是 CTFer 们必备的技能!
K哥爬虫
2022/01/14
3K0
CTF&爬虫:掌握这些特征,一秒识别密文加密方式
Python基础语法(五)—常用模块和模块的安装和导入
Python基础语法(五)—常用模块的使用和模块的安装和导入,本文介绍的Python模块有:os、sys、time、datetime、random、pickle、json、hashlib、shutil、re。
zeruns
2020/08/07
1.3K0
Python基础语法(五)—常用模块和模块的安装和导入
C/C++ 常用加密与解密算法
计算机安全和数据隐私是现代应用程序设计中至关重要的方面。为了确保数据的机密性和完整性,常常需要使用加密和解密算法。C++是一种广泛使用的编程语言,提供了许多加密和解密算法的实现。本文将介绍一些在C++中常用的加密与解密算法,这其中包括Xor异或、BASE64、AES、MD5、SHA256、RSA等。
王瑞MVP
2023/11/26
1.5K0
C/C++ 常用加密与解密算法
python初学者必须吃透的这些内置函数
所谓内置函数,就是Python提供的, 可以直接拿来直接用的函数,比如大家熟悉的print,range、input等,也有不是很熟,但是很重要的,如enumerate、zip、join等,Python内置的这些函数非常精巧且强大的,对初学者来说,经常会忽略,但是偶尔会碰到,我也是用了一段时间python之后才发现,还有这么好的函数,每个函数都非常经典,而且经过严格测试,使用内置函数,不用自己闭门造车,并且代码简洁易读了很多,真是方便又实用,值得花时间进行体系化研究学习。
程序员小新
2021/12/20
8230
python初学者必须吃透的这些内置函数
「MoreThanJava」一文了解二进制和CPU工作原理
在讨论「二进制」和「CPU 如何工作」之前,我们先来讨论一下我们生活中最稀疏平常的 数字,我们与之频繁地打交道:一个约定的时间、一件商品的价格、一个人的身高....却很少有人细细想过,这些数字是如何表达出来的?为什么你理所当然地把 1024 理解为「一千零二十四」而不是别的含义?
我没有三颗心脏
2020/06/03
7280
9.0 Python 内置模块应用
Python 是一种高级、面向对象、通用的编程语言,由Guido van Rossum发明,于1991年首次发布。Python 的设计哲学强调代码的可读性和简洁性,同时也非常适合于大型项目的开发。Python 语言被广泛用于Web开发、科学计算、人工智能、自动化测试、游戏开发等各个领域,并且拥有丰富的第三方库和工具,使得Python成为广泛应用的语言之一。同时,由于其开放性和可移植性,Python在跨平台应用、开源软件开发和云计算等领域也被广泛使用。
王瑞MVP
2023/08/14
5830
相关推荐
今日推荐:sha256-animation
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验