【发布时间】:2019-03-07 15:35:11
【问题描述】:
在python中获取字节串的摘要,我这样做
hashlib.sha224(b"Nobody inspects the spammish repetition").hexdigest()
结果:'a4337bc45a8fc544c03f52dc550cd6e1e87021bc896588bd79e901e2'
要反转结果,我这样做
hashlib.sha224(b"Nobody inspects the spammish repetition").hexdigest()[::-1]
结果:'2e109e97db885698cb12078e1e6dc055cd25f30c445cf8a54cb7334a'
我想用 Openssl 在 C 中做同样的事情。
我这样做
#include <openssl/sha.h>
#include <openssl/opensslv.h>
#include <openssl/crypto.h>
int main()
{
unsigned char digest[SHA224_DIGEST_LENGTH];
char string[] = "Nobody inspects the spammish repetition";
SHA224((unsigned char*)&string, strlen(string), (unsigned char*)&digest);
char mdString[SHA224_DIGEST_LENGTH * 2 + 1];
for (int i = 0; i < SHA224_DIGEST_LENGTH; i++)
sprintf(&mdString[i * 2], "%02x", (unsigned int)digest[i]);
printf("SHA224 digest: %s\n", mdString);
return EXIT_SUCCESS;
}
但我不知道如何使用 C++ 获得与 python 中相反的结果。
我怎样才能做到这一点?
任何帮助将不胜感激。谢谢。
编辑:这与使用std::reverse 不同。
这不是问题How do you reverse a string in place in C or C++的重复?
我的解决方案: 参考:Swapping the nibbles in a char element
for (uint16_t j=0; j < SHA224_DIGEST_LENGTH; j++)
digest[j] = ((digest[j] & 0x0F) << 4) | ((digest[j] & 0xF0) >> 4);
std::reverse(std::begin(digest), std::end(digest));
【问题讨论】:
-
如果你想在 C++ 中做到这一点,你为什么要编写 C 代码?
-
您需要将
std::reverse应用于结果字符串,而不是摘要,或更改sprintf调用,以便反向生成十六进制数字 -
我想反转摘要。结果字符串仅用于检查反向是否正常。
-
@LeMoussel 好吧,如果你不想产生“e201e979bd886589bc2170e8e1d60c55dc523fc044c58f5ac47b33a4”,那么你不想反转字节。
-
@eerorika 你是对的,但我的英语说得不好,我意识到我给这个问题的标题是多么糟糕。我不知道怎么说我想得到结果'2e109e97db885698cb12078e1e6dc055cd25f30c445cf8a54cb7334a'