在铜锁中使用 SM2&SM3&SM4 算法的教程
铜锁提供了一系列API来支持应用程序使用 SM2,SM3 和 SM4 算 法。本文对这些用法进行整理,以方面用户更好的参考使用。
为了节省篇幅,头文件统一描述。
#include <openssl/evp.h>
#include <openssl/err.h>
#include <openssl/ec.h>
SM2
SM2 算法涉及的操作有:密钥生成、加密、解密、签名、验签
SM2密钥生成
SM2 的密钥是一个公私钥对,根据铜锁版本的不同,SM2 密钥对的生成也存在区别。铜锁中使用 EVP_PKEY 数据结构来表示一对 SM2 密钥,该结构同时存放 SM2 的私钥和公钥。
铜锁 8.3.x 和 8.2.x 系列
采用传统的 OpenSSL 风格的非对称密钥生成方式进行 SM2 的密钥生成
EVP_PKEY_CTX *sm2_ctx = NULL;
EVP_PKEY *sm2_key = NULL;
sm2_ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_EC, NULL);
if (sm2_ctx == NULL) {
/* 错误处理 */
}
if (!EVP_PKEY_keygen_init(sm2_ctx)) {
/* 错误处理 */
}
if (!EVP_PKEY_CTX_set_ec_paramgen_curve_nid(sm2_ctx, OBJ_sn2nid("SM2"))) {
/* 错误处理 */
}
if (!EVP_PKEY_keygen(sm2_ctx, &sm2_key)) {
/* 错误处理 */
}
if (!EVP_PKEY_set_alias_type(sm2_key, EVP_PKEY_SM2)) {
/* 错误处理 */
}
铜锁 8.4.x 系列
铜锁 8.4.0 提供了简易的 API 来实现 SM2 密钥对的生成
EVP_PKEY *sm2_key = NULL;
sm2_key = EVP_PKEY_Q_keygen(NULL, NULL, "SM2");
if (sm2_key == NULL) {
/* 错误处理 */
}
执行成功之后,就可以获得一个可在后续使用的 EVP_PKEY 结构。
此外,8.4.x 版本的铜锁,也兼容 8.3.x 和 8.2.x 版本的 SM2 密钥生成方式。