SHA-256算法流程分析與詳解——Github工程結合示例和動畫演示

近日筆者在學習區塊鏈的相關知識,接觸到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 管理狀態…