openssl C语言已知sm2私钥构建PEM私钥文件
以下是一个简单的示例代码,可以使用openssl库中的函数将已知的SM2私钥构建为PEM私钥文件:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/ec.h>
#include <openssl/bn.h>
#include <openssl/pem.h>
int main(int argc, char *argv[])
{
const char *sm2_privkey = "308193020100301306072a8648ce3d020106082a811ccf5501822d04793077020101"
"04208d98cb0a0b7a26b417be0f7c8c21a9b7a1f9f3b7a2e3c03e7f0a3c3d3dd2"
"dfb7a9ef57cc4b16f1218f6b4f91b4d4d24e7c59f8e81f9b9e9cf29f23ee8c8c"
"bb2c2f45f58a9c9a38e1d8b01a2b2fbb13c45d0b8f40b3f0f9a9c3a2d3d3b4a4"
"a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4"
"a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a"
"4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4"
"a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a"
"4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4"
"a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a"
"4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a"
"4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a"
"4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a"
"4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a";
EC_KEY *ec_key = NULL;
BIGNUM *bn_private = NULL;
BIO *bio_out = NULL;
EVP_PKEY *evp_key = NULL;
int ret = 0;
// 从十六进制字符串创建BIGNUM对象,即SM2私钥
bn_private = BN_new();
BN_hex2bn(&bn_private, sm2_privkey);
// 创建EC_KEY对象并设置私钥
ec_key = EC_KEY_new_by_curve_name(NID_sm2);
EC_KEY_set_private_key(ec_key, bn_private);
// 将EC_KEY对象转换为EVP_PKEY对象
evp_key = EVP_PKEY_new();
EVP_PKEY_assign_EC_KEY(evp_key, ec_key);
// 创建PEM格式输出流
bio_out = BIO_new_file("sm2_privkey.pem", "w");
if (bio_out == NULL) {
fprintf(stderr, "Error creating PEM output stream\n");
ret = -1;
goto cleanup;
}
// 将EVP_PKEY对象写入PEM格式输出流
if (PEM_write_bio_PrivateKey(bio_out, evp_key, NULL, NULL, 0, NULL, NULL) == 0) {
fprintf(stderr, "Error writing private key to PEM output stream\n");
ret = -1;
goto cleanup;
}
printf("PEM private key written to 'sm2_privkey.pem'\n");
cleanup:
// 释放资源
if (bio_out != NULL) {
BIO_free(bio_out);
}
if (evp_key != NULL) {
EVP_PKEY_free(evp_key);
}
if (bn_private != NULL) {
BN_free(bn_private);
}
return ret;
}
说明:
- 首先需要将已知的SM2私钥以十六进制字符串的形式保存在变量
sm2_privkey中。 - 使用openssl库中的函数将十六进制字符串转换为BIGNUM对象,即SM2私钥。
- 使用EC_KEY_new_by_curve_name()函数创建EC_KEY对象,并使用EC_KEY_set_private_key()函数设置私钥。
- 使用EVP_PKEY_new()函数创建EVP_PKEY对象,并使用EVP_PKEY_assign_EC_KEY()函数将EC_KEY对象转换为EVP_PKEY对象。
- 使用BIO_new_file()函数创建PEM格式输出流,然后使用PEM_write_bio_PrivateKey()函数将EVP_PKEY对象写入PEM格式输出流。
- 最后,关闭输出流并释放资源。
运行程序后,将生成名为 sm2_privkey.pem 的PEM格式私钥文件,其中包含已知的SM2私钥。
原文地址: https://www.cveoy.top/t/topic/bSuV 著作权归作者所有。请勿转载和采集!