swig的學習以及國密的python封裝

2021-06-14 10:39:32 字數 1972 閱讀 4297

最近在研究國密演算法,而我們主要是使用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兩項規範都引入...