Содержит ли закрытый ключ RSA, DSA или ECDSA в формате pem ключ publi c? - PullRequest
0 голосов
/ 25 февраля 2020

Я использую жесткие коды e c для проверки своего приложения. Вот пример для 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"
};

Он был сгенерирован с помощью утилиты s sh -keygen. Мне нужно преобразовать эти pem-строки в формат openssl EC_KEY, чтобы использовать его с функциями sign / verify 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_key и pem_ecdsa_pub_key. Должен ли я сделать это только для массива закрытых ключей, потому что он также содержит ключ publi c?

1 Ответ

1 голос
/ 25 февраля 2020

Вы загружаете ключ publi c точно таким же образом, но вы используете 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);

(обратите внимание, вы не нужно выделять EC_KEY первым при вызове PEM_read_bio_EC_PUBKEY или PEM_read_bio_ECPrivateKey)

Кроме того, закрытый ключ обычно содержит ключ publi c . Если вы загрузите закрытый ключ, вы можете использовать EC_KEY для всех случаев использования секретного ключа / publi c. Если вы загрузите ключ publi c, вы можете использовать его только для использования ключа publi c.

...