C++将十六进制md5哈希转换为十进制整数

Wei*_*jye 6 c++ hash md5 biginteger

我正在做Elgamal签名方案,我需要使用消息中的十进制哈希值来计算S以进行签名生成.十六进制哈希的一个示例是:

820dbb4256a4287557ade2f729d279f1
Run Code Online (Sandbox Code Playgroud)

如上所示,哈希值是32位十六进制数.我需要将上面的字符串转换为十进制整数,然后将其用于计算.

    string hash = md5(message);
    cout << hash << endl;
    NTL::ZZ msgHash = strtol(hash.c_str(), NULL, 16);
    cout << msgHash << endl;
Run Code Online (Sandbox Code Playgroud)

没有足够大的整数来包含32字节十六进制哈希的值,所以我尝试了来自NTL库的大整数,但它没有解决,因为你不能分配从strtol函数返回的长整数(我认为十进制哈希值比NTL :: ZZ类型的长整数范围限制长.这有什么好的解决方案吗?

我在Visual Studio 2013中使用visual C++这样做.

Maa*_*wes 1

MD5 的结果是一个八位字节字符串(或字节数组)。十六进制值应该仅用于表示二进制值。您需要将十六进制字符串转换回字节。这是由大量库中的十六进制解码器执行的。

然后需要将字节数组转换回多精度整数。为此你需要一个库。在加密货币(通常基于群论)中,将字节解释为无符号、大端(MSB 优先)编码的整数可能是有意义的。

如果需要执行任何额外的与加密相关的计算,那么最好使用 OpenSSL (C)、Crypto++ 或 Bothan (C++) 等加密库。这些库已经包含处理大(无符号)数字和通常十六进制编解码器的方法。