我正在进行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 ++这样做。
答案 0 :(得分:1)
MD5的结果是八位字符串(或字节数组)。十六进制值应仅用于表示二进制值。您需要将十六进制字符串转换回字节。这是由图书馆中的十六进制解码器执行的。
然后需要将字节数组转换回多精度整数。对于这个you need a libary。在crypto(通常基于组理论)中,将字节解释为无符号,大端(MSB优先)编码整数可能是有意义的。
如果需要执行任何其他与加密相关的计算,那么最好使用加密库,如OpenSSL(C),Crypto ++或Bothan(C ++)。这些库已经包含处理大(无符号)数字的方法,通常也包含十六进制编解码器。