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