在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));
答案 0 :(得分:1)
一种明显的方法是先反转字节数组,然后再使用std::for_each
分别对每个字节进行半字节交换。
或者,如果您要进行复制,则可以在进行操作时进行半字节交换:
template<std::size_t N>
void nibble_reverse(char (&dest)[N], const char (&src)[N])
{
static auto const nibble_swap =
[](std::uint8_t c){ return c >> 4 | c << 4; };
std::transform(std::crbegin(src), std::crend(src),
std::begin(dest),
nibble_swap);
}