<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 牛人業(yè)話 > 一文看懂碼靈半導(dǎo)體CFW32C7UL系列產(chǎn)品應(yīng)用(二):國(guó)密算法●下篇

          一文看懂碼靈半導(dǎo)體CFW32C7UL系列產(chǎn)品應(yīng)用(二):國(guó)密算法●下篇

          作者:碼靈半導(dǎo)體 時(shí)間:2020-07-26 來(lái)源: 收藏

          歡迎再次來(lái)到“系列產(chǎn)品應(yīng)用介紹”連載專題。通過(guò)上期對(duì)系列國(guó)密算法SM3和真隨機(jī)數(shù)發(fā)生器TRNG的介紹,相信您對(duì)系列國(guó)密硬件模塊有了更進(jìn)一步的了解。今天我們繼續(xù)介紹CFW32C7UL系列另外兩個(gè)非常重要的加解密算法:分組加密算法SM4和非對(duì)稱加密算法SM2。那么SM2和SM4國(guó)密模塊又是如何使用的?它們加解密的速度如何呢?帶著這些問(wèn)題,今天我們?cè)敿?xì)介紹下CFW32C7UL系列的SM2和SM4模塊及其具體使用方法。

          本文引用地址:http://www.ex-cimer.com/article/202007/416176.htm

          圖片.png

          一、SM4分組算法模塊

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

          SM4算法是一個(gè)分組算法,該算法的分組長(zhǎng)度為128比特,密鑰長(zhǎng)度為128比特。加密算法與密鑰擴(kuò)展算法都采用32輪非線性迭代結(jié)構(gòu)。解密算法與加密算法的結(jié)構(gòu)相同,只是輪密鑰的使用順序相反,解密輪密鑰是加密輪密鑰的逆序。在CFW32C7UL系列中SM4算法是通過(guò)硬件方式實(shí)現(xiàn)的。

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

          開(kāi)發(fā)模式一:裸機(jī)SDK

          圖片.png

          SM4 算法流程圖

          ① 設(shè)置SM4密鑰接口

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

          函數(shù)參數(shù)

           keyin:128bit密鑰指針

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

           mode :SM4模式選擇

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

           mask_en :隨機(jī)掩碼使能

          使用范例

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

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

          ② 加解密接口

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

          函數(shù)參數(shù):

           Datain: 數(shù)據(jù)輸入指針

          Dataout:數(shù)據(jù)輸出指針

           Length :數(shù)據(jù)長(zhǎng)度(length  =  bit長(zhǎng)度 128)

           Enc: 加密/解密模式

            vsm4_en: 偽SM4運(yùn)算使能

          使用范例

          加密過(guò)程:

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

          明文為plain,輸出的密文為result, 數(shù)據(jù)長(zhǎng)度為128bit  ,加密模式,不使能偽sm4運(yùn)算

          解密過(guò)程:

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

          輸入密文為result,輸出的明文為decryp, 數(shù)據(jù)長(zhǎng)度為128bit,解密模式,不使能偽sm4運(yùn)算

          開(kāi)發(fā)模式二:Linux SDK

          通過(guò)操作linux系統(tǒng)中/dev/wokoo_sm4 ,就可以進(jìn)行SM4分組加解密算法的運(yùn)算。

          ① SM4算法底層接口

          open:打開(kāi)設(shè)備節(jié)點(diǎn)

          read:讀取加解密后的數(shù)據(jù)

          write:寫入key數(shù)據(jù)和需要加解密的數(shù)據(jù)

          ioctl:?jiǎn)?dòng)加解密操作

          ② 接口描述

          open:

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

          參數(shù):file:文件名

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

          read:

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

          參數(shù):file:文件名,buffer:讀出數(shù)據(jù)緩存,size:讀出數(shù)據(jù)長(zhǎng)度

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

          write:

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

          參數(shù):file:文件名,buf:寫入數(shù)據(jù)緩存,count:寫入數(shù)據(jù)長(zhǎng)度

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

          ioctl:

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

          參數(shù):file:文件名,cmd:控制參數(shù),arg:其它參數(shù)

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

          ③ 使用示例

          fd = open("/dev/wokoo_sm4", O_RDWR);                                              打開(kāi)sm4節(jié)點(diǎn)

          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));            讀出加密/解密的結(jié)果

          CFW32C7UL系列 SM4算法的效率

          我們通過(guò)輸入128KB明文數(shù)據(jù),執(zhí)行加解密運(yùn)算后輸出加解密運(yùn)算結(jié)果,并記錄下含接口數(shù)據(jù)傳輸?shù)男酒ぷ鲿r(shí)長(zhǎng),得到CFW32C7UL系列 SM4算法的效率。

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

          圖片.png

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

          圖片.png

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

           

          二、SM2公鑰算法模塊

          SM2屬于非對(duì)稱加密算法,是國(guó)家密碼管理局于2010年12月17日發(fā)布的橢圓曲線公鑰密碼算法。與對(duì)稱加密方法相反,非對(duì)稱加密涉及多個(gè)密鑰,用于數(shù)據(jù)的加密和解密,是在數(shù)學(xué)上彼此相關(guān)的兩個(gè)不同的加密密鑰,即:公開(kāi)密鑰(簡(jiǎn)稱公鑰)和私有密鑰(簡(jiǎn)稱私鑰)。公鑰與私鑰是一對(duì),如果用公鑰對(duì)數(shù)據(jù)進(jìn)行加密,只有用對(duì)應(yīng)的私鑰才能解密。非對(duì)稱加密與與對(duì)稱加密相比,在加密和解密花費(fèi)的時(shí)間更長(zhǎng)、速度相對(duì)較慢,比較適合對(duì)少量數(shù)據(jù)處理的應(yīng)用場(chǎng)景。

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

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

          開(kāi)發(fā)模式一:裸機(jī)SDK

          ① 產(chǎn)生密鑰對(duì)函數(shù)

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

          函數(shù)參數(shù):

          prikey: SM2私鑰數(shù)據(jù)

          Q_X  :公鑰 X坐標(biāo)

          Q_Y  :公鑰 Y坐標(biāo)

          使用范例

          GM_GenSM2keypair(prikey,public_keyX,public_keyY);

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

          ② SM2加密函數(shù)

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

          函數(shù)參數(shù)

           encrydata:密文數(shù)據(jù)

          endatalen:密文長(zhǎng)度

          plain:明文數(shù)據(jù)

          plainlen:明文長(zhǎng)度

          pub_X:公鑰坐標(biāo)X

          pub_Y:公鑰坐標(biāo)Y

          使用范例

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

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

           

          ③ SM2解密函數(shù)

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

          函數(shù)參數(shù)

           DecDate: 解密出來(lái)的明文數(shù)據(jù)

          DecDatelen: 解密出來(lái)的明文長(zhǎng)度

          input: 輸入的密文

          inlen: 輸入的密文長(zhǎng)度

          pri_key        : 私鑰數(shù)據(jù)

          使用范例

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

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

           

          開(kāi)發(fā)模式二:Linux SDK

                   通過(guò)操作linux系統(tǒng)中/dev/wokoo_sm2 ,可以進(jìn)行SM2加解密算法的運(yùn)算。

          ① SM2算法底層接口

          open:打開(kāi)設(shè)備節(jié)點(diǎn)

          read:讀取加解密后的數(shù)據(jù)或私鑰和公鑰對(duì)

          write:寫入明文數(shù)據(jù)

          ioctl:設(shè)置是加密還是解密操作

          ② 接口描述

          open:

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

          參數(shù):file:文件名

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

             read:

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

          參數(shù):file:文件名,buffer:讀出數(shù)據(jù)緩存,size:讀出數(shù)據(jù)長(zhǎng)度

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

          write:

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

          參數(shù):file:文件名,buf:寫入數(shù)據(jù)緩存,count:寫入數(shù)據(jù)長(zhǎng)度

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

          ioctl:

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

          參數(shù):file:文件名,cmd:控制參數(shù),arg:其它參數(shù)

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

          ③ 使用示例

          sm2_fd = open("/dev/wokoo_sm2", O_RDWR);               打開(kāi)sm2節(jié)點(diǎn)

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

          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);                  讀取解密/解密結(jié)果

                   CFW32C7UL 系列SM2算法的效率

          圖片.png

          三、加密算法的選擇

          由于非對(duì)稱加密算法的運(yùn)行速度比對(duì)稱加密算法的速度慢很多,當(dāng)需要對(duì)大量的數(shù)據(jù)進(jìn)行加密時(shí),建議采用對(duì)稱加密算法,以提高加解密速度。對(duì)稱加密算法的密鑰管理是一個(gè)復(fù)雜的過(guò)程,密鑰的管理直接決定著他的安全性,因此當(dāng)數(shù)據(jù)量很小時(shí),我們可以考慮采用非對(duì)稱加密算法。

          因?qū)ΨQ加密算法不能實(shí)現(xiàn)簽名,因此簽名時(shí)使用非對(duì)稱算法。在實(shí)際的操作過(guò)程中,我們通常采用的方式是:采用非對(duì)稱加密算法管理對(duì)稱算法的密鑰,然后用對(duì)稱加密算法加密數(shù)據(jù),這樣我們就集成了兩類加密算法的優(yōu)點(diǎn),既實(shí)現(xiàn)了加密速度快的優(yōu)點(diǎn),又實(shí)現(xiàn)了安全方便管理密鑰的優(yōu)點(diǎn)。

          通過(guò)以上對(duì)CFW32C7UL系列 SM2和SM4算法模塊的介紹,相信您對(duì)國(guó)密模塊的使用有更深入的了解。碼靈半導(dǎo)體CFW32C7UL系列除了支持國(guó)密算法外,同樣也支持國(guó)際常見(jiàn)的通用加解密算法,如AES和SHA算法,這部分算法也是通過(guò)硬件實(shí)現(xiàn)。那么它們?cè)贑FW32C7UL系列中是如何具體使用呢?讓我們帶著這些問(wèn)題,在下期中去探尋吧。

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



          關(guān)鍵詞: 碼靈半導(dǎo)體 CFW32C7UL

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();