HashVerificationFilter 和 "message hash or MAC not valid" 异常

HashVerificationFilter and "message hash or MAC not valid" exception

在 Crpto++ 中,可以轻松地使用管道对输入进行哈希处理。

std::string out;
CryptoPP::SHA256 sha;
CryptoPP::StringSource ss(input,true,
                          new CryptoPP::HashFilter(sha,
                              new CryptoPP::HexEncoder(
                                  new CryptoPP::StringSink(out))));

现在为了验证给定消息 x 产生相同的散列输出,我想使用 HashVerificationFilter。我试过了,但没有用。有人知道正确的语法吗?

const int flags = CryptoPP::HashVerificationFilter::THROW_EXCEPTION | CryptoPP::HashVerificationFilter::HASH_AT_END;
CryptoPP::SHA256 sha;
try
{
    CryptoPP::StringSource ss(input + out, true,
                              new CryptoPP::HashVerificationFilter(sha, NULL , flags));
}
catch(const CryptoPP::Exception& e)
{
    std::cerr << e.what() << std::endl;
    exit(1);
}

我得到输出:

HashVerificationFilter: message hash or MAC not valid
std::string out;
SHA256 sha;
StringSource ss(input,true,
    new HashFilter(sha,
        new HexEncoder(
            new StringSink(out)
)));

HexEncode 您的哈希值。您需要在将其传递给过滤器之前对其进行解码:

StringSource ss(input + out, true,
    new HashVerificationFilter(sha, NULL , flags)
);

或者,删除编码过滤器:

std::string out;
SHA256 sha;
StringSource ss(input,true,
    new HashFilter(sha,
        new StringSink(out)
));