Segfault на openssl RSA_public_encrypt () в C - PullRequest
0 голосов
/ 13 ноября 2018

Я пытался зашифровать тестовую строку, используя openssl RSA_public_encrypt, но это приводило к segfault при каждом запуске.

Я попытался проверить, является ли ключ RSA, который я читаю из файла pem, действительным, используя BIO, и он вернул открытый ключ с правильным ключом и размером экспоненты.

Я изначально пытался использовать PEM_read_bio_RSA_PUBKEY, но это не сработало. Я не совсем уверен в разнице между этим и PEM_read_bio_RSAPublicKey, так что если кто-то может пролить свет на это.

Кроме того, перед тем, как попробовать BIO, я использовал обычную структуру FILE и соответствующие ей функции, и она продолжала давать мне ошибки, и я не мог проверить, был ли загружен правильный ключ RSA. Не уверен, что это связано.

#include <stdio.h>
#include <string.h>
#include <openssl/pem.h>
#include <openssl/rsa.h>
#include <openssl/conf.h>

int main()
{

  RSA *rsa;
  rsa = RSA_new();
  BIO *bp_public = NULL;
  RSA *pubkey;
  bp_public = BIO_new_file("public.pem", "rt");
  pubkey = PEM_read_bio_RSAPublicKey(bp_public, &rsa, NULL, NULL);

  BIO * keybio = BIO_new(BIO_s_mem());
  RSA_print(keybio, rsa, 0);
  char buffer [2048];

  while (BIO_read (keybio, buffer, 2048) > 0)
    {
      printf("%s", buffer);
    }
  BIO_free(bp_public);
  if (pubkey == NULL || rsa == NULL)
    printf("Something went wrong");

  char msg[] = "Hello";
  unsigned char * encrypted = NULL;

  RSA_public_encrypt(5, (unsigned char *)msg, encrypted, rsa, RSA_PKCS1_OAEP_PADDING);

  printf("Here: %s", encrypted);
}

Кроме того, я пытался использовать оба ключа pubkey и rsa, но ни один из них не работал.

Я уверен, что упускаю что-то довольно очевидное, но я потратил часы на это и сейчас вроде как потерян в документах openssl.

Спасибо за помощь!

Неуместное примечание: зашифрованный текст возвращает ноль, если я использую RSA_private_encrypt()

Ответы [ 2 ]

0 голосов
/ 14 августа 2019

Проверьте, правильно ли вы управляете различными ресурсами Openssl. Часто бывают ограничения на то, что можно освободить. Своевременное освобождение ресурсов может вызвать ошибку в другом месте библиотеки.

0 голосов
/ 13 ноября 2018

С RSA_public_encrypt:

int RSA_public_encrypt(int flen, unsigned char *from,
   unsigned char *to, RSA *rsa, int padding);

RSA_public_encrypt() шифрует flen байт в (обычно это ключ сеанса) с использованием открытого ключа rsa и сохраняет зашифрованный текст в to. to должен указывать на RSA_size(rsa) байт памяти.

пока у вас есть to параметр как

unsigned char * encrypted = NULL;

Возможно, вам следует выделить для него RSA_size(rsa) байтов памяти:

unsigned char *encrypted = malloc(RSA_size(rsa));
...