CFW32C7UL系列SM2和SM4加解密算法详解 - 码灵半导体应用介绍

日期: 2025-03-22 23:03:45 |浏览: 34|编号: 83177

友情提醒:信息内容由网友发布,本站并不对内容真实性负责,请自鉴内容真实性。

CFW32C7UL系列SM2和SM4加解密算法详解 - 码灵半导体应用介绍

欢迎再次进入串行特殊主题“再次使用CFW32C7UL系列融化半导体的介绍”。通过引入CFW32C7UL系列Guomi算法SM3和True随机数生成器TRNG,我相信您对CFW32C7UL系列Guomi硬件模块有进一步的了解。今天,我们将继续在CFW32C7UL系列中推出另外两个非常重要的加密和解密算法:数据包加密算法SM4和非对称加密算法SM2。那么如何使用SM2和SM4国家秘密模块?他们加密和解密多快?考虑到这些问题,今天我们将详细介绍CFW32C7UL系列的SM2和SM4模块及其使用方法。

01

SM4分组算法模块

SM4是一种对称加密算法,这是一种无线LAN标准数据包数据算法,该算法是由州加密管理公司于2012年3月21日发布的。顾名思义,对称加密(也称为私钥加密)是指使用对加密和拆除相同密钥的加密算法。在两个操作中使用单个键使其成为一个简单的过程,因此称为“对称性”。对称加密算法的特征是它们开放到算法,较小的计算量,快速加密速度和高加密效率。与非对称加密算法相比,对称加密速度要快得多,需要更少的计算能力,也无需在Internet中放慢互联网。这意味着当加密数据量大时,对称加密是一个不错的选择。此外,类似的对称加密方法包括AES,RC4,DES,3DES,RC5,RC6,等。

SM4算法是一种数据包算法,该算法的长度为128位,密钥长度为128位。加密算法和关键扩展算法都采用了32轮非线性迭代结构。解密算法与加密算法具有相同的结构,只是使用轮键的使用顺序是相反的,而解密轮键是加密轮键的相反顺序。在CFW32C7UL系列的摩林半导体系列中,SM4算法是通过硬件实现的。

下面我们将详细介绍CFW32C7UL系列SM4算法的使用方法。

开发模式1:裸金属SDK

SM4算法流程图

①设置SM4键接口

void SM4_SETKEY(UINT32_T *键,UINT32_T *IVIN,UINT32_T模式,UINT8_T SWAP_EN,UINT8_T MASK_EN)

功能参数

Keyin:128位密钥指针

IVIN:CBC工作模式中的初始向量(使用CBC模式时需要配置)

模式:SM4模式选择

SWAP_EN:启用交换模式,即,小端的配置

mask_en:随机掩码启用

用法示例

sm4_setKey(key1,iv1_null,sm4_ecb_mode,sm4_swap_disable,sm4_mask_disable);

使用欧洲央行模式,未启用交换模式,未启用随机掩码,key1是键,iv1_null为空

②加密和解密接口

void sm4_drv_cpu(uint32_t *datain,uint32_t *dataout,uint32_t长度,uint8_t eng,uint8_t vsm4_en)

功能参数

数据:数据输入指针

数据输出:数据输出指针

长度:数据长度(长度=位长度\ 128)

ENC:加密/解密模式

VSM4_EN:启用伪SM4操作

用法示例

加密过程:

sm4_drv_cpu(平原,结果,1,sm4_encryption,sm4_vsm4_disable);

纯文本是普通的,输出密文是结果,数据长度为128位,未启用加密模式,未启用伪SM4操作

解密过程:

sm4_drv_cpu(结果,解密,1,sm4_decryption,sm4_vsm4_disable);

输入密文是结果,输出明文是解密的,数据长度为128位,未启用解密模式,未启用伪SM4操作

开发模式2:Linux SDK

通过Linux系统中的操作 /DEV /WOKOO_SM4,可以执行SM4数据包加密和解密算法。

sm4算法的基础接口

打开:打开设备节点

阅读:阅读加密和解密的数据

写:写需要加密和解密的关键数据和数据

IOCTL:启动加密和解密操作

②接口描述

打开:

函数原型:静态int uac_open(struct inode * inode,structfile * file)

参数:文件:文件名

返回值:成功,成功,其他失败

读:

功能原型:static ssize_t uac_read(struct File *文件,char__user *buffer,size_t size,loff_t *p)

参数:文件:文件名,缓冲区:读取数据缓存,大小:读取数据长度

返回值:成功,成功,其他失败

写:

函数原型:static ssize_t uac_write(struct File *文件,constchar __user *buf,size_t count,loff_t *ppos)

参数:文件:文件名,buf:写数据缓存,计数:写数据长度

返回值:成功,成功,其他失败

ioctl:

函数原型:静态长UAC_IOCTL(struct File *文件,UNSIGNEDINT CMD,unsigned long arg)

参数:文件:文件名,cmd:控制参数,arg:其他参数

返回值:成功,成功,其他失败

use示例

fd = open(“/dev/wokoo_sm4”,o_rdwr);打开SM4节点

写(fd,&sm4_data,sizeof(struct sm4_data_t));写纯文本/密码文字

ioctl(fd,sm4_dir_encrypt/sm4_dir_decrypt,null);选择加密/解密

读(fd,sm4_data.dataout,sizeof(sm4_data.dataout));读取加密/解密结果

CFW32C7UL系列SM4算法的效率

我们输入128KB的色

SM4接口加密操作(欧洲央行模式)

SM4接口解密操作(欧洲央行模式)

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

02

SM2公钥算法模块

SM2 is an asymmetric encryption algorithm and is an elliptic curve public key cryptography algorithm released by the State Cryptography Administration on December 17, 2010. In contrast to the symmetric encryption method, asymmetric encryption involves multiple keys, used for encryption and decryption of data, and is two different encryption keys mathematically related to each other, namely: a public key (referred to as public键)和一个私钥(称为私钥)。公钥和私钥是一对。如果数据使用公钥加密,则只能用相应的私钥将其解密。与对称加密相比,非对称加密需要更长,相对较慢的加密和解密,这更适合处理少量数据的应用程序场景。

SM2算法基于ECC椭圆曲线算法。 CFW32C7UL系列支持硬件PKI,ECC和DIV大型操作。同时,SM2算法是通过软件和硬件组合实现的。它是一种具有极高安全性和高效率的公钥算法。类似的算法,例如:RSA,Elgamal,背包算法,Rabin,DH,ECC等。

下面我们将介绍CFW32C7UL系列SM2算法的特定用法方法。

开发模式1:裸金属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:Ciphertext数据

Enddatalen:Ciphertext长度

普通:明文数据

平原:明文长度

pub_x:公钥坐标x

pub_y:公钥坐标y

用法示例

gm_sm2encrypt(&enddata [0],&enddatalen,plain,plainlen,public_keyx,public_keyy)

使用公共密钥public_key加密普通的普通并输出Ciphertext Enddata。

③SM2解密功能

gm_sm2decrypt(uint32_t *decdate,uint32_tdecdatelen,uint32_t *input,uint32_t inlen,uint32_t *pri_key)

功能参数

decdate:解密明文数据

Decdatelen:解密的清晰文本长度

输入:输入密文

inlen:输入密文的长度

PRI_KEY:私钥数据

用法示例

gm_sm2decrypt(&dedata [0],plainlen,enddata,enddatalen,prikey);

使用私有钥匙昂贵来解密密文的端data,并输出明文dedata。

开发模式2:Linux SDK

通过在Linux系统中的操作 /DEV /WOKOO_SM2,可以执行SM2加密和解密算法。

sm2算法的基础接口

打开:打开设备节点

阅读:阅读加密和解密的数据或私钥对或公共密钥对

写:写纯文本数据

IOCTL:设置是加密还是解密操作

②接口描述

打开:

函数原型:静态int uac_open(struct inode * inode,structfile * file)

参数:文件:文件名

返回值:成功,成功,其他失败

读:

功能原型:static ssize_t uac_read(struct File *文件,char__user *buffer,size_t size,loff_t *p)

参数:文件:文件名,缓冲区:读取数据缓存,大小:读取数据长度

返回值:成功,成功,其他失败

写:

函数原型:static ssize_t uac_write(struct File *文件,constchar __user *buf,size_t count,loff_t *ppos)

参数:文件:文件名,buf:写数据缓存,计数:写数据长度

返回值:成功,成功,其他失败

ioctl:

函数原型:静态长UAC_IOCTL(struct File *文件,UNSIGNEDINT CMD,unsigned long arg)

参数:文件:文件名,cmd:控制参数,arg:其他参数

返回值:成功,成功,其他失败

use示例

sm2_fd = open(“/dev/wokoo_sm2”,o_rdwr);打开SM2节点

ioctl(sm2_fd,sm2_dir_key,null);设置读取私钥和公共密钥对

读(sm2_fd,&sm2_data.prikey,sizeof(sm2_data.prikey) + sizeof(sm2_data.public_keyx) + sizeof(sm2_data.public_keyy));阅读私钥和公钥

写(sm2_fd,&sm2_data.plain,sizeof(sm2_data.plain));写纯文本/密码文字

ioctl(sm2_fd,sm2_dir_encrypt/sm2_dir_decrypt,null);选择加密/解密

读取(sm2_fd,&sm2_data.en_data,256);读取解密/解密结果

CFW32C7UL系列SM2算法的效率

03

选择加密算法

由于不对称加密算法的操作速度比对称加密算法的操作速度要慢得多,因此,当有必要加密大量数据时,建议使用对称加密算法来提高加密和解密速度。对称加密算法的关键管理是一个复杂的过程,密钥管理直接确定其安全性。因此,当数据量很小时,我们可以考虑使用不对称的加密算法。

由于对称加密算法无法实现签名,因此在签名时使用不对称算法。在实际操作中,我们通常采用的方法是使用不对称的加密算法来管理对称算法的键,然后使用对称加密算法对数据进行加密。通过这种方式,我们整合了两种类型的加密算法的优势,这不仅实现了快速加密速度的优势,而且还意识到了密钥安全管理的优势。

通过上述CFW32C7UL系列的SM2和SM4算法模块的介绍,我相信您对Guomi模块的使用有了更深入的了解。除了支持国家秘密算法外,QRIN半导体CFW32C7UL系列还支持常见的国际加密和解密算法,例如AES和SHA算法。这些算法也通过硬件实现。那么如何在CFW32C7UL系列中专门使用它们?让我们在下一期中探讨这些问题。

提醒:请联系我时一定说明是从铂牛网上看到的!