國密算法SM234 的python3實現
國家標准
GM/T 0002-2012 《SM4分組密碼算法》
GM/T 0003.1-2012 《SM2橢圓曲線公鑰密碼算法 第1部分:總則》
GM/T 0003.2-2012 《SM2橢圓曲線公鑰密碼算法 第2部分:數字簽名算法》
GM/T 0003.3-2012《SM2橢圓曲線公鑰密碼算法 第3部分:密鑰交換協議》
GM/T 0004-2012 《SM3密碼雜湊算法》
具體參見(http://www.oscca.gov.cn/)
算法比較
種類 | 算法類型 | 密鑰長度 | 輸入數據要求 | 輸出數據特征 |
---|---|---|---|---|
SM2 | 非對稱加密算法 | 公鑰64字節,私鑰32字節 | 長度小於(2^32-1)*32=137,438,953,440字節(大約1374億多) | 輸出長度是明文長度+96,有隨機數參數,每次密文不同 |
SM3 | 摘要算法 | -- | 無要求 | 固定長度,32字節 |
SM4 | 對稱加密算法 | 16字節 | 分組長度16字節,需要填充到16字節整數倍。有CBC和EBC兩種模式,CBC需要設定初始值 | 長度為16字節的整數倍 |
SM2算法介紹和實現
SM2橢圓曲線公鑰密碼算法
SM2標准包括總則,數字簽名算法,密鑰交換協議,公鑰加密算法四個部分,並在每個部分的附錄詳細說明了實現的相關細節及示例。
SM2算法主要考慮素域Fp和F2m上的橢圓曲線,分別介紹了這兩類域的表示,運算,以及域上的橢圓曲線的點的表示,運算和多倍點計算算法。然后介紹了編程語言中的數據轉換,包括整數和字節串,字節串和比特串,域元素和比特串,域元素和整數,點和字節串之間的數據轉換規則。
詳細說明了有限域上橢圓曲線的參數生成以及驗證,橢圓曲線的參數包括有限域的選取,橢圓曲線方程參數,橢圓曲線群基點的選取等,並給出了選取的標准以便於驗證。最后給橢圓曲線上密鑰對的生成以及公鑰的驗證,用戶的密鑰對為(s,sP),其中s為用戶的私鑰,sP為用戶的公鑰,由於離散對數問題從sP難以得到s,並針對素域和二元擴域給出了密鑰對生成細節和驗證方式。總則中的知識也適用於SM9算法。
在總則的基礎上給出了數字簽名算法(包括數字簽名生成算法和驗證算法),密鑰交換協議以及公鑰加密算法(包括加密算法和解密算法),並在每個部分給出了算法描述,算法流程和相關示例。
數字簽名算法,密鑰交換協議以及公鑰加密算法都使用了國家密管理局批准的SM3密碼雜湊算法和隨機數發生器。數字簽名算法,密鑰交換協議以及公鑰加密算法根據總則來選取有限域和橢圓曲線,並生成密鑰對。
算法的實現和測試
SM3算法介紹和實現
SM3雜湊算法
SM3密碼雜湊(哈希、散列)算法給出了雜湊函數算法的計算方法和計算步驟,並給出了運算示例。此算法適用於商用密碼應用中的數字簽名和驗證,消息認證碼的生成與驗證以及隨機數的生成,可滿足多種密碼應用的安全需求。在SM2,SM9標准中使用。
此算法對輸入長度小於2的64次方的比特消息,經過填充和迭代壓縮,生成長度為256比特的雜湊值,其中使用了異或,模,模加,移位,與,或,非運算,由填充,迭代過程,消息擴展和壓縮函數所構成。具體算法及運算示例見SM3標准。
SM3標准測試
SM4算法介紹和實現
SM4對稱算法
此算法是一個分組算法,用於無線局域網產品。該算法的分組長度為128比特,密鑰長度為128比特。加密算法與密鑰擴展算法都采用32輪非線性迭代結構。解密算法與加密算法的結構相同,只是輪密鑰的使用順序相反,解密輪密鑰是加密輪密鑰的逆序。
此算法采用非線性迭代結構,每次迭代由一個輪函數給出,其中輪函數由一個非線性變換和線性變換復合而成,非線性變換由S盒所給出。其中rki為輪密鑰,合成置換T組成輪函數。輪密鑰的產生與上圖流程類似,由加密密鑰作為輸入生成,輪函數中的線性變換不同,還有些參數的區別。SM4算法的具體描述和示例見SM4標准。
SM4算法實現
標准數據
測試結果