近日笔者在学习区块链的相关知识,接触到SHA-256算法,这里做一个知识梳理和总结。

强烈推荐大家自行去学习下面链接github上的工程,作者的动画演示和解释做的非常出色,逻辑非常清晰,B站搬运的对应的油管的讲解视频也放在下面,本文也是基于此github工程和作者学习过程的思路进行呈现。

github:

https://github.com/in3rsha/sha256-animation

B站讲解视频:

https://www.bilibili.com/video/BV1Jg411G7tc

ruby(windows)安装教程:

https://www.cnblogs.com/minisayo/p/14015747.html

可以先将github工程下载到本地,因为作者是用的ruby进行动画展示,所以需要再windows/Linux系统上安装ruby,之后在工程目录下调用ruby xxx.rb指令即可啦。

下面是整个工程的流程图,也对应着SHA-256算法的设计思路。

一、运算定义

为了后续分析思路与流程的连贯性,在这里先统一声明一下一些运算的定义,后续一些函数会直接对这些运算进行封装使用。

1、右移Right Shift (shr.rb)

这里的右移会产生两种结果,第一种结果是左侧移动完之后位为0,右侧被移走的位丢失,如上图所示SHR 32的操作,原数据为32位,在右移32位之后原数据都被右移丢失,剩下的左侧移动完的位全为0。

2、旋转右移Right Shift (rotr.rb)

这里要尤其注意和SHR右移的区别,观察演示图可以发现对于旋转右移而言数据组成了一个环形,移动位数只是改变位的绝对位置,并不会丢弃数据,所以原数据32位,再进行ROTR 32的操作实际上就是所有数据位旋转了一整圈,又回到了原来的位置。

3、异或XOR (xor.rb)

按位异或,0^0 = 0,1^0 = 1,0^1 = 1,1^1 = 0。

4、加法Addition (add.rb) 

这里和二进制加法一样,但是由于多个32位的数据相加,最终的存在着溢出的风险,因此最终的结果进行取模2*32将其约束在32位输出。

二、函数定义

第一部分的运算被封装组合起来就是这部分的函数,在这里先列出一些后续算法流程分析会用到的函数,读者可以先有个大概印象,后面第三部分算法流程分析的时候再回看也可以。

前四个函数使用希腊符号 Sigma(小写 σ,大写 Σ)命名。这些名称没有特殊含义,只是为了方便给一些组合运算命名。

1、σ0 (sigma0.rb)

σ0(x) = ROTR7(x) ^ ROTR18(x) ^ SHR3(x)

先分别计算ROTR 7位和ROTR18位和SHR 3位,再将三者异或

2、σ1 (sigma1.rb)

σ1(x) = ROTR17(x) ^ ROTR19(x) ^ SHR10(x)

先分别计算ROTR 17位和ROTR 19位和SHR 10位,再将三者异或

3、Σ0 (usigma0.rb)

Σ0(x) = ROTR2(x) ^ ROTR13(x) ^ ROTR22(x)

先分别计算ROTR 2位和ROTR 13位和ROTR 22位,再将三者异或

4、Σ1 (usigma1.rb) 

Σ1(x) = ROTR6(x) ^ ROTR11(x) ^ ROTR25(x)

先分别计算ROTR 6位和ROTR 11位和ROTR 25位,再将三者异或

5、Choice (ch.rb)

这个函数使用x位在y位和z位之间进行选择。如果x=1,则选择y位;如果x=0,则选择z位。

6、Majority (maj.rb)  

这个函数返回三位中的多数位。

7、常量Constants (constants.rb)

SHA-256 使用六十四个常量 Kt 来帮助在主哈希计算过程中混合比特。

首先计算前64个质数的立方根,然后取其小数部分乘2^32,将得到的常量作为Kt使用,其中t表示第t个质数运算后的结果。

这些立方根的小数部分是无理数(它们无限延伸),因此它们是用于常量的良好随机比特选择。这比使用特别选择的常量更好,因为这降低了哈希函数被设计成具有后门的可能。

三、算法流程分析 

在这里message的内容是可以自己指定的,我们以message = dyq 为例(在每个rb文件的开头可以自定义默认输入)

1、message.rb 

输入一个message字符串时,我们将每个字符转换为 ASCII 表中的对应数字。这些数字被转换为二进制,我们使用这些二进制数据作为哈希函数的输入。 

2、padding.rb

SHA-256 哈希函数以 512 位的block数据块为单位进行操作,因此所有消息都需要用零填充至最接近的 512 位的倍数,可以是512、1024等,这里先填充到448位,后64位预留出用来表示message的比特位数。

为了防止相似输入哈希到相同的结果,我们用 1 位将消息与零分隔开,并在填充的最后 64 位中包含消息的大小。 

以上这种用 1 分隔消息并在填充中包含消息大小的方法被称为 Merkle–Damgård 加强(MD 加强)。 

3、blocks.rb

消息经过填充后,我们将其切割成等长的 512 位消息块 Mi 以便哈希函数处理。

每个消息块也可以进一步分成 16 个词Wj ( 512 / 32 = 16 words ),每个词的长度为32bit,这将在后续使用。 

4、schedule.rb

 对于前16个word,每个word有32个bit,相当于是把原本的block0分为了32*16。

从第17个word开始根据下面的公式进行计算

Wt = σ1(Wt-2) + Wt-7 + σ0(Wt-15) + Wt-16

其中σ1和σ0在第二部分可以找到函数的定义。

5、expansion.rb

这一步展示的是上面最后一个word W63生成的运算过程。 

6、initial.rb

初始哈希值使用了前八个质数的平方根的小数部分。我们将这八个字母作为状态寄存器,我们可以将其作为开始哈希计算的起点(初始状态)

7、t1.rb t2.rb

我们需要先使用状态寄存器中的当前值来计算两个新的临时词( T1 和 T2 ),为后续的压缩过程做准备。

T1 = Σ1(e) + Ch(e, f, g) + h + Kt + Wt

其中Σ1和Ch函数在第二部分,h为h状态寄存器存储的值,Kt为第二部分的64个常数值,Wt为schedule.rb求得的word。

T2 = Σ0(a) + Maj(a, b, c)

其中Σ0函数和Maj函数均在第二部分。

8、compression.rb

压缩是整个算法的核心。我们再将其细化进行分析

(1) step1:计算出T1和T2

 (2) step2:所有寄存器下移一个

 (3) step3:更新a和e寄存器的值

以上三步可以概括为计算T1,T2;下移寄存器;更新a和e值,至此我们称为完成一轮压缩。这样的压缩要对一共64个word都进行一遍。

以上就是第二轮的step1开始以此类推。 

压缩完64轮之后,将最终的abcdefgh寄存器的值和initial.rb中的abcdefgh中的值相加得到最后的寄存器值

如果还有进一步要处理的消息块(block1,block2……),按照下图当前的哈希值将作为下一个压缩的初始哈希值。 

9、final.rb

 最终将8个32位的寄存器值转化为8个16进制的哈希值并拼接在一起,最终得到message的哈希值

 

使用哈希计算器验证一下是没问题的

10、sha256.rb 

# 直接进行哈希运算
ruby sha256.rb abc# 也可以输出二进制和十六进制数据
ruby sha256.rb 0b01100001
ruby sha256.rb 0xaabbccdd# 哈希一个文件 (请注意,文件末尾将有一个换行符)
ruby sha256.rb file.txt# 添加不同的命令行参数
ruby sha256.rb abc normal # 默认
ruby sha256.rb abc fast   # 加速演示
ruby sha256.rb abc enter  # 每按一次回车,步进一次动画

sha256.rb是一个集成上述功能的完整代码,除此之外,还可以指定命令行参数实现不同操作。

将sha-256.rd的输出改成可分为多个block的长message,测试多个block条件下hash算法 

观察以上代码运行后的结果发现,进行了多个block的流水线运算,最终的结果正确,真是太吊了。但是这里注意改变输入时不能直接在命令行输入段落,因为作者的代码中不能识别空格,所以只能在rb文件里改变input,但是也无伤大雅,笔者有时间会完善一下这个小bug的。

四、工程改进

主要是对于命令行输入参数这一块,因此笔者对于sha-256的功能进行完善,可以参考下面这篇文章哦~

https://blog.csdn.net/daviddou2022/article/details/149269550

新工程的github链接放下面了也。

https://github.com/daviddou2023/sha256-explanation

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/88706.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/88706.shtml
英文地址,请注明出处:http://en.pswp.cn/web/88706.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSPNet: A New Backbone that can Enhance Learning Capability of CNN (CSP模块)

3. Method 方法 3.1 Cross Stage Partial Network 跨阶段局部网络 3.1.1 Cross Stage Partial Network 跨阶段局部网络 3.1.1.1 ResNet 和 DenseNet 的优缺点主流的卷积神经网络(CNN)架构,如ResNet [8]、ResNeXt [37]、DenseNet [11]&#x…

前端学习4:小白入门注册表单的制作(包括详细思考CSS、JS实现过程)

这篇我们来做一个简单表单,即常见的注册页面吧~学习完这篇我们将学习到Input、label、CSS伪类、CSS入门、更多的JS操作等。。一、首先明确需求:直接模仿常见的注册页面,包括:用户名、Email、性别(单选按钮男/女&#x…

强化学习 (RL) 新突破:超越游戏,走向复杂现实决策

强化学习 (RL) 新突破:超越游戏,走向复杂现实决策 强化学习(Reinforcement Learning, RL)作为人工智能的核心范式之一,历经数十年的发展,正迎来一场深刻的范式转移。曾以战胜人类顶尖选手的Alph…

2025年6-7月AI领域关键进展:从药物研发到全球监管--AI深度融入产业与社会

2025年6月至7月,人工智能领域继续以惊人速度发展,在技术突破、行业应用、政策法规、企业战略及学术研究等方面取得了一系列重要里程碑。以下为关键动态:一、技术突破: AI向生命科学和认知科学纵深挺进DeepMind启动AI设计药物人体试…

【TOOL】ubuntu升级cmake版本

文章目录一、下载cmake脚本二、安装一、下载cmake脚本 在编译新工程时遇到cmake版本过低的情况,到 cmake官网 下载指定cmake安装脚本: 若需下载指定版本,见上图右上角蓝框。 二、安装 # 赋予可执行权限 sudo chmod x cmake-3.31.8-linux-x8…

GMSK调制解调系统的matlab性能仿真,对比维特比解调,1bit差分解调,2bit差分解调

目录 1.前言 2.算法运行效果图预览 3.算法运行软件版本 4.部分核心程序 5.算法仿真参数 6.算法理论概述 7.参考文献 8.算法完整程序工程 1.前言 GMSK(Gaussian Minimum Shift Keying,高斯最小频移键控)是一种连续相位调制技术,基于MSK调制改进而…

SQL138 连续两次作答试卷的最大时间窗

SQL138 连续两次作答试卷的最大时间窗 问题分析 找出2021年至少有两天作答的用户计算每个用户连续两次作答的最大时间窗基于历史数据预测在这个时间窗内平均会做多少套试卷 版本1 with-- 功能​:筛选2021年至少有两天作答的用户及其作答记录-- 子查询找出2021年…

TensorFlow2 study notes[2]

文章目录tf.autodiff.ForwardAccumulatorreferencestf.autodiff.ForwardAccumulator the function can be used to achieve the Computation of Jacobian-vector products with forward-mode autodiff. primals is variables need to watch.tangents is direction vector. …

稳定币将成为新时代的重要金融工具

在数字经济加速渗透的今天,加密货币作为一种新型价值载体,正深刻改变着全球金融的运作逻辑。其中,稳定币与非稳定币构成了加密货币生态的两大支柱,二者在设计逻辑、应用场景和市场表现上呈现出显著差异。 稳定币锚定法定货币 稳定币是一类以法定货币、大宗商品或其他资产…

Constants

本节是《Solidity by Example》的中文翻译与深入讲解,专为零基础或刚接触区块链开发的小白朋友打造。我们将通过“示例 解说 提示”的方式,带你逐步理解每一段 Solidity 代码的实际用途与背后的逻辑。 Solidity 是以太坊等智能合约平台使用的主要编程语…

五镜头倾斜摄影相机的技术优势与应用原理

倾斜摄影技术作为三维实景建模的核心手段,其硬件设计直接影响数据采集效率与模型质量。在众多镜头配置方案中,五镜头结构(下视前、后、左、右四个倾斜视角)已成为行业主流选择。这一设计并非偶然,而是基于严苛的技术需…

ThinkSound V2版 - 一键给无声视频配音,为AI视频生成匹配音效 支持50系显卡 一键整合包下载

ThinkSound 是阿里通义实验室开源的首个音频生成模型,它能够让AI像专业“音效师”一样,根据视频内容生成高度逼真、与视觉内容完美契合的音频。 ThinkSound 可直接应用于影视后期制作,为AI生成的视频自动匹配精准的环境噪音与爆炸声效&#x…

如何从0开始构建自己的第一个AI应用?(Prompt工程、Agent自定义、Tuning)

一、前言 从0开始基于自定义Agent构建AI应用,涉及从创建智能Agent到使用、测试及优化提示词等一系列步骤。前置:什么是LLM、Prompt、Mcp和Agent? 二、步骤一:规划和设计AI应用 在创建AI应用之前,你需要明确应用的目标…

Java ThreadLocal详解:从原理到实践

Java ThreadLocal详解:从原理到实践(图解极简示例) 一、什么是ThreadLocal?——线程的"专属储物柜" ThreadLocal 是 Java 提供的线程本地存储机制,通俗来说,它能为每个线程创建一个独立的变量副本…

如何在 Visual Studio Code 中使用 Cursor AI

在当今快节奏的开发环境中,像 Cursor AI 这样的 AI 工具正在彻底改变开发人员编写和管理代码的方式。Cursor AI 通过提供智能代码建议、自然语言编辑和多文件项目更新功能,增强了“ Visual Studio Code (VS Code )”的功能,所有这些功能均由 …

阿里面试:服务与发现 ,该选择 CP 还是 AP?为什么?

说在前面 最近有小伙伴拿到了一线互联网企业如微博、阿里、汽车之家、极兔、有赞、希音、百度、网易、滴滴的面试资格,遇到一几个很重要的面试题: 服务注册发现,该选 AP 还是 CP? 为什么? 最近有小伙伴在面 阿里。 小伙…

模拟实现Vue2-Vue3响应式更新

Vue2作为 MVVM框架/* Vue2 通过 Object.defineProperty 监听、挟持数据,实现响应式 并通过 Dep(依赖收集器) 和 Watcher 实现依赖收集,通知视图更新 *//* 但是 Vue2用Object.defineProperty 无法监听新增属性、无法监听数组索引变…

一文理解锂电池充电、过放修复与电量测量:从原理到实战

一、为什么要看这篇文章? 手机电量突然从20%跳到0%?电动车冬天续航腰斩?18650过放后还能救吗? 本文用一张思维导图一张表格一段口诀,一次性讲透锂电池的充电四阶段、过放修复全方案、电量测量底层原理,并给…

【爬虫】01 - 爬虫原理及其入门

爬虫01 - 爬虫原理及其入门 文章目录爬虫01 - 爬虫原理及其入门一:爬虫原理1:爬虫的优势‌2:爬虫的核心库3:经典举例4:合规问题一:爬虫原理 学习爬虫之前前置知识需要了解这些: 我的HTTP介绍, 了…

React对于流式数据和非流式数据的处理和优化

React 在处理流式数据和非流式数据时,可以借助其组件模型、状态管理以及 React 18 引入的并发特性来实现高效的数据处理与渲染优化。 文章目录一、流式数据(Streaming Data)1. 定义2. 常见来源3. 处理方式使用 useState / useReducer 管理状态…