Почему BN_bn2bin и BN_bin2bn не дают мне один и тот же результат при применении к ключу RSA? - PullRequest
0 голосов
/ 26 марта 2020

Я пытаюсь создать ключ RSA (имеет тип BIGNUM), а затем превратить его в символ *, чтобы отправить его по каналу клиент-сервер, а затем снова превратить его в BIGNUM. Проблема в том, что когда я выполняю двойное приведение, я не получаю первоначальный результат. Я пытался смоделировать проблему с другим созданным мной BIGNUM, но, похоже, проблема только с ключом RSA. Вот код, который я использовал для тестов

RSA *rsa;

rsa = RSA_generate_key(2048, 65535, NULL, NULL);
if (RSA_check_key(rsa) != 1)
{
    printf("error");
}
const BIGNUM    *rsa_n = BN_new(), // modulul
    *rsa_e = BN_new(), // exponentul public
    *rsa_d = BN_new(); // exponentul privat
RSA_get0_key(rsa, &rsa_n, &rsa_e, &rsa_d);

//TEST 1
unsigned char* rsa_n_char = (unsigned char*)malloc(BN_num_bytes(rsa_n));
BN_bn2bin(rsa_n, rsa_n_char);
BIGNUM *rsa_n2=BN_new();
BN_bin2bn(rsa_n_char, strlen((char*)rsa_n_char) + 1, rsa_n2);
printf("%d\n", BN_cmp(rsa_n2, rsa_n)); // output -1 -> not equal

//TEST 2
unsigned char*test1_char = (unsigned char*)malloc(6);
test1_char = (unsigned char*)"apple";
BIGNUM *test1 = BN_new(), *test2 = BN_new();
BN_bin2bn(test1_char, strlen((char*)test1_char)+1, test1);

unsigned char*test2_char = (unsigned char*)malloc(BN_num_bytes(test1));
BN_bn2bin(test1, test2_char);
BN_bin2bn(test2_char, strlen((char*)test2_char)+1, test2);
printf("%d\n", BN_cmp(test1, test2)); // output 0 ->  equal

1 Ответ

1 голос
/ 26 марта 2020

У вас проблема здесь:

BN_bin2bn(rsa_n_char, strlen((char*)rsa_n_char) + 1, rsa_n2);

Функция strlen находит длину строки для печати, ища терминатор NUL (0 байт). Данные, хранящиеся в буфере, указанном rsa_n_char, не являются печатаемой строкой и не заканчиваются NUL. Это двоичные данные, которые могут даже содержать байт NUL (0). Вы не можете использовать strlen для таких данных.

Это работает во втором тесте, потому что двоичные данные, с которыми вы работаете, также могут быть печатаемой строкой.

...