C语言SM4算法实现(基于GMSSL)

Posted 张志翔 ̮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言SM4算法实现(基于GMSSL)相关的知识,希望对你有一定的参考价值。

最近项目中需要通过C语言实现SM2、SM4国密算法,这里我基于GMSSL来进行实现,已在5种环境下实现,并已使用在生产环境中。

1、GMSSL编译

GMSSL编译在不同环境下都不一样,这里我提供Window64、Arm64、Linux64、android、himix200海思芯片 环境编译方法,传送门如下:

Gmssl官网地址

Gmssl 各平台编译方法【绝对可用】

如果各位都是比较懒得人,我这里也给各位提供上述五种环境已经编好的库,传送门如下:

Gmssl链接库(himix200、android、arm64、linux64、windows64)

2、SM4实现

#include <openssl/sms4.h>

int main(void) 
    //加密参数初始化
    sms4_key_t sms4_key_enc;
    unsigned char *plain_text =  0 ;
    unsigned char *key = "01234567891234560123456789123456";
    unsigned char *iv = "0123456789123456";
    //SM4加密
    memcpy(sms4_key.rk, key, 32);
    sms4_set_encrypt_key(&sms4_key, iv);
    sms4_cbc_encrypt(plain_text, enc_text, 64, sms4_key_enc.rk, iv, 1);

    //解密参数初始化
    sms4_key_t sms4_key_decrypt;
    //SM4解密
    memcpy(sms4_key.rk, key, 32);
    sms4_set_decrypt_key(reinterpret_cast<sms4_key_t *>(sms4_key_decrypt->rk), iv);
    sms4_cbc_encrypt((uint8_t *) data, plaintext, 64, 
            reinterpret_cast<const sms4_key_t *>(sms4_key_decrypt->rk), iv, 0);
    return 0;

这里实现我写的是伪代码,主要就是注意三个函数 sms4_set_encrypt_key、sms4_set_decrypt_key、sms4_cbc_encrypt 就可以实现了。

SM4代码我已从GMSSL库中抽取出来,如果不想引入GMSSL库就实现SM4算法,可以直接使用以下代码(和使用库是一样的),传送门如下:

SM4纯净版实现(不依赖任何库)

开发者涨薪指南 48位大咖的思考法则、工作方式、逻辑体系

以上是关于C语言SM4算法实现(基于GMSSL)的主要内容,如果未能解决你的问题,请参考以下文章

国密gmssl介绍(SM2SM3SM4算法)

gmssl国密总结

Gmssl 各平台编译方法绝对可用

密码技术--国密SM4分组密码算法及Go语言应用

国密SM4算法加密解密实现以及与Spring Security集成实现

龙蜥白皮书精选:基于 SM4 算法的文件加密(fscrypt)实践