如何使用openssl sm2密钥的 der和pem进行转换请使用c语言
以下是使用openssl库在c语言中进行sm2密钥的der和pem格式转换的示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <openssl/ec.h>
#include <openssl/evp.h>
#include <openssl/sm2.h>
#include <openssl/pem.h>
int main() {
// 生成SM2密钥对
EC_KEY *ec_key = EC_KEY_new_by_curve_name(NID_sm2);
if (ec_key == NULL) {
printf("Error: failed to create SM2 key\n");
return -1;
}
if (!EC_KEY_generate_key(ec_key)) {
printf("Error: failed to generate SM2 key\n");
EC_KEY_free(ec_key);
return -1;
}
// 将SM2私钥保存为DER格式
unsigned char *priv_key_der = NULL;
int priv_key_der_len = i2d_ECPrivateKey(ec_key, &priv_key_der);
if (priv_key_der_len <= 0) {
printf("Error: failed to convert SM2 private key to DER format\n");
EC_KEY_free(ec_key);
return -1;
}
FILE *priv_key_der_file = fopen("priv_key.der", "wb");
fwrite(priv_key_der, 1, priv_key_der_len, priv_key_der_file);
fclose(priv_key_der_file);
free(priv_key_der);
// 将SM2私钥保存为PEM格式
BIO *priv_key_pem_bio = BIO_new(BIO_s_mem());
if (PEM_write_bio_ECPrivateKey(priv_key_pem_bio, ec_key, NULL, NULL, 0, NULL, NULL) != 1) {
printf("Error: failed to convert SM2 private key to PEM format\n");
BIO_free(priv_key_pem_bio);
EC_KEY_free(ec_key);
return -1;
}
char *priv_key_pem = NULL;
int priv_key_pem_len = BIO_get_mem_data(priv_key_pem_bio, &priv_key_pem);
FILE *priv_key_pem_file = fopen("priv_key.pem", "wb");
fwrite(priv_key_pem, 1, priv_key_pem_len, priv_key_pem_file);
fclose(priv_key_pem_file);
BIO_free(priv_key_pem_bio);
// 将SM2公钥保存为DER格式
unsigned char *pub_key_der = NULL;
int pub_key_der_len = i2o_ECPublicKey(EC_KEY_get0_group(ec_key), EC_KEY_get0_public_key(ec_key), &pub_key_der);
if (pub_key_der_len <= 0) {
printf("Error: failed to convert SM2 public key to DER format\n");
EC_KEY_free(ec_key);
return -1;
}
FILE *pub_key_der_file = fopen("pub_key.der", "wb");
fwrite(pub_key_der, 1, pub_key_der_len, pub_key_der_file);
fclose(pub_key_der_file);
free(pub_key_der);
// 将SM2公钥保存为PEM格式
BIO *pub_key_pem_bio = BIO_new(BIO_s_mem());
if (PEM_write_bio_EC_PUBKEY(pub_key_pem_bio, ec_key) != 1) {
printf("Error: failed to convert SM2 public key to PEM format\n");
BIO_free(pub_key_pem_bio);
EC_KEY_free(ec_key);
return -1;
}
char *pub_key_pem = NULL;
int pub_key_pem_len = BIO_get_mem_data(pub_key_pem_bio, &pub_key_pem);
FILE *pub_key_pem_file = fopen("pub_key.pem", "wb");
fwrite(pub_key_pem, 1, pub_key_pem_len, pub_key_pem_file);
fclose(pub_key_pem_file);
BIO_free(pub_key_pem_bio);
// 释放资源
EC_KEY_free(ec_key);
return 0;
}
该程序将生成一个SM2密钥对,并将私钥和公钥分别保存为DER和PEM格式的文件。在运行程序后,您将在当前目录下找到以下四个文件:
- priv_key.der:私钥的DER格式文件。
- priv_key.pem:私钥的PEM格式文件。
- pub_key.der:公钥的DER格式文件。
- pub_key.pem:公钥的PEM格式文件。
您可以通过以下命令验证生成的SM2密钥对是否正确:
openssl ec -in priv_key.pem -text -noout
openssl ec -in pub_key.pem -pubin -text -noout
如果输出中包含了与生成的密钥对相对应的参数和公钥信息,则说明生成的密钥对是正确的。
原文地址: https://www.cveoy.top/t/topic/OL5 著作权归作者所有。请勿转载和采集!