Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Достать Private Key из PEM с помощью OpenSSL  (Прочитано 2096 раз)
0 Пользователей и 1 Гость смотрят эту тему.
IgnisFatuus
Постоялец

ru
Offline Offline

« : 22-10-2015 15:23 » 

Есть у меня ключик шифрованный, в формате PEM :

Цитата
-----BEGIN ENCRYPTED PRIVATE KEY-----
MIGMMEAGCSqGSIb3DQEFDTAzMBsGCSqGSIb3DQEFDDAOBAiZKBa6lir0cAICCAAw
FAYIKoZIhvcNAwcECFkordr8L172BEg2KM+XtvB76gh1+lcdfhIDSo5v8KuQnkQh
/siMzmQ2/zrOUROSJnV9xhDHdplcr+09vvT+hyTxDt99zLEvhNRIwyRm2/FLuO0=
-----END ENCRYPTED PRIVATE KEY-----


Сделан он по алгоритму Key Algorithm: 1.2.643.2.2.19 - это гост.

Я хочу достать 32 байта ключа в виде массива - например uint8_t array[32];


я делаю так :

Код: (C++)
BIO* bo = BIO_new( BIO_s_mem() );
BIO_write( bo, cont.data(),strlen(cont.c_str()));
EVP_PKEY* pkey = 0;
PEM_read_bio_PrivateKey( bo, &pkey, 0, (void*)"password");
BIO_free(bo);
if(pkey == NULL) {
    std::cerr << "pkey == NULL " << std::endl;
    return -1;
}
 

Ключ в общем-то вычитан и я получаю
Код: (C)
 std::cerr << "pkey->type = " <<pkey->type << std::endl;

811.

А вот тут косяк - как из EVP_PKEY получить массив байт?
Записан
darkelf
Молодой специалист

ua
Offline Offline

« Ответ #1 : 22-10-2015 15:51 » 

Сорри, не занимался OpenSSL, но на поверхностный взгляд там что-то есть в pkey->pkey.ptr
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #2 : 22-10-2015 16:23 » 

https://holtstrom.com/michael/tools/hextopem.php

так ?


* Безымянный.png (59.71 Кб - загружено 351 раз.)
Записан

IgnisFatuus
Постоялец

ru
Offline Offline

« Ответ #3 : 22-10-2015 16:25 » 

Слишком рано начал бить тревогу.

в pkey.ptr ключа не было. Достал его вот таким макаром -


Код: (C)

BIGNUM *key;
key = gost_get0_priv_key(pkey);
 

где gost_get0_priv_key - это

Код: (C)
BIGNUM* connection::gost_get0_priv_key(const EVP_PKEY *pkey) {

     switch (EVP_PKEY_base_id(pkey))
         {
         case NID_id_GostR3410_94:
         {
         DSA *dsa = (DSA*)EVP_PKEY_get0((EVP_PKEY *)pkey);
         if (!dsa)
             {
             return NULL;
             }
         if (!dsa->priv_key) return NULL;
         return dsa->priv_key;
         break;
         }
         case NID_id_GostR3410_2001:
         {
         EC_KEY *ec = (EC_KEY *)EVP_PKEY_get0((EVP_PKEY *)pkey);
         const BIGNUM* priv;
         if (!ec)
             {
             return NULL;
             }
         if (!(priv=EC_KEY_get0_private_key(ec))) return NULL;
         return (BIGNUM *)priv;
         break;
         }
         }
     return NULL;
 }
 


в итоге


Код: (C)
memcpy(keyArray, key->d, 32);


Извините за беспокойство.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines