Openssl自1.1.1版本以后,提供了对SM2、SM3、SM4国密算法的支持。

首先创建一个EVP_CIPHER

在openssl中,SM4的cipher定义为EVP_sm4_*, ECB对应的是EVP_sm4_ecb, CBC对应的是EVP_sm4_cbc

EVP_CIPHER *cipher = NULL;
cipher = EVP_sm4_ecb();

这里创建的是ECB模式,所以采用EVP_sm4_ecb()

创建一个上下文

EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();

初始化上下文

EVP_CipherInit(ctx, cipher, key, iv, enc);

key对应密钥, iv对应初始化向量,ECB模式是没有的,所以ECB模式下,iv要设置为空,enc表示是加密还是解密,加密是1,解密是0。

设置填充模式

这一步是可选的,SM4是块加密的,要求数据必须是密钥长度的整数倍,否则就要进行填充。如果没有这一步,openssl默认采用PKCS的方式进行填充。

EVP_CIPHER_CTX_set_padding(ctx, pad);

pad对应填充模式,自己手工填充数据的话,需要设置为0。

加密解密数据

使用EVP_CipherUpdate加密解密数据,处理大数据时,可以多次循环调用

EVP_CipherUpdate(ctx, out, &out_len, in, inl);
total_len += out_len; 

EVP_CipherFinal输出数据的最后一部分

EVP_CipherFinal(ctx, out + total_len, &out_len);
total_len += out_len;

out保存的就是加密/解密的结果

本文结束。