CRC32哈希生成无效

时间:2014-08-29 14:11:42

标签: hash sha1 crypto++ crc32

我正在使用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哈希。是真的有不同的方式,还是我在这里做错了什么?

1 个答案:

答案 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(我没看标准)。