【发布时间】: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