【问题标题】:C++ converting hexadecimal md5 hash to decimal integerC++ 将十六进制 md5 哈希转换为十进制整数
【发布时间】:2014-07-24 08:23:04
【问题描述】:

我正在做 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-bit hexa hash" 听起来像 32 位值?那是错的吗?如果是,那么请指定这个“生物”的范围(或最大值)(也许unsigned long long 就足够了)。
  • 第二点 - 如果你希望 strtol 从你的 hash 字符串中提取整数值,那么这个值肯定适合一个整数......所以你可能需要解释“不大到足以包含 32 位六进制哈希值的整数”语句。
  • 如果您正在做任何加密和敏感的事情,请勿使用 MD5。这是有缺陷的。您至少应该使用 SHA256。无论如何,这个哈希值的整数表示有什么用?
  • @barak MD5 是 128 位,即 16 个字节,或 32 个字节作为十六进制字符。 VS中最大的类型是64位。
  • 你想要散列 bytes。将它们存储在平台原生整数类型中根本不会发生(除非你在一个平台的野兽上,并且从它的外观判断(Windows...errm)你不是。NTL: :ZZ 类支持左移,所以是什么阻止你枚举字符串,拉两个字符来组装一个八位字节,然后 shift8+添加值。该算法唯一棘手的部分是将哈希字符串长度检测为奇数,并且如果是这样,则为第一次迭代提取 one 字符(前导八位字节只有 4 个有效位),然后对字符串的其余部分照常进行操作。

标签: c++ hash md5 biginteger


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-16
    • 2014-04-16
    • 1970-01-01
    • 2017-07-31
    • 2013-07-20
    • 2012-06-17
    相关资源
    最近更新 更多