Openssl pem格式的专用RSA、DSA或ECDSA密钥是否包含公钥?

Openssl pem格式的专用RSA、DSA或ECDSA密钥是否包含公钥?,openssl,public-key,ecdsa,Openssl,Public Key,Ecdsa,我使用硬编码的ec kyes来测试我的应用程序。 ecdsa有一个例子: const char pem_ecdsa_prv_key[] = { "-----BEGIN EC PRIVATE KEY-----\n" "MHcCAQEEIAGOaT3/9PJxSIFKPbvEhj61jY3CGPsgA46IVZlvIlnGoAoGCCqGSM49\n" "AwEHoUQDQgAE6Dw87+AYjRQzNsb3RmANmNENCZArERfCKZ5M9+2S/yomA6fmF

我使用硬编码的ec kyes来测试我的应用程序。 ecdsa有一个例子:

const char pem_ecdsa_prv_key[] = {
    "-----BEGIN EC PRIVATE KEY-----\n"
    "MHcCAQEEIAGOaT3/9PJxSIFKPbvEhj61jY3CGPsgA46IVZlvIlnGoAoGCCqGSM49\n"
    "AwEHoUQDQgAE6Dw87+AYjRQzNsb3RmANmNENCZArERfCKZ5M9+2S/yomA6fmFdeb\n"
    "XNXeV066Nk4jnuwF1ZKqCBoMBjsnm0jlCw==\n"
    "-----END EC PRIVATE KEY-----\n"
};

const char pem_ecdsa_pub_key[] = {
    "-----BEGIN PUBLIC KEY-----\n"
    "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE6Dw87+AYjRQzNsb3RmANmNENCZAr\n"
    "ERfCKZ5M9+2S/yomA6fmFdebXNXeV066Nk4jnuwF1ZKqCBoMBjsnm0jlCw==\n"
    "-----END PUBLIC KEY-----\n"
};
它是通过ssh keygen实用程序帮助生成的。 我需要将此pem字符串转换为openssl EC_密钥格式,以便将其与签名/验证openssl函数一起使用。 我这样做是因为省略了错误检查:

EC_KEY *ecdsa = NULL;
BIO *bio= NULL;

/* read pem string to openssl bio format */
bio = BIO_new_mem_buf(pem_ecdsa_prv_key,sizeof(pem_ecdsa_prv_key));

/* convert bio to ec_key */
ecdsa = EC_KEY_new();
PEM_read_bio_ECPrivateKey(bio, &ecdsa, NULL, NULL);
现在我对pem_ecdsa_prv_键和pem_ecdsa_pub_键进行转换。
我是否应该仅对私钥数组执行此操作,因为它也包含公钥?

加载公钥的方式与加载公钥的方式完全相同,但使用的是而不是PEM_read_bio_ECPrivateKey

e、 g

注意,在PEM_read_bio_EC_PUBKEY或PEM_read_bio_ECPrivateKey调用中,您不需要首先分配EC_密钥

此外,私钥通常包含。如果加载私钥,则可以将EC_密钥用于所有私钥/公钥用途。如果加载公钥,则只能将其用于公钥用途

/* read pem string to openssl bio format */
bio = BIO_new_mem_buf(pem_ecdsa_pub_key,sizeof(pem_ecdsa_pub_key));

/* convert bio to ec_key */
ecdsa = PEM_read_bio_EC_PUBKEY(bio, NULL, NULL, NULL);