我正在尝试以Botan为后端编写哈希函数,即:
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
botan支持的任何其他哈希都得到处理和输出,但BLAKE2b却没有,并引发异常:
Exception thrown at 0x00007FF661382C5A in test.exe: 0xC0000005: Access violation reading location 0x0000000000000000.
然后崩溃。
我确实在botan(https://botan.randombit.net/manual/hash.html)手册中注意到
BLAKE2b
如果定义了BOTAN_HAS_BLAKE2B,则可用。
最近设计的哈希函数。在64位处理器上非常快。可以输出1到64个字节之间任何长度的哈希,通过将值传递给具有所需长度的构造函数来指定。
是否可能没有默认设置?我该如何设置?我的名字可能有误吗?
答案 0 :(得分:1)
问题可能是名称的大写。我使用牡丹2.9.0和“Blake2b”的作品,而“BLAKE2b”崩溃。牡丹的主分支也接受“BLAKE2b”,但这仅加入recently。默认输出长度设置为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