【问题标题】:Does private RSA, DSA or ECDSA key in pem-format contain public key?pem 格式的私有 RSA、DSA 或 ECDSA 密钥是否包含公钥?
【发布时间】:2020-06-08 23:40:40
【问题描述】:

我使用硬编码的 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_KEY 格式以将其与签名/验证 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_keypem_ecdsa_pub_key 进行此转换。 我应该只对私钥数组执行此操作,因为它也包含公钥吗?

【问题讨论】:

    标签: openssl public-key ecdsa


    【解决方案1】:

    您以完全相同的方式加载公钥,但您使用 PEM_read_bio_EC_PUBKEY 而不是 PEM_read_bio_ECPrivateKey。

    例如

    /* 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);
    

    (注意,您不需要在 PEM_read_bio_EC_PUBKEY 或 PEM_read_bio_ECPrivateKey 调用中先分配 EC_KEY)

    另外,私钥通常包含public key。如果您加载私钥,您可以将 EC_KEY 用于所有私钥/公钥用途。如果您加载公钥,则只能将其用于公钥用途。

    【讨论】:

      猜你喜欢
      • 2013-05-07
      • 2023-02-07
      • 1970-01-01
      • 2011-11-24
      • 2015-04-18
      • 2010-09-23
      • 2018-11-25
      • 1970-01-01
      • 2018-07-19
      相关资源
      最近更新 更多