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纯净版实现(不依赖任何库)

发布了347 篇原创文章 · 获赞 383 · 访问量 36万+

猜你喜欢

转载自blog.csdn.net/qq_19734597/article/details/104060941