Сбой при генерации хеша blake2b
Я пытаюсь написать хэш-функцию с ботаном в качестве моего бэкэнда:
std::string hex_hash(std::string &in, const std::string &HASH)
{
std::unique_ptr<Botan::HashFunction> hash(Botan::HashFunction::create(HASH));
return Botan::hex_encode(hash->process(in));
}
HASH
это std::string
это имя запрашиваемого хэша. т.е. "SHA-512"
для SHA512 и "BLAKE2b"
для BLAKE2b
Любой другой хэш, поддерживаемый ботаном, обрабатывается и выводится, но BLAKE2b этого не делает и выдает исключение:
Exception thrown at 0x00007FF661382C5A in test.exe: 0xC0000005: Access violation reading location 0x0000000000000000.
А потом вылетает.
В руководстве по ботану ( https://botan.randombit.net/manual/hash.html) я заметил, что
BLAKE2b
Доступно, если определено BOTAN_HAS_BLAKE2B.
Недавно разработанная хеш-функция. Очень быстро на 64-битных процессорах. Может выводить хеш любой длины от 1 до 64 байтов, это определяется передачей значения конструктору с желаемой длиной.
Возможно ли, что нет установленного по умолчанию? Как бы это установить? Возможно, у меня неправильное имя?
1 ответ
Проблема, вероятно, заключается в использовании заглавной буквы. Я использую Botan 2.9.0 и работает "Blake2b", а "BLAKE2b" вылетает. Основная ветвь Botan также принимает "BLAKE2b", но это было добавлено только недавно. Длина вывода по умолчанию установлена в 512 бит, вы можете изменить ее, передав, например, "Blake2b(256)" или напрямую вызвав конструктор Blake2b (как в связанном коммите).
Небольшой рабочий пример (main.cpp):
#include <iostream>
#include <memory>
#include <string>
#include "botan/hash.h"
#include "botan/hex.h"
std::string hex_hash(const std::string& in, const std::string& HASH) {
std::unique_ptr<Botan::HashFunction> hash(Botan::HashFunction::create(HASH));
return Botan::hex_encode(hash->process(in));
}
int main(int argc, char** argv) {
std::cout << "Blake2b " << hex_hash("abc", "Blake2b") << std::endl;
std::cout << "Blake2b(256) " << hex_hash("abc", "Blake2b(256)") << std::endl;
return 0;
}
$ g++ `pkgconf --cflags --libs botan-2` main.cpp && ./a.out
Blake2b BA80A53F981C4D0D6A2797B69F12F6E94C212F14685AC4B74B12BB6FDBFFA2D17D87C5392AAB792DC252D5DE4533CC9518D38AA8DBF1925AB92386EDD4009923
Blake2b(256) BDDD813C634239723171EF3FEE98579B94964E3BB1CB3E427262C8C068D52319
Если это не работает для вас, также убедитесь, что ваш Botan скомпилирован с поддержкой Blake2b, например
$ grep BLAKE /usr/include/botan-2/botan/build.h
#define BOTAN_HAS_BLAKE2B 20130131