【應用密碼學】實驗七 Hash函數——SM3

一、實驗要求與目的

  1. 理解哈希函數的基本原理及在密碼學中的應用;
  2. 掌握國密哈希標準 SM3 的算法結構;
  3. 編程實現 SM3 摘要算法,包括消息填充、消息擴展、壓縮函數及摘要輸出;
  4. 對中間變量 W、W′ 和 A~H 的迭代過程進行可視化,深入理解其內部機制。

二、實驗內容與步驟記錄(只記錄關鍵步驟與結果,可截圖,但注意排版與圖片大小)

SM3 是一種基于 Merkle-Damg?rd結構 的雜湊算法,其流程可分為以下五大步驟:

消息預處理(填充 + 分組),消息擴展(生成 W 和 W′),壓縮函數(A~H 迭代更新),狀態反饋(初始向量 XOR 當前結果),輸出摘要(256-bit)。所以我們分別對這些步驟進行設計

1.消息填充與分組處理

首先將輸入字符串轉換為二進制串,每個字符使用8位ASCII編碼表示。

按照 SM3 填充規則:在消息后添加一個 1;添加 k 個 0,使得 l + 1 + k ≡ 448 mod 512;在末尾添加原始長度 l 的 64-bit 表示;

最終使得填充結果為 512 的整數倍(本實驗為1組512位)。

2.消息擴展模塊實現

W0–W15:初始劃分

對每個 512bit 塊 Bi,按 32bit 為單位劃分為 16 個整數 W0?,W1?,...,W15?。

W16–W67:擴展計算

通過如下公式遞推生成:

Wj=P1(Wj?16⊕Wj?9⊕(Wj?3?15))⊕(Wj?13?7)⊕Wj?6(16?≤j?<?68)

其中 P1(x)=x⊕(x?15)⊕(x?23)

W′0–W′63 計算

Wj′=Wj⊕Wj+4(0≤j<64)

可視化輸出

實驗中通過 print_expansion() 函數輸出 W 與 W′ 的值(十六進制格式),驗證擴展邏輯正確性。

3.壓縮函數(64輪迭代)實現與輸出

根據國密標準設定初始寄存器 A~H:

A = 0x7380166F

B = 0x4914B2B9

C = 0x172442D7

...

H = 0xB0EB0E4E

每一輪(共64輪)執行如下操作:

SS1 = ROTL((ROTL(A, 12) + E + ROTL(Tj, j)) & 0xFFFFFFFF, 7)

SS2 = SS1 ^ ROTL(A, 12)

TT1 = (FF(A,B,C,j) + D + SS2 + W′[j]) & 0xFFFFFFFF

TT2 = (GG(E,F,G,j) + H + SS1 + W[j]) & 0xFFFFFFFF

然后更新:

mathematica

D = C, C = ROTL(B,9), B = A, A = TT1

H = G, G = ROTL(F,19), F = E, E = P0(TT2)

每輪后輸出一次 A~H 的狀態:

j=00 → A=8742F2C2 B=7380166F ...

j=01 → A=4C71DB3E B=8742F2C2 ...

這樣可跟蹤 A~H 的變化趨勢,驗證壓縮操作的動態過程。

4. 向量反饋與摘要輸出

64輪結束后,將當前 A~H 與前一狀態向量 V 進行逐位異或,形成新的向量:

V_next[i] = V[i] ^ current[i]? for i in 0..7

如果還有后續分組,則繼續迭代。

當所有分組處理完成后,V 就是最終的 SM3 雜湊值。拼接 A~H,輸出為 256bit 十六進制字符串:

66c7f0f462eeedd9d1f2d46bdc10e4e24167c4875cf2f7a2297da02b8f4ba8e0

該值與 SM3 標準樣例一致,驗證算法正確性。

三、源代碼記錄(關鍵代碼需備注)

# -------------- 基礎函數 ----------------#
def str_to_bin(msg: str) -> str:return ''.join(f'{ord(c):08b}' for c in msg)def padding_sm3(msg: str) -> str:m_bin = str_to_bin(msg)l = len(m_bin)m_bin += '1'k = (448 - (l + 1)) % 512m_bin += '0' * kl_bin = f'{l:064b}'m_bin += l_binreturn m_bindef left_rotate(x, n):n = n % 32return ((x << n) | (x >> (32 - n))) & 0xFFFFFFFFdef split_blocks(m_bin: str, block_size=512):return [m_bin[i:i + block_size] for i in range(0, len(m_bin), block_size)]def binstr_to_int_list(block_512bit: str):return [int(block_512bit[i:i + 32], 2) for i in range(0, 512, 32)]# -------------- 擴展函數 ----------------#
def P1(X):return X ^ left_rotate(X, 15) ^ left_rotate(X, 23)def P0(X):return X ^ left_rotate(X, 9) ^ left_rotate(X, 17)def message_expand(block_512bit: str):W = binstr_to_int_list(block_512bit)for j in range(16, 68):term = P1(W[j - 16] ^ W[j - 9] ^ left_rotate(W[j - 3], 15))term = term ^ left_rotate(W[j - 13], 7) ^ W[j - 6]W.append(term & 0xFFFFFFFF)W_ = [(W[j] ^ W[j + 4]) & 0xFFFFFFFF for j in range(64)]return W, W_def print_expansion(W, W_):print("=== W[0..67] ===")for i in range(68):print(f"W[{i:02}] = {W[i]:08X}")print("\n=== W′[0..63] ===")for i in range(64):print(f"W′[{i:02}] = {W_[i]:08X}")# -------------- 壓縮函數 ----------------#
def FF(X, Y, Z, j):return (X ^ Y ^ Z) if j < 16 else ((X & Y) | (X & Z) | (Y & Z))def GG(X, Y, Z, j):return (X ^ Y ^ Z) if j < 16 else ((X & Y) | (~X & Z))def CF(V, B):A, B_, C, D, E, F_, G, H = VW, W_ = message_expand(B)print("\n>>> [壓縮函數初始化] <<<")print(f"A={A:08X} B={B_:08X} C={C:08X} D={D:08X} E={E:08X} F={F_:08X} G={G:08X} H={H:08X}")for j in range(64):Tj = 0x79CC4519 if j < 16 else 0x7A879D8ASS1 = left_rotate((left_rotate(A, 12) + E + left_rotate(Tj, j)) & 0xFFFFFFFF, 7)SS2 = SS1 ^ left_rotate(A, 12)TT1 = (FF(A, B_, C, j) + D + SS2 + W_[j]) & 0xFFFFFFFFTT2 = (GG(E, F_, G, j) + H + SS1 + W[j]) & 0xFFFFFFFFD = CC = left_rotate(B_, 9)B_ = AA = TT1H = GG = left_rotate(F_, 19)F_ = EE = P0(TT2)print(f"j={j:02} → A={A:08X} B={B_:08X} C={C:08X} D={D:08X} E={E:08X} F={F_:08X} G={G:08X} H={H:08X}")print(">>> [壓縮函數結束] <<<")return [(v ^ n) & 0xFFFFFFFF for v, n in zip(V, [A, B_, C, D, E, F_, G, H])]# -------------- 哈希函數主控 ----------------#
def sm3_hash(msg: str, visual=True):IV = [0x7380166F, 0x4914B2B9, 0x172442D7, 0xDA8A0600,0xA96F30BC, 0x163138AA, 0xE38DEE4D, 0xB0EB0E4E]padded = padding_sm3(msg)blocks = split_blocks(padded)print("原始長度:", len(str_to_bin(msg)), "bits")print("填充后總長度:", len(padded), "bits")print("填充后分組數量:", len(blocks))print("填充結果前64位:", padded[:64])print("填充結果末64位:", padded[-64:])V = IV[:]for i, block in enumerate(blocks):print(f"\n>>> 第 {i} 塊 <<<")W, W_ = message_expand(block)if visual:print_expansion(W, W_)V = CF(V, block)digest = ''.join(f'{x:08x}' for x in V)print("\n最終 SM3 摘要為:")print(digest)return digest# -------------- 測試入口 ----------------#
if __name__ == "__main__":msg = "abc"  # 可以改為 input("請輸入消息: ")sm3_hash(msg)

四、實驗思考

1. SM3 摘要為什么不是最后一輪 A–H 值拼接?

SM3 采用 Merkle-Damg?rd 構架,每輪壓縮結束后必須將前一狀態 V 與當前 A–H 異或(XOR)。若直接使用 A~H 拼接會破壞反饋結構,易受長度擴展攻擊。因此摘要為:

digest=Vn=Vn?1[A,B,...,H]\text{digest} = V_n = V_{n-1} \oplus [A,B,...,H]digest=Vn?=Vn?1?[A,B,...,H]

2. SM3 SHA-256 的主要區別有哪些?

項目

SM3

SHA-256

分組長度

512 bit

512 bit

輸出長度

256 bit

256 bit

常量結構

輪常量分段不同

固定64個常量

置換函數

P0, P1

無(直接計算)

安全標準

國密標準 GM/T 0004-2012

國際標準 FIPS PUB 180-4

3. SM3 安全性基于什么?

SM3 作為哈希函數,其安全性包括抗碰撞性、抗第二原像性等,核心基于消息擴展、壓縮函數的非線性變換和 Merkle-Damg?rd 結構的累積性。目前無有效攻擊能在 2^128 復雜度下破壞 SM3 的抗碰撞性。

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

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

相關文章

進行性核上性麻痹護理之道:助力患者舒適生活

進行性核上性麻痹是一種緩慢進展的神經退行性疾病&#xff0c;主要影響患者的運動、語言和吞咽功能&#xff0c;給日常生活帶來諸多不便。除了遵醫囑接受藥物或物理治療&#xff0c;科學的健康護理對延緩病情發展、提升生活質量尤為重要。 運動康復是護理的關鍵環節。由于患者常…

5G 核心網中 NRF 網元的功能、接口及參數詳解

引言 在 5G 核心網的架構體系里,網絡存儲功能(Network Repository Function,NRF)占據著關鍵地位,承擔著核心網網絡功能(Network Function,NF)的注冊、發現以及服務管理等重要任務,為整個 5G 網絡的高效穩定運行提供了堅實支撐。接下來,讓我們深入剖析 NRF 網元在注冊…

HUAWEI交換機配置鏡像口驗證(eNSP)

技術術語&#xff1a; 流量觀察口&#xff1a;就是我們常說的鏡像口&#xff0c;被觀察的流量的引流目的端口 流量源端口&#xff1a;企業生產端口&#xff0c;作為觀察口觀察對象。 命令介紹&#xff1a; [核心交換機]observe-port [觀察端口ID或編號&#xff08;數字&am…

Spring AI Alibaba 發布企業級 MCP 分布式部署方案

作者&#xff1a; 影子&#xff0c;劉宏宇&#xff0c;劉軍 Spring AI 通過集成 MCP 官方的 java sdk&#xff0c;讓 Spring Boot 開發者可以非常方便的開發自己的 MCP 服務&#xff0c;把自己企業內部的業務系統通過標準 MCP 形式發布為 AI Agent 能夠接入的工具&#xff1b;…

Redis實戰-緩存篇(萬字總結)

前言&#xff1a; 今天結合黑馬點評這個項目&#xff0c;講下有關Redis緩存的一些內容&#xff0c;例如緩存更新策略&#xff0c;緩存穿透&#xff0c;雪崩和擊穿等。 今日所學&#xff1a; 什么是緩存緩存更新策略緩存穿透緩存雪崩緩存擊穿緩存工具封存 目錄 1.什么是緩存…

openFuyao開源發布,建設多樣化算力集群開源軟件生態

openFuyao 開源發布 隨著 AI 技術的高速發展&#xff0c;算力需求呈爆發式增長&#xff0c;集群已成為主流生產方式。然而&#xff0c;當前集群軟件生態發展滯后于硬件系統&#xff0c;面臨多樣化算力調度困難、超大規模集群軟件支撐不足等挑戰。這些問題的根源在于集群生產的…

深入理解 Redis 哨兵模式

Redis 哨兵模式深度解析&#xff1a;從原理到實踐的全流程指南 在分布式系統架構中&#xff0c;Redis 作為高性能的內存數據庫&#xff0c;其哨兵模式&#xff08;Sentinel&#xff09;是保障服務高可用性的核心方案。本文將從基礎概念、運行機制出發&#xff0c;結合具體配置…

HackMyVM-Find

信息搜集 主機發現 ┌──(root?kali)-[~] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:39:60:4c, IPv4: 192.168.43.126 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.43.1 c6:45:66:05:91:88 …

2025年滲透測試面試題總結-匿名[校招]安全服務工程師(題目+回答)

安全領域各種資源&#xff0c;學習文檔&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各種好玩的項目及好用的工具&#xff0c;歡迎關注。 目錄 匿名[校招]安全服務工程師 一面問題與完整回答 1. 學校、專業、成績與排名 2. 學習安全時長 3. 當前學習…

TopCode之手撕快排

題目鏈接 912. 排序數組 - 力扣&#xff08;LeetCode&#xff09; 題目解析 算法原理 使用數組分三塊的思想 i用來遍歷整個數組 left用來標記<key的邊界 right用來標記>key的邊界 然后i進行遍歷,數組就分成了四塊 [l,left]<key [left1,i-1]key [i,right-1]未…

bi軟件是什么?bi軟件是做什么用的?

目錄 一、BI 軟件是什么 1. 基本概念 2. 工作原理 二、BI 軟件是做什么用的&#xff1f; 1. 精準洞察市場趨勢 2. 優化企業戰略規劃 3. 輔助投資決策 三、如何選擇合適的 BI 軟件 1.功能匹配度 2.易用性和可擴展性 3.數據安全和穩定性 4.技術支持和服務 總結 生產…

11.14 LangGraph檢查點系統實戰:AI Agent會話恢復率提升287%的企業級方案

使用 LangGraph 構建生產級 AI Agent:LangGraph 持久化與記憶的"檢查點系統的實現" 關鍵詞:LangGraph 檢查點系統,多回合記憶,狀態持久化,會話恢復,AI Agent 容錯機制 1. 檢查點系統的核心價值 在復雜對話場景中,AI Agent 需要處理長達數十輪甚至數百輪的交…

鴻蒙完整項目-仿盒馬App(一)首頁靜態頁面

跟著鴻蒙小林博主&#xff0c;練習下項目~記錄下首頁的搭建,后續繼續完善和整體項目完成會進行布局修改&#xff0c;先按照博主的跟做&#xff0c;后續在改 1.分為底部整體框架搭建 2.首頁布局&#xff08;頂部搜索、新人專享、金剛區&#xff08;兩個不同集合數據&#xff09…

LINUX安裝運行jeelowcode后端項目(idea啟動)

參考 LINUX安裝運行jeelowcode后端項目&#xff08;命令行&#xff09;-CSDN博客 IntelliJ IDEA下載地址&#xff08;社區版、付費版&#xff09;-CSDN博客 軟件已安裝好&#xff0c;數據庫也初始化完畢。 步驟1&#xff1a;打開項目目錄步驟2&#xff1a;配置JDK步驟3&…

Web Vitals 核心指標快速掌握指南

Next.js 內置了對測量和報告性能指標的支持,我們可以通過 useReportWebVitals 鉤子自行管理報告。它會在應用的前端代碼開始之前運行,用于對應用進行全局分析、錯誤跟蹤以及性能監控。 本篇內容主要詳細介紹 6 個性能分析的指標,幫助我們更好的進行性能優化。 1. TTFB 定…

專業課復習筆記 10

感覺專業課就是考研的幾個科目里面難度最高的科目&#xff0c;我要好好加油&#xff0c;爭取拿下一百二十分。這個要是過不了線&#xff0c;考研基本廢完了。我感覺專業課練習題沒有說像是數學那么多練習題&#xff0c;反而是需要自己仔細去理解里面的知識&#xff0c;記住知識…

C語言 文件操作(2)

目錄 1.文件的順序讀寫 2.文件的隨機讀寫 3.文件讀取結束的判定 4.文件的緩沖區 1.文件的讀取順序 1.1 順序讀寫函數介紹 上面說的適用于所有輸入流一般指適用于標準輸入流和其他輸入流&#xff08;如文件輸入流&#xff09;&#xff1b;所有輸出流 一般指適用于標準輸出…

QGIS新手教程2:線圖層與多邊形圖層基礎操作指南(點線互轉、中心點提取與WKT導出)

QGIS新手教程&#xff1a;線圖層與多邊形圖層基礎操作指南&#xff08;點線互轉、中心點提取與WKT導出&#xff09; 目錄 QGIS新手教程&#xff1a;線圖層與多邊形圖層基礎操作指南&#xff08;點線互轉、中心點提取與WKT導出&#xff09;&#x1f4cc; 引言第一部分&#xff1…

Netty 框架介紹

1. Netty 框架介紹 Netty 是一個基于 Java NIO&#xff08;Non-blocking I/O&#xff09;的異步事件驅動網絡應用框架&#xff0c;旨在快速開發高性能、高可靠性的網絡服務器和客戶端。它簡化了 TCP/UDP 等協議的編程&#xff0c;并提供了高度可定制的組件&#xff0c;適用于高…

Eclipse 插件開發 5.2 編輯器 獲取當前編輯器

Eclipse 插件開發 5.2 編輯器 獲取當前編輯器 1 獲取活躍編輯器2 獲取全部編輯器 Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Click1 Bundle-SymbolicName: com.xu.click1;singleton:true Bundle-Version: 1.0.0 Bundle-Activator: com.xu.click1.Activato…