библиотека Openssl - работа с RSA (сохранение публичного ключа в переменную char buf[SIZE])

Модератор: Модераторы разделов

Аватара пользователя
Ardzhan
Сообщения: 57
ОС: Debian + WinXP на виртуалке

библиотека Openssl - работа с RSA

Сообщение Ardzhan »

Значит проблема в следующем:
key = RSA_generate_key(...) - генерирую ключ
PEM_write_RSAPublicKey(file, key,...) - записывает ключ в файл...

Мне нужно его не записывать в файл, а загонять в переменную типа char, для последующей передачи через сокет... Нужной мне функции к сожалению не нашел :(
Спасибо сказали:
Аватара пользователя
Marduk
Сообщения: 247

Re: библиотека Openssl - работа с RSA

Сообщение Marduk »

RSA public key имеет весьма сложную структуру - посмотрите на определение srtuct rsa_st (хоть фактически ключ RSA - произведение двух BIGNUM'ов). Не представляю, как Вы сможете преобразовать такой себе буфер char в структуру RSA public key на той стороне сокета. Так или иначе, нужной Вам функции в OpenSSL API действительно нет. Некрасивый способ - создать временной файл и считать его содержимое в буфер.
Еще один вариант - управлять созданием ключей RSA вручную, на более низком уровне - с помощью библиотеки BIGNUM'ов, openssl/bn.h, вроде следующего:

Код: Выделить всё

#include <openssl/bn.h>
typedef struct {
  BIGNUM        *n;
  unsigned long e; /* This number should generally be small. */
} RSA_PUBKEY;

typedef struct {
  BIGNUM *n;
  BIGNUM *d;  /* The actual private key. */

  /* These aren't necessary, but speed things up if used. If you do use them,
     you don't need to keep n or d around. */
  BIGNUM *p;
  BIGNUM *q;
  BIGNUM *dP, *dQ, *qInv;
} RSA_PRIVATE;

void spc_keypair_from_primes(BIGNUM *p, BIGNUM *q, unsigned long e,
                             RSA_PUBKEY *pubkey, RSA_PRIVATE *privkey)
{
  BN_CTX *x = BN_CTX_new(  );
  BIGNUM p_minus_1, q_minus_1, one, tmp, bn_e;

  pubkey->n  = privkey->n = BN_new(  );
  privkey->d = BN_new(  );
  pubkey->e  = e;
  privkey->p = p;
  privkey->q = q;

  BN_mul(pubkey->n, p, q, x);
  BN_init(&p_minus_1);
  BN_init(&q_minus_1);
  BN_init(&one);
  BN_init(&tmp);
  BN_init(&bn_e);
  BN_set_word(&bn_e, e);
  BN_one(&one);
  BN_sub(&p_minus_1, p, &one);
  BN_sub(&q_minus_1, q, &one);
  BN_mul(&tmp, &p_minus_1, &q_minus_1, x);
  BN_mod_inverse(privkey->d, &bn_e, &tmp, x);

  /* Compute extra values. */
  privkey->dP   = BN_new(  );
  privkey->dQ   = BN_new(  );
  privkey->qInv = BN_new(  );

  BN_mod(privkey->dP, privkey->d, &p_minus_1, x);
  BN_mod(privkey->dQ, privkey->d, &q_minus_1, x);
  BN_mod_inverse(privkey->qInv, q, p, x);
}

Если остановитесь на таком варианте, могу рассказать и о генерации больших случайных простых чисел p и q, которые передаются в качестве аргумента, средствами OpenSSL BIGNUM и теста Rabin-Miller :)
[ Arch Linux || xmonad || dzen2 ]
Спасибо сказали:
Аватара пользователя
Marduk
Сообщения: 247

Re: библиотека Openssl - работа с RSA

Сообщение Marduk »

Увидел, что для преобразования самого BIGNUM'а в char [] существуют следующие функции:

Код: Выделить всё

int       BN_bn2bin(const BIGNUM *a, unsigned char *to);
char *  BN_bn2hex(const BIGNUM *a);
char *  BN_bn2dec(const BIGNUM *a);

К сожалению, я не имел практики с PKI-алгоритмами в OpenSSL API, но мне кажется, что переход на более низкоуровненвые операции с BIGNUM'ми и эти функции позволят выполнить Вашу задачу.
[ Arch Linux || xmonad || dzen2 ]
Спасибо сказали:
Аватара пользователя
d_Sun
Сообщения: 291

Re: библиотека Openssl - работа с RSA

Сообщение d_Sun »

Код: Выделить всё


BIO bioMem;
char *cpPublicKey;
RSA *rsa;

bioMem = *( BIO_new ( BIO_s_mem() ) );

rsa = RSA_generate_key(...) - генерирую ключ

PEM_write_bio_RSAPublicKey ( &bioMem, rsa );

BIO_get_mem_data ( &bioMem, &cpPublicKey );


Вроде так :)
Моя подпись сильно длинная :)
Спасибо сказали:
Аватара пользователя
Ardzhan
Сообщения: 57
ОС: Debian + WinXP на виртуалке

Re: библиотека Openssl - работа с RSA

Сообщение Ardzhan »

d_Sun
Благодарю, все работает :D
Спасибо сказали: