Сбой при генерации хеша blake2b - PullRequest
0 голосов
/ 30 января 2019

Я пытаюсь написать хэш-функцию с ботаном в качестве моего бэкэнда:

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 Ответ

0 голосов
/ 02 февраля 2019

Проблема, скорее всего, заключается в использовании заглавной буквы.Я использую Botan 2.9.0 и работает "Blake2b", а "BLAKE2b" вылетает.Основная ветвь Botan также принимает "BLAKE2b", но это было добавлено только недавно .Длина вывода по умолчанию установлена ​​в 512 бит, вы можете адаптировать ее, передав, например, «Blake2b (256)» или напрямую вызвав конструктор Blake2b (как в связанном коммите).

Небольшой рабочий пример (основной.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
...