国密SM3杂凑算法
在了解SM3算法之前,我們有必要了解一下單向散列函數。
1. 單向散列函數
單向散列函數 (one-way hash function)有很多名字:壓縮函數、收縮函數、消息摘要、指紋、密碼校驗和、信息完整性檢驗(Message Integrity Check,MIC)、操作檢驗碼(Manipulation Detection Code,MDC)。不管你怎么叫,它都是現代密碼學的中心。單向散列函數是許多協議的另一個結構模塊。
散列函數長期以來一直在計算機科學中使用,無論從數學或其他角度看,散列函數就是把可變長度輸入串(叫做預映射 ,pre-image)轉換成固定長度(經常更短)輸出串(叫做散列值 ,hash value)的一種函數。簡單的散列函數就是對預映射的處理,并且返回由所有輸入字節異或組成的字節。
這里的關鍵就是采集預映射的指紋:產生一個值,這個值能夠指出候選預映射與真實的預映射是否有相同的值。因為散列函數是典型的多到一的函數,所以不能用它來確定兩個串一定相同,但可用它來得到準確性的合理保證。
單向散列函數是在一個方向上運算的散列函數,從預映射的值很容易計算其散列值,但要使其散列值等于一個特殊值卻很難。前面提到的散列函數不是單向函數:已知一個特殊的字節值,要產生一個字節串使它的異或結果等于那個值是很容易的事情。用單向散列函數你不可能那樣做。好的散列函數也是無沖突的 (collision-free):難于產生兩個預映射的值,使它們的散列值相同。
散列函數是公開的,對處理過程不用保密。單向散列函數的安全性是它的單向性。其輸出不依賴于輸入。平均而言,預映射值單個位的改變,將引起散列值中一半位的改變。已知一個散列值,要找到預映射的值,使它的散列值等于已知的散列值在計算上是不可行的。
可把單向散列函數看做是構成指紋文件的一種方法。如果你想驗證某人持有特定的文件(你同時也持有該文件),但你不想讓他將文件傳給你,那么就要求他將該文件的單向散列值傳送給你。如果他傳送的散列值是正確的,那么幾乎可以肯定地說他持有那份文件。這在金融交易中非常有用,你不希望在網絡某個地方把提取100美元變成提取1000美元。一般情況下,應使用不帶密鑰的單向散列函數,以便任何人都能驗證散列值。
2.?什么是SM3算法
SM3算法是由我國著名的密碼學家王小云和國內其他專家共同設計的哈希算法,它只能用于加密而不能解密,是一種簡單的單向算法。SM3密碼雜湊算法是中國國家密碼管理局2010年公布的中國商用密碼雜湊算法標準,具體算法標準原始文本參見參考文獻[1]。該算法于2012年發布為密碼行業標準(GM/T 0004-2012),2016年發布為國家密碼雜湊算法標準(GB/T 32905-2016)?,F已廣泛應用于金融、交通、國家電網等重要經濟領域。
SM3適用于商用密碼應用中的數字簽名和驗證,是在SHA-256基礎上改進實現的一種算法,其,設計較為復雜,安全性較高。SM3和MD5的迭代過程類似,也采用Merkle-Damgard結構。SM3算法首先將輸入數據按照512位的大小分成若干組,最后一組不足512位時按規則填充至512位。經過多輪迭代壓縮后,輸出長度為256位的摘要值。
3. SM3算法的特性
- 輸入數據可以是文本、數字、字符、視頻等信息;
- 允許輸入較大長度數據,輸出長度數據256位,具有壓縮性;
- 輸入數據即使變化1位,輸出數據也將發生巨大變化,計算結果具有唯一性;
- 不能從輸出數據中反向推到原文數據,具有單向性/不可逆性。
4. SM3算法的用途
- 數字證書
- 數字簽名
- 生成偽隨機數
- 鑒權協議
- 加密口令
- 一次性口令生成
- 生成數據指紋
- 區塊鏈技術應用
5.SM3算法栗子
目前,bc庫已經提供了較多算法類型的摘要軟算法實現,這里舉個SM3摘要運算的栗子:
@Testpublic void sm3DigestTest(){try {String algorithm = "SM3";String message = "hello";Security.addProvider(new BouncyCastleProvider());MessageDigest digest = MessageDigest.getInstance(algorithm, BouncyCastleProvider.PROVIDER_NAME);byte[] bytes = digest.digest(message.getBytes(StandardCharsets.UTF_8));System.out.println(Base64.toBase64String(bytes));} catch (NoSuchAlgorithmException | NoSuchProviderException e) {e.printStackTrace();}}輸出:
vsu/quZUi4vwz8rVonGDzRvmCTsczszDA9nGHQpkUmg=
6. SM3算法原理
SM3密碼雜湊算法是中國國家密碼管理局2010年公布的中國商用密碼雜湊算法標準。具體算法標準原始文本參見參考文獻[1]。該算法于2012年發布為密碼行業標準(GM/T 0004-2012),2016年發布為國家密碼雜湊算法標準(GB/T 32905-2016)。
SM3適用于商用密碼應用中的數字簽名和驗證,是在SHA-256基礎上改進實現的一種算法,其,設計較為復雜,安全性較高。
SM3和MD5的迭代過程類似,也采用Merkle-Damgard結構。SM3算法首先將輸入數據按照512位的大小分成若干組,最后一組不足512位時按規則填充至512位。經過多輪迭代壓縮后,輸出長度為256位的摘要值。
SM3算法的執行過程可以概括成四個步驟:消息填充、消息擴展、迭代壓縮、輸出結果。
6.1?填充
SM3算法首先將輸入數據按照512位(64字節長度)的大小分成若干組,最后一組不足512位時按規則填充至512位。經過多輪迭代壓縮后,輸出長度為256位(32字節)的數值。
填充處理方式:
假設消息的長度為比特。首先將比特“1”添加到消息的末尾,再添加個“0”,是滿足 + 1 + ≡ 448? 512 的最小的非負整數。然后再添加一個64位比特串,該比特串是長度l的二進制表示。填充后的消息的比特長度為512的倍數。
例如:對于消息01100001 01100010 01100011,其長度l=24,填充操作流程如下:
- 在消息的尾部添加一位“1”
01100001 01100010 01100011 1
- 根據規范定義再添加個“0”,是滿足 + 1 + ≡ 448? 512 的最小的非負整數。
可以知道,我們需要再繼續在低位添加448 - 1- 24 = 423位?的?數字0
- 此時,填充數據是不滿足512位倍數的,需要再添加一個64位比特串,該比特串是長度l的二進制表示。填充后的消息的比特長度為512的倍數。
?輸入的消息m “01100001 01100010 01100011”,數據長度?= 24,轉為二進制表示為011000,然后對其高位補0操作
- 經填充得到比特串:
6.2?消息擴展
SM3的迭代壓縮步驟沒有直接使用數據分組進行運算,而是使用這個步驟產生的132個消息字。(一個消息字的長度為32位/4個字節/8個16j進制數字)概括來說,先將一個512位數據分組劃分為16個消息字,并且作為生成的132個消息字的前16個。再用這16個消息字遞推生成剩余的116個消息字。
在最終得到的132個消息字中,前68個消息字構成數列 {W j {W_j}Wj?},后64個消息字構成數列 {W j ‘ {W_j^`}Wj‘?},其中下標j從0開始計數。
詳細計算步驟可以看一下標準規范的定義:
6.3?迭代壓縮
在上文已經提過,SM3的迭代過程和MD5類似,也是Merkle-Damgard結構。但和MD5不同的是,SM3使用消息擴展得到的消息字進行運算。這個迭代過程可以用這幅圖表示:
初值IV被放在A、B、C、D、E、F、G、H八個32位變量中,其具體數值參見參考文獻[1]。整個算法中最核心、也最復雜的地方就在于壓縮函數。壓縮函數將這八個變量進行64輪相同的計算,一輪的計算過程如下圖所示:
圖中不同的數據流向用不同顏色的箭頭表示。
最后,再將計算完成的A、B、C、D、E、F、G、H和原來的A、B、C、D、E、F、G、H分別進行異或,就是壓縮函數的輸出。這個輸出再作為下一次調用壓縮函數時的初值。依次類推,直到用完最后一組132個消息字為止。
6.4?輸出結果
將得到的A、B、C、D、E、F、G、H八個變量拼接輸出,就是SM3算法的輸出。
- (大端big-endian)數據在內存中的一種表示格式,規定左邊為高有效位,右邊為低有效位。數的高階字節放在存儲。
參考:
- 《SM3密碼雜湊算法》
- SM3密碼雜湊算法原理簡述
總結
- 上一篇: 广州科源980tc数控系统说明书_广州数
- 下一篇: winrar分卷压缩_无广告的WinRA