在RIPEMD160消息摘要上执行SHA256哈希

时间:2018-06-25 10:48:40

标签: c++ hash openssl cryptography libcrypto

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

SHA256摘要-> RIPEMD160摘要函数-> RIPEMD160摘要->第二个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;

}

1 个答案:

答案 0 :(得分: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);