Преобразование большого числа, заданного в виде строки, в OpenSSL BIGNUM

Я пытаюсь преобразовать строку p_str, представляющую большое целое число, в BIGNUM p, используя библиотеку OpenSSL.

#include <stdio.h>
#include <openssl/bn.h>

int main ()
{
  /* I shortened the integer */
  unsigned char *p_str = "82019154470699086128524248488673846867876336512717";

  BIGNUM *p = BN_bin2bn(p_str, sizeof(p_str), NULL);

  BN_print_fp(stdout, p);
  puts("");

  BN_free(p);
  return 0;
}

Скомпилировал с помощью:

gcc -Wall -Wextra -g -o convert convert.c -lcrypto

Но когда я его выполняю, я получаю следующий результат:

3832303139313534

person perror    schedule 06.05.2015    source источник


Ответы (1)


unsigned char *p_str = "82019154470699086128524248488673846867876336512717";

BIGNUM *p = BN_bin2bn(p_str, sizeof(p_str), NULL);

Вместо этого используйте int BN_dec2bn(BIGNUM **a, const char *str).

Вы должны использовать BN_bin2bn, когда у вас есть массив bytes (а не строка ASCII с нулевым завершением).

Справочные страницы находятся по адресу BN_bin2bn(3).

Правильный код будет выглядеть так:

#include <stdio.h>
#include <openssl/bn.h>

int main ()
{
  static const
  char p_str[] = "82019154470699086128524248488673846867876336512717";

  BIGNUM *p = BN_new();
  BN_dec2bn(&p, p_str);

  char * number_str = BN_bn2hex(p);
  printf("%s\n", number_str);

  OPENSSL_free(number_str);
  BN_free(p);

  return 0;
}
person jww    schedule 06.05.2015