Хэш нескольких BIGNUM

Мне нужно сделать хэш нескольких BIGNUM на C/C++ с помощью OpenSSL.

Если я предполагаю, что у меня есть 10 BIGNUM, то есть n1, n2,..., n10, и я хочу вычислить их хэш как H(n1||n2||...||n10), есть ли быстрый способ сделать это?

Я хотел бы избежать преобразования одного за другим в строку, копирования в буфер и после этого выполнения хэша. Любое предложение/рекомендация?

Вам не нужно преобразовывать в строку... вы можете использовать BN_bn2bin() для преобразования в массив байтов и передавать каждый из них по очереди в хэш-функцию.

Shawn 09.04.2022 07:26

Спасибо, Шон, но мне нужен хэш их объединения, как задано в вопросе.

CipherX 09.04.2022 07:35

Да, это то, что это будет вычислять.

Shawn 09.04.2022 07:39
Формы 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
3
20
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вместо того, чтобы преобразовывать большие числа в строки, вы можете получить байтовое представление с помощью BN_bn2bin() и последовательно передавать эти байтовые массивы в хеш-функцию, чтобы получить окончательный хэш всех значений.

Пример:

#include <stdio.h>
#include <stdlib.h>

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

int main(void) {
  BIGNUM *bns[3];
  bns[0] = BN_new();
  bns[1] = BN_new();
  bns[2] = BN_new();
  BN_set_word(bns[0], 10);
  BN_set_word(bns[1], 50);
  BN_set_word(bns[2], 150);

  EVP_MD_CTX *hash_ctx = EVP_MD_CTX_new();
  EVP_DigestInit_ex(hash_ctx, EVP_sha256(), NULL);

  unsigned char *bytes = NULL;
  for (int n = 0; n < 3; n++) {
    size_t size = BN_num_bytes(bns[n]);
    bytes = realloc(bytes, size);
    BN_bn2bin(bns[n], bytes);
    EVP_DigestUpdate(hash_ctx, bytes, size);
  }
  free(bytes);

  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);

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

  return 0;
}

(Разумеется, реальный код должен включать проверку ошибок.)

Большое спасибо, Шон. Есть ли у вас какие-либо предложения на случай, если мне нужно передать другое имя переменной в BN_num_bytes и BN_bn2bin. Я имею в виду, что у меня нет массива BIGNUM, но каждый BIGNUM имеет другое имя переменной.

CipherX 09.04.2022 09:09

Приходится делать обновления по одному, а не использовать цикл. Немного боли, да.

Shawn 09.04.2022 09:50

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