國密算法實現
一、國產密碼算法介紹
國產密碼算法(國密算法)是指國家密碼局認定的國產商用密碼算法,在金融領域目前主要使用公開的SM2、SM3、SM4三類算法,分別是非對稱算法、哈希算法和對稱算法。
-
1.SM2算法:SM2橢圓曲線公鑰密碼算法是我國自主設計的公鑰密碼算法,包括SM2-1橢圓曲線數字簽名算法,SM2-2橢圓曲線密鑰交換協議,SM2-3橢圓曲線公鑰加密算法,分別用於實現數字簽名密鑰協商和數據加密等功能。SM2算法與RSA算法不同的是,SM2算法是基於橢圓曲線上點群離散對數難題,相對於RSA算法,256位的SM2密碼強度已經比2048位的RSA密碼強度要高。
- 橢圓曲線參數並沒有給出推薦的曲線,曲線參數的產生需要利用一定的算法產生。但在實際使用中,國密局推薦使用素數域256 位橢圓曲線,其曲線方程為y^2= x^3+ax+b(其中p是大於3的一個大素數,n是基點G的階,Gx、Gy 分別是基點G的x與y值,a、b是隨圓曲線方程y^2= x^3+ax+b的系數)。
-
2.SM3算法:SM3雜湊算法是我國自主設計的密碼雜湊算法,適用於商用密碼應用中的數字簽名和驗證消息認證碼的生成與驗證以及隨機數的生成,可滿足多種密碼應用的安全需求。為了保證雜湊算法的安全性,其產生的雜湊值的長度不應太短,例如MD5輸出128比特雜湊值,輸出長度太短,影響其安全性SHA-1算法的輸出長度為160比特,SM3算法的輸出長度為256比特,因此SM3算法的安全性要高於MD5算法和SHA-1算法。
-
3.SM4算法:SM4分組密碼算法是我國自主設計的分組對稱密碼算法,用於實現數據的加密/解密運算,以保證數據和信息的機密性。要保證一個對稱密碼算法的安全性的基本條件是其具備足夠的密鑰長度,SM4算法與AES算法具有相同的密鑰長度分組長度128比特,因此在安全性上高於3DES算法。
具體參見國家密碼局公布的細則
具體實現
安裝了實驗環境
-
python-3.6.5
工具
-
pycharm
SM2實現
python3實現的國密SM2+SM3,SM3包括KDF功能,可配合SM2加解密(SM2調用了SM3模塊)。SM2實現了各種素域下的簽名、驗簽和加解密功能。
SM3實現
SM3密碼雜湊算法的設計原理
SM3密碼雜湊算法的設計主要遵循以下原則:
- 能夠有效抵抗比特追蹤法及其他分析方法;
- 在保障安全性的前提下,綜合性能指標與SHA-256同等條件下相當.
(1)壓縮函數的設計原則
壓縮函數的設計具有結構清晰、雪崩效應強等特點,采用了以下設計技術:
- 消息雙字介人。輸人的雙字消息由消息擴展算法產生的消息字中選出。為了使介入的消息盡快產生雪崩效應,采用了模2^23算術加運算和P置換等
- 每一步操作將上一步介入的消息比特非線性迅速擴散,每一消息比特快速地參與進一步的擴散和混亂
- 采用混合來自不同群運算,模2^23算術加運算、異或運算、3元布爾函數和P置換
- 在保證算法安全性的前提下,為兼顧算法的簡介和軟硬件及智能卡實現的有效性,非線性運算主要采用布爾運算和算術加運算
- 壓縮函數參數的選取應使壓縮函數滿足擴散的完全性、雪崩速度快的特點
(2)消息擴展算法的設計
消息擴展算法將512b的消息分組擴展成2176b的消息分組。通過線性反饋移位寄存器來實現消息擴展,在較少的運算量下達到較好的擴展效果.消息擴展算法在SM3密碼雜湊算法中作用主要是加強消息比特之間的相關性,減小通過消息擴展弱點對雜湊算法的攻擊可能性。消息擴展算法有以下要求:
- 消息擴展算法滿足保墒性
- 對消息進行線性擴展,使擴展后的消息之間具有良好的相關性
- 具有較快的雪崩效應
- 適合軟硬件和智能卡實
SM4實現
SMS4算法的加密過程
1.讀入數據
2.計算輪密鑰中間變量
3.計算輪密鑰
4.SMS4算法第i+1輪加密
5.SMS4算法最終加密輸出
SM4 無線局域網標准的分組數據算法。對稱加密,密鑰長度和分組長度均為128位。
SM4分組密碼算法是我國自主設計的分組對稱密碼算法,用於實現數據的加密/解密運算,以保證數據和信息的機密性。要保證一個對稱密碼算法的安全性的基本條件是其具備足夠的密鑰長度,SM4算法與AES算法具有相同的密鑰長度分組長度128比特,因此在安全性上高於3DES算法。SM4 密碼算法基本運算有兩部分:
- 1.模2加:⊕,32比特異或運算
- 2.循環移位: <<< i ,把32位字循環左移i位
SM4基本密碼部件為
1非線性字節變換S盒(起混淆作用)
- S盒的置換規則:輸入的高半字節為行號,低半字節為列號,行列交叉點處的數據即為輸出。設輸入為 “5F”,則行號為5,列號為F,於是S盒的輸出值為表中第5行和第F列交叉點的值。
2 非線性字變換 τ:起混淆作用,具體為4個S盒並行置換,設輸入字 A=(a0,a1,a2,a3),輸出字B=(b0,b1,b2,b3),B = τ(A)=(S_box(a0), S_box(a1), S_box(a2), S_box(a3)
3 字線性部件 L變換: 起擴散作用
32位輸入,32位輸出。
設輸入為 B,輸出為C運算規則:
C=L(B)=B⊕(B<<<2)⊕((B<<<10)⊕(B<<<18) ⊕(B<<<24)
4 字合成變換 T:
由非線性變換 τ 和線性變換 L復合而成;
T(X) =L(τ(X))。(先S后L)
總結
此次實驗是小組實驗,對雖然在前期有了一定的python基礎,但是要真正的編程去實現一個完整、復雜的算法還是感覺有點困難,所以我們的代碼是在csdn中下載之后研究並做出一定修改。永健、孟亞和我每個人主要負責研究一個算法,之后在小組討論,對算法做自己的匯報,是整個小組都懂得實現機制。我負責的是sm4的實現,這部分代碼是由c語言轉編譯而來,這樣的做法也開闊了自己的學習思路。