以下是使用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

如果输出中包含了与生成的密钥对相对应的参数和公钥信息,则说明生成的密钥对是正确的。

如何使用openssl sm2密钥的 der和pem进行转换请使用c语言

原文地址: https://www.cveoy.top/t/topic/OL5 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录