您的位置 首页 设计

一文看懂码灵半导体CFW32C7UL系列产品应用(二):国密算法●下篇

欢迎再次来到“码灵半导体CFW32C7UL系列产品应用介绍”连载专题。通过上期对CFW32C7UL系列国密算法SM3和真随机数发生器TRNG的介绍,相信您对CFW32C7UL系列国密硬件模块有了更进一

欢迎再次来到“码灵半导体CFW32C7UL系列产品运用介绍”连载专题。经过上期对CFW32C7UL系列国密算法SM3和真随机数发生器TRNG的介绍,信任您对CFW32C7UL系列国密硬件模块有了更进一步的了解。今日咱们持续介绍CFW32C7UL系列别的两个非常重要的加解密算法:分组加密算法SM4和非对称加密算法SM2。那么SM2和SM4国密模块又是怎么运用的?它们加解密的速度怎么呢?带着这些问题,今日咱们详细介绍下CFW32C7UL系列的SM2和SM4模块及其详细运用办法。

图片.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系列中是怎么详细运用呢?让咱们带着这些问题,鄙人期中去探寻吧。

本期作者:刘悦臻、梁梦雷、陈绍景、谢耀华、谢剑杰

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/sheji/114404.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部