欢迎再次来到“码灵半导体CFW32C7UL系列产品运用介绍”连载专题。经过上期对CFW32C7UL系列国密算法SM3和真随机数发生器TRNG的介绍,信任您对CFW32C7UL系列国密硬件模块有了更进一步的了解。今日咱们持续介绍CFW32C7UL系列别的两个非常重要的加解密算法:分组加密算法SM4和非对称加密算法SM2。那么SM2和SM4国密模块又是怎么运用的?它们加解密的速度怎么呢?带着这些问题,今日咱们详细介绍下CFW32C7UL系列的SM2和SM4模块及其详细运用办法。
一、SM4分组算法模块
SM4归于对称加密算法,由国家暗码办理局于2012年3月21日发布的无线局域网规范的分组数据算法。望文生义,对称加密(也叫私钥加密)指加密宽和密运用相同密钥的加密算法。对这两个操作运用单个KEY使其成为一个简略的进程,因而称为“对称”。对称加密算法的特点是算法揭露、核算量小、加密速度快、加密功率高。与非对称加密算法比较,对称加密的速度要快得多,需求的核算才干更少,在互联网中不需下降互联网速度。意味着,当加密的数据量很大时,对称加密是一个不错的挑选。别的同类的对称加密办法还有AES,RC4,DES,3DES,RC5,RC6等。
SM4算法是一个分组算法,该算法的分组长度为128比特,密钥长度为128比特。加密算法与密钥扩展算法都选用32轮非线性迭代结构。解密算法与加密算法的结构相同,仅仅轮密钥的运用次序相反,解密轮密钥是加密轮密钥的逆序。在码灵半导体CFW32C7UL系列中SM4算法是经过硬件办法完成的。
下面咱们详细介绍下CFW32C7UL 系列SM4算法的运用办法。
开发形式一:裸机SDK
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形式)
SM4接口解密运算(ECB形式)
能够看到,码灵半导体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算法的功率
三、加密算法的挑选
因为非对称加密算法的运转速度比对称加密算法的速度慢许多,当需求对很多的数据进行加密时,主张选用对称加密算法,以进步加解密速度。对称加密算法的密钥办理是一个杂乱的进程,密钥的办理直接决议着他的安全性,因而当数据量很小时,咱们能够考虑选用非对称加密算法。
因对称加密算法不能完成签名,因而签名时运用非对称算法。在实践的操作进程中,咱们一般选用的办法是:选用非对称加密算法办理对称算法的密钥,然后用对称加密算法加密数据,这样咱们就集成了两类加密算法的长处,既完成了加密速度快的长处,又完成了安全便利办理密钥的长处。
经过以上对CFW32C7UL系列 SM2和SM4算法模块的介绍,信任您对国密模块的运用有更深化的了解。码灵半导体CFW32C7UL系列除了支撑国密算法外,相同也支撑世界常见的通用加解密算法,如AES和SHA算法,这部分算法也是经过硬件完成。那么它们在CFW32C7UL系列中是怎么详细运用呢?让咱们带着这些问题,鄙人期中去探寻吧。
本期作者:刘悦臻、梁梦雷、陈绍景、谢耀华、谢剑杰