2014-08-29 2 views
0

Я создаю SHA1 и CRC32 хэш от обычного текста, используя Crypto ++ Library, как:Invalid CRC32 Hash Generation

#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

Я понятия не имею, почему, потому что я создаю CRC32 хэш следуя той же процедуре, Я последовал за SHA1. Есть ли другой способ, или я действительно делаю что-то неправильно здесь?

ответ

1

байт crc32_hash [CryptoPP :: CRC32 :: DIGESTSIZE];

Я считаю, что у вас плохое согласование между собой. Обработка значения 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 (я не смотрел на стандарт).