國密商用算法是指國密SM系列算法,包括基於橢圓曲線的非對稱公鑰密碼SM2算法、密碼雜湊SM3算法、分組密碼SM4算法,還有只以IP核形式提供的非公開算法流程的對稱密碼SM1算法等。
第1節 SM2非對稱密碼算法原理
國密SM2算法是商用的ECC橢圓曲線公鑰密碼算法,其具有公鑰加密、密鑰交換以及數字簽名的功能。橢圓曲線參數並沒有給出推薦的曲線,曲線參數的產生需要利用一定的算法產生。但在實際使用中,國密局推薦使用素數域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密碼雜湊算法原理
雜湊密碼算法又稱為哈希密碼算法或散列密碼算法,其可以將任意長度的字符串作為算法輸入,並輸出固定長度的字符串。當算法的結構設計足夠精妙復雜時,基本上可以做到對於任意輸入都有唯一確定的輸出與之對應,相反該輸出也可以唯一標識該輸入。
一般可以從兩個角度對雜湊算法安全性能進行評估:
1.計算不可逆性:即給定一輸入消息A的雜湊值H(A),要得到原消息A在計算上是不可行的; 2.抗碰撞性:即給定一消息B,找到消息B?使H(B)=H(B')在計算上是困難的。
網絡安全領域中,較為常用的雜湊算法主要有MD5、SHA-1以及SHA-256等,都具有良好的計算不可逆性以及抗碰撞性。但在2004年,由王小雲教授提出的雜湊碰撞算法,極大地降低了對MD5以及SHA-1算法實施碰撞攻擊的時間復雜度。
經過多年的研究,由王小雲教授主導設計的SM3雜湊密碼算法正式推出,該算法可以用於各類密碼應用中的數字簽名和驗證、消息認證碼的生成與驗證以及隨機數的生成,可滿足多種密碼應用的安全需求。
國密SM3商用密碼雜湊算法應用於數字簽名和驗證、消息認證碼的生成與驗證以及隨機數的生成,可滿足多種密碼應用的安全需求。對於長度為l(l<264)比特的信息,SM3雜湊算法經過填充和迭代壓縮,生成雜湊值,其雜湊值長度為256比特(32字節),其安全性與SHA256相當。
第3節 SM4分組密碼算法原理
國密SM4算法是一個對稱分組密碼算法,該算法的分組長度為16字節,密鑰長度也為16字節。加密算法與密鑰擴展算法都采用32輪非線性迭代過程,解密算法與加密算法的過程相同,只是輪密鑰的使用順序相反,解密輪密鑰是加密輪密鑰的逆序。SM4算法支持的四種加密模式如下表所示:
SM4 分組算法4種模式及安全MAC的算法標識如下表所示:
第4節 PYTHON實現
python實現代碼已上傳碼雲。
4.1 SM2測試截圖
python3實現的國密SM2+SM3,SM3包括KDF功能,可配合SM2加解密(SM2調用了SM3模塊)。SM2實現了各種素域下的簽名、驗簽和加解密功能。
截圖體現了SM2對“你好”的加解密過程。4.2 SM3測試截圖
python編寫的SM3密碼雜湊算法代碼。
對字符串abc、 abcd*16進行測試,結果如圖:
4.3 SM4測試截圖
python實現的國產加密sm4算法。
測試了ecb和cbc兩種模式:
第5節 遇到的問題與解決過程
5.1 問題一
python中出現Non-ASCII character '\xe7' in file sm2.py on line 6, but no encoding declare的錯誤。可按照錯誤建議網址查看http://www.python.org/peps/pep-0263.html,發現是因為Python在默認狀態下不支持源文件中的編碼所致。解決方案有如下三種:
1)在文件頭部添加如下注釋碼: # coding=<encoding name> 例如,可添加# coding=utf-8 2)在文件頭部添加如下兩行注釋碼: #!/usr/bin/python # -*- coding: <encoding name> -*- 例如,可添加# -*- coding: utf-8 -*- 3)在文件頭部添加如下兩行注釋碼: #!/usr/bin/python # vim: set fileencoding=<encoding name> : 例如,可添加# vim: set fileencoding=utf-8 :
5.2 問題二
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position 0: ordinal not in range(128) 產生原因:因為默認情況下,Python采用的是ascii編碼方式,而Python在進行編碼方式之間的轉換時,會將unicode 作為“中間編碼”,但unicode最大只有128那么長,所以這里當嘗試將ascii編碼字符串轉換成"中間編碼" unicode時由於超出了其范圍,就報出了如上錯誤。
有的解決辦法參見cnblogs、csdn。但具體我是換了python3.7版本直接運行通過的。
5.3 問題三
python模塊以及導入出現ImportError: No module named ‘xxx‘問題。
具體參見mamicode
python中,每個py文件被稱之為模塊,每個具有_init_.py文件的目錄被稱為包。只要模塊或者包所在的目錄在sys.path中,就可以使用import 模塊或import包來使用。
如果你要使用的模塊(py文件)和當前模塊在同一目錄,只要import相應的文件名就好,比如在a.py中使用b.py:
import b