最近在研究國密演算法,而我們主要是使用python來進行開發,所以就需要構建乙個國密的python模組。
國密演算法網上已經有很好的實現,筆者使用的是乙個參考xyssl實現的那個版本。因為這些版本都是c的,所以很容易將其擴充套件到python裡面,但是為了跟python自身的crypto的行為一致,需要將國密生成相應的class。譬如,python的hashlib的md5,使用方式如下:
md = hashlib.md5("123")
md.update("456")
print md.hexdigest()
mdcopy = md.copy()
print mdcopy.digest()
所以,對於類似的國密sm3演算法,我們擴充套件到python裡面,也應該提供如上的使用方式。
註冊乙個class到python,也不是一件很困難的事情,但是筆者覺得可以採用更簡單的方式,自然就考慮使用swig。
swig(需翻牆)可以算是將c、c++**生成到其他語言的乙個**生成器,
網上關於swig的學習介紹有很多,這裡筆者只是記錄一下寫python的國密擴充套件時候使用到的swig知識點。
以sm3來說,為了以class的方式在python裡面使用,我們首先需要在swig定義其class的template,如下:
class sm3
;
在python裡面使用的時候,我們可以使用如下方式建立乙個sm3物件:
md = sm3("1234567890")
可以看到,在python裡面,我們建立sm3物件只傳入了乙個引數,那麼怎麼對應c++裡面的這兩個(unsigned char*, int)呢?這裡,我們使用swig裡面的typemaps:
%typemap(in) (const unsigned char* input, int inputlen)
這裡,我們定義乙個in typemap,swig碰到這種typemap會將python裡的函式引數轉換成對應的c++引數。
對於sm3的digest以及hexdigest,python裡面如下:
print md.digest()
print md.hexdigest()
可以看到,在c++裡面,output是函式的引數,而在python裡面則是作為返回值。這裡,我們可以使用argout typemap來處理。
%typemap(in, numinputs = 0) unsigned char [any] (unsigned char temp[$1_dim0])
%typemap(argout) unsigned char [any]
這裡,我們需要注意幾個地方:
上述的實現,是參考multi_argument_typemaps裡面的很多例子,尤其是關於in buffer和out buffer的。
對於國密演算法,筆者這裡只使用了sm3和sm4,對於sm2來說,筆者認為太過複雜,還沒有較好的開源實現,同時筆者也沒有精力自己去寫乙個,如果有誰有好的實現,歡迎聯絡我,筆者樂意將其build進python模組裡去。
**pygmcrypto在這裡。直接使用python setup.py install進行安裝,使用如下:
from gmcrypto import sm4, sm3
md = sm4.new("1" * 16)
edata = md.encrypt("1" * 16)
ddata = md.decrypt(ddata)
md = sm3.new("123")
md.update("456")
md.hexdigest()
如果出現編譯不成功的情況,很有可能是生成的swig template問題,大家只需要在swig目錄下面make重新生成就可以了。swig的版本需要2.0以上。 國密庫崩潰的BUG
linux 下編譯 d代表編譯debug版本 config no shared d make make install 生成私鑰 gmssl genpkey algorithm ec pkeyopt ec paramgen curve sm2p256v1 pkeyopt ec param enc n...
強烈推薦的機器學習,深度學習課程以及python庫
張冰洋9 個月前 本著兩條原則推薦一波機器學習,深度學習的課程以及常用的庫 1.不建議報輔導班。不是因為我們不應該為學習知識付費,而是因為有更好的資源,而這些資源恰好免費。報輔導班學習浪費錢倒是次要的,主要是時間有限,所以我們要把最好的時間集中在最高效的事情上。以下課程均有中文字幕 1.機器學習 2...
國密演算法的應用場景
國密演算法的應用場景 國家密碼管理局推出的sm系列密碼演算法是為了從根本上擺脫我國對國外密碼技術的依賴,實現從密碼演算法層面掌控核心的資訊保安技術。隨著國密演算法推廣的延伸,金融領域引入sm2 sm3 sm4等演算法逐步替換原有的rsa ecc等國外演算法。現有銀聯銀行卡聯網 銀聯ic兩項規範都引入...