Мне нужно сделать хэш нескольких BIGNUM на C/C++ с помощью OpenSSL.
Если я предполагаю, что у меня есть 10 BIGNUM, то есть n1, n2,..., n10, и я хочу вычислить их хэш как H(n1||n2||...||n10), есть ли быстрый способ сделать это?
Я хотел бы избежать преобразования одного за другим в строку, копирования в буфер и после этого выполнения хэша. Любое предложение/рекомендация?
Спасибо, Шон, но мне нужен хэш их объединения, как задано в вопросе.
Да, это то, что это будет вычислять.
Вместо того, чтобы преобразовывать большие числа в строки, вы можете получить байтовое представление с помощью 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 имеет другое имя переменной.
Приходится делать обновления по одному, а не использовать цикл. Немного боли, да.
Вам не нужно преобразовывать в строку... вы можете использовать
BN_bn2bin()
для преобразования в массив байтов и передавать каждый из них по очереди в хэш-функцию.