0

我正在尝试对 RIPEMD 160 哈希的消息摘要执行 SHA256 哈希。我在 Mac 平台上使用 OpenSSL 库。我遇到的问题是获取 RIPEMD 160 的消息摘要然后对其执行另一个 SHA256 哈希的中间过程。到目前为止,我只能执行 1) 对字符串执行 SHA256 哈希,2) 单独对字符串执行 RIPEMD160 哈希。我需要对以前的 SHA256 消息摘要执行 RIPEMD160 哈希,然后对 RIPEMD 160 摘要执行第二个 SHA256 哈希......

SHA256 摘要-> RIPEMD160 哈希函数-> RIPEMD160 摘要-> 2nd SHA256 哈希函数。我希望这是有道理的....?

仅针对字符串的 SHA256 哈希函数的代码

string sha256(const string str)
{
unsigned char hash[SHA256_DIGEST_LENGTH];
SHA256_CTX sha256;
SHA256_Init(&sha256);
SHA256_Update(&sha256, str.c_str(), str.size());
SHA256_Final(hash, &sha256);
stringstream ss;

for(int i = 0; i < SHA256_DIGEST_LENGTH; i++)
{

    ss << hex << setw(2) << setfill('0') << (int)hash[i];
}
return ss.str();

}

仅在字符串上的 RIPEMD160 哈希代码

 int main()
 {

  unsigned char digest[RIPEMD160_DIGEST_LENGTH];

  char string[] = "hello world";

  RIPEMD160((unsigned char*)&string, strlen(string), (unsigned 
  char*)&digest);

  char mdString[RIPEMD160_DIGEST_LENGTH*2+1];

     for(int i = 0; i < RIPEMD160_DIGEST_LENGTH; i++)
     sprintf(&mdString[i*2], "%02x", (unsigned int)digest[i]);

     printf("RIPEMD160 digest: %s\n", mdString);

  return 0;

}

4

1 回答 1

0

仅针对字符串的 SHA256 哈希函数的代码

SHA256 不对字符串进行操作。SHA256 对字节进行操作。不幸的是,在 C 中,它们经常是相同的数据类型。

一旦你离开 Caesar 和 Vigenere,密码学就不能在字符串上工作。记住这一点非常重要。


假设您的输入数据是一个文本字符串,并且它当前以预期的编码(US-ASCII / ISO-8859-1 / UTF-8)表示,那么在更正一些错误的指针之后,您的代码就可以了:

unsigned char digest[RIPEMD160_DIGEST_LENGTH];
...
RIPEMD160((unsigned char*)string, strlen(string), (unsigned char*)digest);

现在digest包含您的 RIPEMD160 摘要。我们记得密码学只对字节进行操作,而摘要是字节,我们得到

unsigned char hash[SHA256_DIGEST_LENGTH];

SHA256_CTX sha256;
SHA256_Init(&sha256);
SHA256_Update(&sha256, digest, RIPEMD160_DIGEST_LENGTH);
SHA256_Final(hash, &sha256);

或者加速器版本,就像你对 RIPEMD160 所做的那样:

unsigned char hash[SHA256_DIGEST_LENGTH];
SHA256(digest, RIPEMD160_DIGEST_LENGTH, hash);
于 2018-06-25T16:16:10.637 回答