新聞中心

        EEPW首頁 > 嵌入式系統 > 牛人業話 > 一文看懂碼靈半導體CFW32C7UL系列產品應用(二):國密算法●下篇

        一文看懂碼靈半導體CFW32C7UL系列產品應用(二):國密算法●下篇

        作者:碼靈半導體 時間:2020-07-26 來源: 收藏

        歡迎再次來到“系列產品應用介紹”連載專題。通過上期對系列國密算法SM3和真隨機數發生器TRNG的介紹,相信您對系列國密硬件模塊有了更進一步的了解。今天我們繼續介紹CFW32C7UL系列另外兩個非常重要的加解密算法:分組加密算法SM4和非對稱加密算法SM2。那么SM2和SM4國密模塊又是如何使用的?它們加解密的速度如何呢?帶著這些問題,今天我們詳細介紹下CFW32C7UL系列的SM2和SM4模塊及其具體使用方法。

        本文引用地址:http://www.104case.com/article/202007/416176.htm

        圖片.png

        一、SM4分組算法模塊

        SM4屬于對稱加密算法,由國家密碼管理局于2012年3月21日發布的無線局域網標準的分組數據算法。顧名思義,對稱加密(也叫私鑰加密)指加密和解密使用相同密鑰的加密算法。對這兩個操作使用單個KEY使其成為一個簡單的過程,因此稱為“對稱”。對稱加密算法的特點是算法公開、計算量小、加密速度快、加密效率高。與非對稱加密算法相比,對稱加密的速度要快得多,需要的計算能力更少,在互聯網中不需降低互聯網速度。意味著,當加密的數據量很大時,對稱加密是一個不錯的選擇。另外同類的對稱加密方法還有AES,RC4,DES,3DES,RC5,RC6等。

        SM4算法是一個分組算法,該算法的分組長度為128比特,密鑰長度為128比特。加密算法與密鑰擴展算法都采用32輪非線性迭代結構。解密算法與加密算法的結構相同,只是輪密鑰的使用順序相反,解密輪密鑰是加密輪密鑰的逆序。在CFW32C7UL系列中SM4算法是通過硬件方式實現的。

        下面我們具體介紹下CFW32C7UL 系列SM4算法的使用方法。

        開發模式一:裸機SDK

        圖片.png

        SM4 算法流程圖

        ① 設置SM4密鑰接口

        void SM4_SetKey(uint32_t *keyin, uint32_t *ivin, uint32_t mode, uint8_t swap_en,uint8_t mask_en)

        函數參數

         keyin:128bit密鑰指針

         Ivin :CBC工作模式時的初始向量(使用CBC模式需要配置)

         mode :SM4模式選擇

          swap_en :SWAP模式使能, 即大小端配置

         mask_en :隨機掩碼使能

        使用范例

        SM4_SetKey(key1,iv1_null,SM4_ECB_MODE,SM4_SWAP_DISABLE,SM4_MASK_DISABLE);

        使用ECB模式,不使能SWAP模式,不使能隨機掩碼,key1為密鑰,iv1_null 為空

        ② 加解密接口

        void SM4_DRV_CPU(uint32_t *datain, uint32_t *dataout, uint32_t length, uint8_t enc, uint8_t vsm4_en)

        函數參數:

         Datain: 數據輸入指針

        Dataout:數據輸出指針

         Length :數據長度(length  =  bit長度 128)

         Enc: 加密/解密模式

          vsm4_en: 偽SM4運算使能

        使用范例

        加密過程:

        SM4_DRV_CPU (plain, result, 1, SM4_ENCRYPTION, SM4_VSM4_DISABLE);

        明文為plain,輸出的密文為result, 數據長度為128bit  ,加密模式,不使能偽sm4運算

        解密過程:

        SM4_DRV_CPU (result, decryp, 1, SM4_DECRYPTION,SM4_VSM4_DISABLE);

        輸入密文為result,輸出的明文為decryp, 數據長度為128bit,解密模式,不使能偽sm4運算

        開發模式二:Linux SDK

        通過操作linux系統中/dev/wokoo_sm4 ,就可以進行SM4分組加解密算法的運算。

        ① SM4算法底層接口

        open:打開設備節點

        read:讀取加解密后的數據

        write:寫入key數據和需要加解密的數據

        ioctl:啟動加解密操作

        ② 接口描述

        open:

        函數原型:static int uac_open(struct inode *inode, struct file * file)

        參數:file:文件名

        返回值:成功0,其它失敗

        read:

        函數原型:static ssize_t uac_read(struct file * file, char __user *buffer, size_t size , loff_t *p)

        參數:file:文件名,buffer:讀出數據緩存,size:讀出數據長度

        返回值:成功0,其它失敗

        write:

        函數原型:static ssize_t uac_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)

        參數:file:文件名,buf:寫入數據緩存,count:寫入數據長度

        返回值:成功0,其它失敗

        ioctl:

        函數原型:static long uac_ioctl(struct file *file, unsigned int cmd, unsigned long arg)

        參數:file:文件名,cmd:控制參數,arg:其它參數

        返回值:成功0,其它失敗

        ③ 使用示例

        fd = open("/dev/wokoo_sm4", O_RDWR);                                              打開sm4節點

        write(fd, &sm4_data, sizeof(struct sm4_data_t));                           寫入明文/密文

        ioctl(fd, SM4_DIR_ENCRYPT/ SM4_DIR_DECRYPT, NULL);           選擇加密/解密

        read(fd, sm4_data.dataout, sizeof(sm4_data.dataout));            讀出加密/解密的結果

        CFW32C7UL系列 SM4算法的效率

        我們通過輸入128KB明文數據,執行加解密運算后輸出加解密運算結果,并記錄下含接口數據傳輸的芯片工作時長,得到CFW32C7UL系列 SM4算法的效率。

        SM4接口加密運算(ECB模式)

        圖片.png

        SM4接口解密運算(ECB模式)

        圖片.png

        可以看到,CFW32C7UL系列的SM4算法效率可以達到64Mbps。

         

        二、SM2公鑰算法模塊

        SM2屬于非對稱加密算法,是國家密碼管理局于2010年12月17日發布的橢圓曲線公鑰密碼算法。與對稱加密方法相反,非對稱加密涉及多個密鑰,用于數據的加密和解密,是在數學上彼此相關的兩個不同的加密密鑰,即:公開密鑰(簡稱公鑰)和私有密鑰(簡稱私鑰)。公鑰與私鑰是一對,如果用公鑰對數據進行加密,只有用對應的私鑰才能解密。非對稱加密與與對稱加密相比,在加密和解密花費的時間更長、速度相對較慢,比較適合對少量數據處理的應用場景。

                 SM2算法是基于ECC橢圓曲線算法,CFW32C7UL系列支持硬件PKI,ECC,DIV大數運算,同時SM2算法是通過軟件與硬件相結合的方式實現,是一種安全性極高和效率極高的公鑰算法。同類算法如:RSA、Elgamal、背包算法、Rabin、D-H、ECC等。

        下面我們具體介紹下CFW32C7UL系列 SM2算法的具體使用方法。

        開發模式一:裸機SDK

        ① 產生密鑰對函數

        GM_GenSM2keypair(uint32_t prikey[],uint32_t *Q_X,uint32_t *Q_Y)

        函數參數:

        prikey: SM2私鑰數據

        Q_X  :公鑰 X坐標

        Q_Y  :公鑰 Y坐標

        使用范例

        GM_GenSM2keypair(prikey,public_keyX,public_keyY);

        生成并獲取私鑰prikey,公鑰(public_keyX,public_keyY)

        ② SM2加密函數

        GM_SM2Encrypt(uint32_t *encrydata,  uint32_t *endatalen,uint32_t *plain, uint32_t plainlen, uint32_t *pub_X,uint32_t *pub_Y)

        函數參數

         encrydata:密文數據

        endatalen:密文長度

        plain:明文數據

        plainlen:明文長度

        pub_X:公鑰坐標X

        pub_Y:公鑰坐標Y

        使用范例

        GM_SM2Encrypt(&endata[0],&endataLen,plain,plainlen,public_keyX,public_keyY)

        使用公鑰public_key 加密明文plain,輸出密文endata。

         

        ③ SM2解密函數

        GM_SM2Decrypt(uint32_t *DecDate, uint32_t DecDatelen,uint32_t *input , uint32_t inlen,uint32_t *pri_key )

        函數參數

         DecDate: 解密出來的明文數據

        DecDatelen: 解密出來的明文長度

        input: 輸入的密文

        inlen: 輸入的密文長度

        pri_key        : 私鑰數據

        使用范例

         GM_SM2Decrypt(&dedata[0], plainlen, endata, endataLen, prikey);

        使用私鑰 pricey 解密密文endata 輸出明文 dedata。

         

        開發模式二:Linux SDK

                 通過操作linux系統中/dev/wokoo_sm2 ,可以進行SM2加解密算法的運算。

        ① SM2算法底層接口

        open:打開設備節點

        read:讀取加解密后的數據或私鑰和公鑰對

        write:寫入明文數據

        ioctl:設置是加密還是解密操作

        ② 接口描述

        open:

        函數原型:static int uac_open(struct inode *inode, struct file * file)

        參數:file:文件名

        返回值:成功0,其它失敗

           read:

        函數原型:static ssize_t uac_read(struct file * file, char __user *buffer, size_t size , loff_t *p)

        參數:file:文件名,buffer:讀出數據緩存,size:讀出數據長度

        返回值:成功0,其它失敗

        write:

        函數原型:static ssize_t uac_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)

        參數:file:文件名,buf:寫入數據緩存,count:寫入數據長度

        返回值:成功0,其它失敗

        ioctl:

        函數原型:static long uac_ioctl(struct file *file, unsigned int cmd, unsigned long arg)

        參數:file:文件名,cmd:控制參數,arg:其它參數

        返回值:成功0,其它失敗

        ③ 使用示例

        sm2_fd = open("/dev/wokoo_sm2", O_RDWR);               打開sm2節點

        ioctl(sm2_fd, SM2_DIR_KEY, NULL);                                設置讀取私鑰和公鑰對

        read(sm2_fd, &sm2_data.prikey, sizeof(sm2_data.prikey) + sizeof(sm2_data.public_keyX) + sizeof(sm2_data.public_keyY));讀取私鑰和公鑰

        write(sm2_fd, &sm2_data.plain, sizeof(sm2_data.plain)); 寫入明文/密文

        ioctl(sm2_fd, SM2_DIR_ENCRYPT/ SM2_DIR_DECRYPT, NULL);    選擇加密/解密

        read(sm2_fd, &sm2_data.en_data, 256);                  讀取解密/解密結果

                 CFW32C7UL 系列SM2算法的效率

        圖片.png

        三、加密算法的選擇

        由于非對稱加密算法的運行速度比對稱加密算法的速度慢很多,當需要對大量的數據進行加密時,建議采用對稱加密算法,以提高加解密速度。對稱加密算法的密鑰管理是一個復雜的過程,密鑰的管理直接決定著他的安全性,因此當數據量很小時,我們可以考慮采用非對稱加密算法。

        因對稱加密算法不能實現簽名,因此簽名時使用非對稱算法。在實際的操作過程中,我們通常采用的方式是:采用非對稱加密算法管理對稱算法的密鑰,然后用對稱加密算法加密數據,這樣我們就集成了兩類加密算法的優點,既實現了加密速度快的優點,又實現了安全方便管理密鑰的優點。

        通過以上對CFW32C7UL系列 SM2和SM4算法模塊的介紹,相信您對國密模塊的使用有更深入的了解。碼靈半導體CFW32C7UL系列除了支持國密算法外,同樣也支持國際常見的通用加解密算法,如AES和SHA算法,這部分算法也是通過硬件實現。那么它們在CFW32C7UL系列中是如何具體使用呢?讓我們帶著這些問題,在下期中去探尋吧。

        本期作者:劉悅臻、梁夢雷、陳紹景、謝耀華、謝劍杰



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 资兴市| 疏勒县| 泽普县| 江源县| 德安县| 库车县| 陈巴尔虎旗| 固阳县| 巫溪县| 海伦市| 固镇县| 白山市| 新安县| 古丈县| 赞皇县| 毕节市| 华阴市| 山丹县| 定西市| 翁源县| 鄄城县| 东乌珠穆沁旗| 韶关市| 新河县| 峨边| 宁津县| 藁城市| 长垣县| 滦平县| 通海县| 永修县| 稻城县| 广州市| 静宁县| 怀安县| 通榆县| 屏南县| 安庆市| 于都县| 平阴县| 杭州市|