我正在使用Crypto ++ Library从纯文本创建 SHA1 和 CRC32 哈希,如下所示:
#include <cryptopp/filters.h>
#include <cryptopp/hex.h>
#include <cryptopp/sha.h>
#include <cryptopp/crc.h>
#include <string.h>
#include <iostream>
int main()
{
// Calculate SHA1
std::string data = "Hello World";
std::string base_encoded_string;
byte sha_hash[CryptoPP::SHA::DIGESTSIZE];
CryptoPP::SHA().CalculateDigest(sha_hash, (byte*)data.data(), data.size());
CryptoPP::StringSource ss1( std::string(sha_hash, sha_hash+CryptoPP::SHA::DIGESTSIZE), true,
new CryptoPP::HexEncoder( new CryptoPP::StringSink( base_encoded_string ) ));
std::cout << base_encoded_string << std::endl;
base_encoded_string.clear();
// Calculate CRC32
byte crc32_hash[CryptoPP::CRC32::DIGESTSIZE];
CryptoPP::CRC32().CalculateDigest(crc32_hash, (byte*)data.data(), data.size());
CryptoPP::StringSource ss2( std::string(crc32_hash, crc32_hash+CryptoPP::CRC32::DIGESTSIZE), true,
new CryptoPP::HexEncoder( new CryptoPP::StringSink( base_encoded_string ) ));
std::cout << base_encoded_string << std::endl;
base_encoded_string.clear();
}
我得到的输出是:
0A4D55A8D778E5022FAB701977C5D840BBC486D0
56B1174A
按任意键继续 。 。
而且,根据以下各种在线资源,我确认CRC32不正确:http://www.fileformat.info/tool/hash.htm?text=Hello+World
我不知道为什么,因为我按照与SHA1相同的步骤创建CRC32哈希。是真的有不同的方式,还是我在这里做错了什么?
答案 0 :(得分:1)
byte crc32_hash [CryptoPP :: CRC32 :: DIGESTSIZE];
我相信你有一个糟糕的endian互动。将CRC32值视为整数,而不是字节数组。
所以试试这个:
int32_t crc = (crc32_hash[0] << 0) | (crc32_hash[1] << 8) |
(crc32_hash[2] << 16) | (crc32_hash[3] << 24);
如果 crc32_hash
是整数对齐的,那么您可以:
int32_t crc = ntohl(*(int32_t*)crc32_hash);
或者,这可能更容易:
int32_t crc32_hash;
CryptoPP::CRC32().CalculateDigest(&crc32_hash, (byte*)data.data(), data.size());
int32_t
我可能错了,可能是uint32_t
(我没看标准)。