國密算法實現

國密算法實現

1、國產密碼算法介紹

國產密碼算法(國密算法)是指國家密碼局認定的國產商用密碼算法,在金融領域目前主要使用公開的SM二、SM三、SM4三類算法,分別是非對稱算法、哈希算法和對稱算法。python

  • 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算法。安全

具體參見國家密碼局公佈的細則

地址:http://www.oscca.gov.cn/函數


具體實現

安裝了實驗環境

  • 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語言轉編譯而來,這樣的作法也開闊了本身的學習思路。

相關文章
相關標籤/搜索