Хэш в Bignum - без знака char[] в char *

Мне нужно экспортировать текущее значение хеша в BIGNUM. Я использую OpenSSL в C. Когда я пытаюсь выполнить эту операцию и печатаю содержимое h с помощью BN_print, я получаю 0 в качестве вывода. Как следует из фрагмента кода:

BIGNUM *h;
h = BN_new();
unsigned char hash[EVP_MAX_MD_SIZE];
unsigned hash_size = EVP_MAX_MD_SIZE;
EVP_DigestFinal_ex(hash_ctx, hash, &hash_size);
EVP_MD_CTX_free(hash_ctx);

// printing
for (unsigned n = 0; n < hash_size; n++) {
    printf("%02hhx", hash[n]);
}

BN_hex2bn(&h, hash);
printf("\n");
BN_print(bio_out, h);

Функция BN_hex2bn(BIGNUM **a, const char *str); принимает на вход указатель на BIGNUM и указатель на a const char. Нужно ли мне конвертировать его? Если да, то каким может быть лучший подход?

Хэш, вычисляемый OpenSSL, представляет собой необработанные произвольные биты; это не шестнадцатеричное число. Вы печатаете его в stdout в шестнадцатеричном формате, но значение в hash[] не изменяется и остается битовым. BN_hex2bn(,hash) читает и преобразует только действительный шестнадцатеричный код персонажи, и в большинстве случаев в начале hash[] их нет; иногда случайно есть один или очень редко несколько, поэтому время от времени вы можете получить преобразованное значение 1..15 или 16..255. Вместо этого используйте BN_bin2bn.

dave_thompson_085 09.04.2022 13:08

Отлично. Действительно, это работает с: BN_bin2bn(hash, hash_size, h);

CipherX 09.04.2022 13:40
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
1
2
23
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

BN_hex2bn принимает текстовое представление значения. Вы должны преобразовать хэш в текстовое представление в шестнадцатеричном формате:

unsigned char hash[EVP_MAX_MD_SIZE];
unsigned hash_size = EVP_MAX_MD_SIZE;
EVP_DigestFinal_ex(hash_ctx, hash, &hash_size);
EVP_MD_CTX_free(hash_ctx);

// hex conversion
unsigned char hash_text[2 * EVP_MAX_MD_SIZE + 1];
static char const hexdigits[16] = "0123456789abcdef";
for (unsigned n = 0; n < hash_size; n++) {
    hash_text[2 * n + 0] = hexdigits[hash[n] >> 4];
    hash_text[2 * n + 1] = hexdigits[hash[n] & 15];
}
hash_text[2 * hash_size] = '\0';

// printing
printf("%s\n", hash_text);

// BIGNUM conversion
BIGNUM *h = BN_new();
BN_hex2bn(&h, hash);
BN_print(bio_out, h);

Вы также можете инициализировать BIGNUM непосредственно из двоичных данных с обратным порядком байтов с помощью BN_bin2bn:

// BIGNUM conversion
BIGNUM *h = BN_new();
BN_bin2bn(hash, hash_size, h);
BN_print(bio_out, h);

Или проще:

// BIGNUM conversion
BIGNUM *h = BN_bin2bn(hash, hash_size, NULL);
BN_print(bio_out, h);

Я решил с помощью: BN_bin2bn(hash, hash_size, h);

CipherX 09.04.2022 13:41

Другие вопросы по теме