openssl C语言sm2私钥pem 转der
以下是将 OpenSSL C语言中的 SM2 私钥 PEM 格式转换为 DER 格式的示例代码:
#include <stdio.h>
#include <string.h>
#include <openssl/evp.h>
#include <openssl/pem.h>
int main() {
EVP_PKEY *pkey;
FILE *pem_file, *der_file;
int pem_len, der_len;
unsigned char *pem_buf, *der_buf;
// 读取 PEM 格式的私钥文件
pem_file = fopen("private_key.pem", "rb");
if (!pem_file) {
printf("failed to open private_key.pem\n");
return 1;
}
pkey = PEM_read_PrivateKey(pem_file, NULL, NULL, NULL);
fclose(pem_file);
if (!pkey) {
printf("failed to read private key\n");
return 1;
}
// 将私钥转换为 DER 格式
der_len = i2d_PrivateKey(pkey, NULL);
der_buf = malloc(der_len);
if (!der_buf) {
printf("failed to allocate memory\n");
return 1;
}
pem_len = EVP_PKEY_get1_encoded(pkey, &pem_buf);
if (pem_len <= 0) {
printf("failed to encode private key\n");
return 1;
}
der_len = EVP_ASN1_object_size(0, pem_len, V_ASN1_SEQUENCE);
if (i2d_PrivateKey(pkey, &der_buf) != der_len) {
printf("failed to convert private key to DER format\n");
return 1;
}
// 将 DER 格式的私钥写入文件
der_file = fopen("private_key.der", "wb");
if (!der_file) {
printf("failed to open private_key.der\n");
return 1;
}
fwrite(der_buf, 1, der_len, der_file);
fclose(der_file);
printf("private_key.pem successfully converted to private_key.der\n");
EVP_PKEY_free(pkey);
free(der_buf);
return 0;
}
在上述示例代码中,我们使用 OpenSSL 库中的 PEM_read_PrivateKey 函数读取 PEM 格式的私钥文件,并使用 i2d_PrivateKey 函数将私钥转换为 DER 格式。最后,我们将 DER 格式的私钥写入文件。
注意,为了将 PEM 格式的私钥转换为 DER 格式,我们需要先将 PEM 格式的私钥编码为 ASN.1 DER 格式,再使用 i2d_PrivateKey 函数将其转换为 DER 格式。这是因为 PEM 格式的私钥实际上是由 base64 编码的 ASN.1 DER 格式数据和一些辅助信息组成的。在编码过程中,我们需要使用 EVP_PKEY_get1_encoded 函数将 PEM 格式的私钥解码为 ASN.1 DER 格式数据。另外,由于 DER 格式的私钥是由 ASN.1 SEQUENCE 对象和私钥数据组成的,因此我们需要使用 EVP_ASN1_object_size 函数计算 ASN.1 DER 格式数据的长度。
原文地址: https://www.cveoy.top/t/topic/bSqP 著作权归作者所有。请勿转载和采集!