SHA-3算法詳解

SHA-3(Secure Hash Algorithm 3)是美國國家標準與技術研究院(NIST)于 2015 年發布的新一代密碼哈希算法標準,其核心基于比利時密碼學家團隊設計的Keccak 算法。SHA-3 的誕生旨在應對 SHA-1 和 SHA-2 系列算法可能面臨的未來安全威脅(如量子計算攻擊),并引入了全新的海綿結構(Sponge Construction),顯著提升了安全性和靈活性。

1?算法基本特性

參數

說明

輸出長度

支持 224、256、384、512 位(對應 SHA3-224/SHA3-256/SHA3-384/SHA3-512)

狀態大小

固定為 1600 位(5×5 的 64 位矩陣)

比特率(r)

不同輸出長度對應不同的消息塊大小:1152、1088、832、576 位

容量(c)

安全冗余位:448、512、768、1024 位(c = 1600 - r)

置換輪數

24 輪(每輪包含 5 個核心操作)

抗攻擊特性

對長度擴展攻擊免疫,理論抗碰撞強度為 22??次運算(SHA3-512)

并行能力

高度并行,適合硬件加速

2?核心設計原理:海綿結構

SHA-3 采用海綿結構替代傳統的 Merkle-Damg?rd 結構,其核心思想是通過 “吸收→置換→擠壓” 流程處理任意長度的輸入:

2.1 吸收階段(Absorbing)

  • 將輸入消息分塊(每塊長度為 r),依次與狀態矩陣的前 r 位異或。
  • 每異或一個消息塊后,應用Keccak-f 置換函數(24 輪復雜變換),將消息特征擴散到整個狀態矩陣。

2.2 擠壓階段(Squeezing)

  • 從狀態矩陣的前 r 位提取輸出,生成所需長度的哈希值。
  • 若輸出長度超過 r,重復應用 Keccak-f 置換并繼續提取,直至滿足需求。

2.3 與Merkle-Damg?rd 的區別

  • 抗長度擴展攻擊:海綿結構通過容量 c 隔離消息塊間的關聯性,避免攻擊者通過追加數據偽造哈希值。
  • 靈活性:可生成任意長度輸出(如 SHAKE128/SHAKE256 等擴展函數)。

3?詳細流程解析

3.1. 消息填充(Pad10*1 規則)

  • 步驟 1:在消息末尾添加二進制串 “011”(0x06)。
  • 步驟 2:補 0 直到總長度滿足?(原始長度 + 3 + k) ≡ 0 mod r。
  • 步驟 3:將最后一個字節的最高位置 1(即添加 “1”)。

示例:若原始消息為 575 位(SHA3-512 的 r=576 位),填充后變為 577 位(575+3+0+1),需拆分為兩個塊(576+1 位,但實際填充會補 0 至 576 位,最后一位補 1)。

3.2 狀態初始化

  • 狀態矩陣初始化為全 0 的 5×5×64 位立方體。

3.3 吸收階段

  • 分塊處理:將填充后的消息按 r 位分塊,依次與狀態矩陣的前 r 位異或。
  • Keccak-f 置換:每異或一個塊后,執行 24 輪置換,包括以下步驟:
  • θ(Theta):列間異或與循環移位,實現線性擴散。
  • ρ(Rho):對每個元素進行特定偏移量的循環右移。
  • π(Pi):行內元素位置置換,增強混淆。
  • χ(Chi):非線性變換(位級異或與取反),引入不可逆性。
  • ι(Iota):添加輪常數,打破對稱性。

3.4 擠壓階段

  • 從狀態矩陣的前 r 位提取輸出,若需要更多位,重復以下操作:
  • 應用 Keccak-f 置換。
  • 繼續提取 r 位,直至總長度達標。

4 Keccak-f 置換函數詳解

Keccak-f 是 SHA-3 的核心變換,每輪包含五個步驟:

4.1 θ 步驟(列擴散)

  • 計算列異或:對每列 5 個元素求和,再與相鄰列異或。
  • 循環移位:將結果循環右移 1 位,再次異或回原列。

4.2 ρ 步驟(元素旋轉)

每個元素按預設的偏移量(如第 (x,y) 元素旋轉 (x+1)(y+1) 位)進行循環右移。

4.3 π 步驟(行置換)

行內元素按固定置換表重新排列(如第 x 行的元素 y 移動到位置 (2x+3y) mod 5)。

4.4 χ 步驟(非線性變換)

對每行元素進行位級運算:
s[x][y] = s[x][y] ^ ((~s[x+1][y]) & s[x+2][y])
(其中 x+1、x+2 取模 5)

4.5 ι 步驟(輪常數注入)

與輪常數(RC [r])異或,RC [r] 由 LFSR 生成,每輪不同。

5 算法特點

安全性:

抗碰撞性:512 位輸出的理論抗碰撞強度為 22??次運算。

抗量子攻擊:海綿結構和復雜置換設計使其對 Grover 算法等量子攻擊具有更強抵抗力12。

靈活性:

支持任意輸出長度(如 SHAKE128 可生成 1KB 哈希值)。

兼容多種應用場景(哈希、消息認證碼、偽隨機數生成)。

高效性:

硬件實現簡單,支持并行計算,現代 CPU(如 Intel AVX2)可通過指令集優化加速。

6 應用場景

數據完整性校驗:

大型文件傳輸(如備份、分布式存儲)中校驗數據一致性。

密碼學協議:

TLS 1.3 協議中用于密鑰派生和消息認證1。

零知識證明、數字簽名等場景。

區塊鏈技術:

以太坊 2.0 采用 SHA3-256 生成賬戶地址和區塊哈希。

抗量子特性為未來區塊鏈安全提供保障12。

密碼存儲:

加鹽哈希存儲用戶密碼,防止彩虹表攻擊。

7?與 Keccak 的關系

SHA-3 是 Keccak 算法的標準化實例,但存在以下差異:

填充規則:SHA-3 使用 Pad10*1,而 Keccak 支持多種填充方式。

參數固定:SHA-3 的狀態大小固定為 1600 位,而 Keccak 允許自定義參數。

8?未來挑戰與應對

盡管 SHA-3 目前被認為是安全的,但其長期安全性仍需關注:

量子計算威脅:Grover 算法可將 SHA-3 的碰撞攻擊復雜度降低至√(2?12) = 22??次運算,與現有安全級別相當。

新型攻擊手段:需持續關注密碼分析進展,如差分攻擊、線性攻擊的變種。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/90323.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/90323.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/90323.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

前端筆記:同源策略、跨域問題

只有前端才會有跨域問題后端不受限制 一、什么是“同源策略”(Same-Origin Policy) ? 定義: 瀏覽器的 同源策略 是一種 安全機制,限制一個源的 JavaScript 訪問另一個源的資源,以防止惡意網站竊取用戶敏感信息。 ? “…

java通過com進行pdf轉換docx丟失

使用,通過com調用,發現pdf轉換成docx后,沒有看到docx輸出到指定目錄。直接說解決方案:關閉的保護模式即可,打開工具,編輯->首選項 找到安全性(增強),關閉啟動時啟用保護模式關閉后,docx正常輸…

SQL基礎? | 視圖篇

0 序言 本文將系統講解數據庫中視圖的相關知識,包括視圖的定義、作用、創建(單表、多表、基于視圖創建)、查看、更新、修改與刪除操作,以及視圖的優缺點。 通過學習,你能夠掌握視圖的基本概念,理解何時及如…

移動云×華為昇騰:“大EP+PD分離”架構實現單卡吞吐量跨越式提升!

在面向下一代AI基礎設施的關鍵技術攻關中,移動云與華為昇騰計算團隊深度協同,實現了大模型推理引擎的架構級突破。雙方基于昇騰AI基礎軟硬件平臺,針對DeepSeek大模型完成了大規模專家并行(Expert Parallelism,簡稱“大…

配電自動化終端中電源模塊的設計

配電自動化終端中電源模塊的設計 引言 配電終端設備的可靠性和自動化程度,直接影響到整個配電自動化系統的可靠性和自動化水平。由于配電終端設備一般安裝于戶外或比較偏僻的地方,不可能有直流電源提供,因此,配電網終端設備的直流供電方式成為各配網自動化改造中必須要研究…

性能測試-groovy語言1

課程:B站大學 記錄軟件測試-性能測試學習歷程、掌握前端性能測試、后端性能測試、服務端性能測試的你才是一個專業的軟件測試工程師 Jmeter之Groovy語言Groovy簡介為何性能測試中選擇Groovywindows下載Groovy進入官網配置環境變量Groovy的數據類型groovy的保留字字符…

天邑TY1613_S905L3SB_安卓9-高安非-高安版-通刷-TTL線刷固件包

天邑TY1613_S905L3SB_安卓9-高安非-高安版-通刷-TTL線刷固件包刷機說明:本固件為TTL刷機方式,需要準備如下工具;電烙鐵TTL線刷機優盤TTL接觸點位于處理器左側,從上往下數第二腳GND、3TXD、4RXD跑碼工具-【工具大全】-putty跑碼工具…

【硬件-筆試面試題】硬件/電子工程師,筆試面試題-7,(知識點:晶體管放大倍數計算)

目錄 1、題目 2、解答 3、相關知識點 晶體管的電流分配關系 直流電流放大系數\(\overline{\beta}\) 交流電流放大系數\(\beta\) 晶體管的放大條件 總結 【硬件-筆試面試題】硬件/電子工程師,筆試面試題匯總版,持續更新學習,加油&…

力扣-152.乘積最大子數組

題目鏈接 152.乘積最大子數組 class Solution {public int maxProduct(int[] nums) {int[] dpMax new int[nums.length]; //包括nums[i]的乘積最大值int[] dpMin new int[nums.length]; //包括nums[i]的乘積最小值int res nums[0];dpMax[0] nums[0];dpMin[0] nums[0];fo…

HTTP/1.0、HTTP/1.1 和 HTTP/2.0 主要區別

一句話總結 HTTP/1.0: 短連接,每次請求都需要建立一個新的 TCP 連接,性能較差。HTTP/1.1: 長連接,默認開啟 Keep-Alive,連接可復用,解決了 1.0 的大部分問題,是目前使用最廣泛的版本。HTTP/2.0: 二進制、多…

Navicat 17.3 正式發布 | 現已支持達夢、金倉和 IvorySQL 數據庫

🚀🚀🚀 Navicat 很高興地宣布:Navicat 17.3 版本正式發布。此次更新包含多項突破性功能,包括新增對達夢、金倉和 IvorySQL 等數據庫的支持,全面強化 AI 功能并新增阿里通義千問等 AI 大模型,同…

前端性能新紀元:Rust + WebAssembly 如何在瀏覽器中實現10倍性能提升(以視頻處理為例)

前端性能新紀元:Rust WebAssembly 如何在瀏覽器中實現10倍性能提升(以視頻處理為例) JavaScript,作為 Web 開發的基石,是動態的、靈活的,但在性能上,它也存在著天生的“軟肋”。對于那些計算密…

Web前端:JavaScript find()函數內判斷

🎯 find是什么?find() 是 JavaScript 數組(Array)提供的一個內置方法,用于在數組中查找第一個滿足條件的元素。簡單來說:它像偵探一樣遍歷數組,找到第一個符合條件的成員就返回它。?? 核心作用…

MySQL詳解三

MySQL詳解三事務ACID特性原子性一致性隔離性持久性事務的隔離級別讀未提交(Read Uncommitted)讀已提交(Read Committed)可重復讀(Repeatable Read)串行化(serializable)MVCC聚集索引的隱藏列read view鎖全局…

ABQ-LLM:用于大語言模型的任意比特量化推理加速

溫馨提示: 本篇文章已同步至"AI專題精講" ABQ-LLM:用于大語言模型的任意比特量化推理加速 摘要 大語言模型(LLMs)在自然語言處理任務中取得了革命性的進展。然而,其實際應用受到巨大的內存與計算開銷的限制…

kafka的shell操作

Kafka 提供了豐富的 shell 命令工具,位于 Kafka 安裝目錄的 bin/ 目錄下(Windows 系統為 bin/windows/)。這些命令用于管理主題、生產者、消費者、分區等核心組件。以下是常用的 Kafka shell 操作大全:一、主題(Topic&…

client-go: k8s選主

快速上手 下面這個代碼就是一個選主的大概邏輯 package mainimport ("context""flag""fmt"_ "net/http/pprof""os""path/filepath""time""golang.org/x/exp/rand"v1 "k8s.io/api/core/v…

為什么Java的String不可變?

為什么Java的String不可變? 場景: 你在開發多線程用戶系統時,發現用戶密碼作為String傳遞后,竟被其他線程修改。這種安全隱患源于對String可變性的誤解。Java將String設計為不可變類,正是為了解決這類核心問題。 1??…

在Ubuntu上使用QEMU學習RISC-V程序(1)起步第一個程序

文章目錄一、 引言二、 環境準備三、編寫簡單的RISC-V程序四、 編譯步驟詳解五、使用QEMU運行程序六、程序詳解七、退出QEMU八、總結附錄:QEMU中通過UTRA顯示字符工作原理1、內存映射I/O原理2、add.s程序工作流程3、關鍵指令解析4、QEMU模擬的UART控制器5、為什么不…

R擬合 | 一個分布能看到三個峰,怎么擬合出這三個正態分布的參數? | 高斯混合模型 與 EM算法

1. 效果已知數據符合上圖分布,怎么求下圖的三個分布的參數mu, sigma,及每個分布的權重 lambda? 2. 代碼: 高斯混合模型(Gaussian Mixture Model,簡稱GMM) library(mixtools) set.seed(123) # 確保結果可重復…