openssl实践-SM4国密算法加密解密
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
保存的就是加密/解密的结果
本文结束。