SM2算法的加密簽名消息語法規範(二)如何構造

既然是要構造國密規範的消息語法數據類型,那當然要用到gmssl庫咯。(GmSSL項目是OpenSSL項目的分支,並與OpenSSL保持接口兼容。因此GmSSL可以替代應用中的OpenSSL組件,並使應用自動具備基於國密的安全能力。)

1、引出問題

我們知道openssl中是已實現了RFC規範中的各種類型數據的定義。這些定義在gmssl中同樣存在。從之前的文章我們瞭解到國密規範的消息語法類型與RFC規範中的基本一致(主要是某些字段填入的數據存在差異),因此我們可以使用gmssl中的pkcs#7模塊的相關封裝接口來實現數據的封裝。

雖然可以使用但是若直接調用pkcs#7模塊去做的話,最後出來的數據肯定不符合國密規範,因爲OID不對呀。gmssl庫不支持GM/T0010規範中定義的OID。 那怎麼辦捏? 

也許有童鞋會說“那把OID改成國密規範中的OID呀”。 是的,可以改,因爲OID是類型標識符,並不參與實際的密碼運算。但是改完後就會發現DER編碼(i2d_PKCS7(...))會失敗。[○・`Д´・ ○]

查看gmssl源碼,可知pkcs7結構定義如下:

其內部有一個union(包含消息語法規範中的各類型),通過ASN1_OBJECT *type來指明當前內容是哪種類型。在進行DER編解碼時會根據type來選擇對應的數據結構進行序列化。而如果type被修改爲gmssl中不識別的值(例如國密規範的OID對應的值),就無法匹配到合適的類型,也就無法進行DER編解碼。

2、解決方案

目前解決方案有二(就小編目前的認知┐( ̄ヘ ̄)┌)。

方案一:修改gmssl源碼,添加對GM/T0010規範中OID的支持。(難度較高)

方案二:自定義asn1結構,然後通過gmssl的ASN庫對其進行編碼處理。

 

下面簡單介紹下方案二思路:(具體代碼就不太好帖出來了,因爲是公司同事的代碼,你懂的ㄟ( ▔, ▔ )ㄏ 

該方案主要是運用gmssl庫中的ANS.1(是一套靈活的標記語言)允許定義多種數據類型的特性來實現。也就是不用gmssl中已有的pkcs7結構,而是自定義結構(包含類型type以及消息數據類型data或PKCS7_ENVELOP或PKCS7_SIGN_ENVELPE等類型)。

a、用ASN.1語法自定義內部數據結構,並通過DECLARE_ASN1_FUNCTIONS聲明函數;

b、然後通過ASN.1宏實現自定義結構的最基本的四個函數(new, free, i2d, d2i);

更詳細的ASN.1庫DER編解碼步驟以及示例請參考https://www.cnblogs.com/aixiaoxiaoyu/articles/8304070.html

 

------------*✧⁺˚⁺ପ(๑・ω・)੭ु⁾⁾ 好好學習天天向上------------

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章