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

6

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

820dbb4256a4287557ade2f729d279f1

如上所述,哈希值是一个32位十六进制数。我需要将上述字符串转换为十进制整数,并在后续的计算中使用。

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

没有整数足够大来容纳32字节十六进制哈希值,因此我尝试使用NTL库中的大整数,但它没有成功,因为您不能将从strtol函数返回的长整数(而且我认为十进制哈希值远远超过长整数范围限制)分配给NTL::ZZ类型。有什么好的解决方案吗?

我正在使用Visual Studio 2013的Visual C++进行此操作。


“32位十六进制哈希”听起来像是一个32位的值?这样说是否正确?如果是,那么请指定这个“实体”的范围(或最大值)(也许一个“unsigned long long”就足够了)。 - barak manos
第二点 - 如果您期望strtol从您的hash字符串中提取整数值,则该值肯定适合于一个整数...因此,您可能需要解释“没有足够大的整数来容纳32位十六进制哈希值”的说法。 - barak manos
2
如果你正在进行任何加密和敏感的操作,请不要使用MD5。它是有缺陷的。你应该至少使用SHA256。无论如何,这个哈希值的整数表示有什么用处呢? - tadman
@barak MD5是128位,即16字节,或32个十六进制字符。在VS中最大的类型为64位。 - Alan Stokes
2
你需要哈希字节。将它们存储在平台本地整数类型中根本不可能发生(除非你在一个庞然大物的平台上,而从外观来看(Windows...errm),你不是)。NTL::ZZ类支持左移,那么什么阻止你枚举字符串,提取两个字符来组装一个八位字节,然后shift8+添加值。该算法的唯一棘手部分是检测哈希字符串长度是否为奇数,如果是,则为第一次迭代拉出一个字符(前导八位只有4个有效位),然后对于其余的字符串,一切照常。 - WhozCraig
@barak_manos 刚刚添加了一个十六进制哈希值的示例 - “820dbb4256a4287557ade2f729d279f1”。因此,当您将该字符串类型的十六进制转换为整数类型的十进制时,结果应为172870937377668790778780175506882066929。 - Wei-jye
1个回答

1
MD5的结果是一个八位字节串(或者字节数组)。十六进制值只是用来表示二进制值。你需要将十六进制字符串转换回字节。这可以通过许多库中的十六进制解码器来完成。
然后需要将字节数组转换回多精度整数。为此,您需要一个库。在密码学中(通常基于群论),将字节解释为无符号、大端序(最高有效位在前)编码的整数可能是有意义的。
如果需要执行任何其他与加密相关的计算,则最好使用像OpenSSL(C)、Crypto++或Bothan(C++)这样的加密库。这些库已经包含了处理大型(无符号)数字和一般十六进制编解码的方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接