Crypto ++ конвертирует дайджест Adler32 (байтовый массив) в uint32_t - PullRequest
1 голос
/ 17 ноября 2011

У меня следующая проблема: я пытаюсь вычислить контрольную сумму adler32 блока данных, используя Crypto++, но получаю неправильную контрольную сумму после преобразования вывода массива byte [4] в uint32_t.

Эта функция с crc32 работает просто отлично:

CryptoPP::CRC32 crc;
byte digest[CryptoPP::CRC32::DIGESTSIZE];
crc.CalculateDigest(digest, (const byte*)pData.data(), pData.size());
uint32_t checksum = *(uint32_t*)digest; //this works fine

, но функция, вычисляющая adler32, возвращает недопустимое значение:

CryptoPP::Adler32 adler;
byte digest[CryptoPP::Adler32::DIGESTSIZE];
adler.CalculateDigest(digest, (const byte*)pData.data(), pData.size());
uint32_t checksum = *(uint32_t*)digest; //this returns a invalid value

надеюсь, кто-то может дать мне подсказку.

привет Фабиан

Ответы [ 2 ]

0 голосов
/ 17 ноября 2011

хорошо, я обнаружил, что реализация adler32 в crypto ++ инициализирует s1 = 1; s2 = 0 в adler32.h http://www.cryptopp.com/docs/ref/adler32_8h_source.html, но это должны быть s1 = 0 и s2 = 0. Теперь все мои контрольные суммы верны, но я до сих пор не понимаю, почему реализация cryto ++ "неправильная". привет Фабиан

0 голосов
/ 17 ноября 2011

Проблема в том, что этот код не делает то, что вы хотите:

uint32_t checksum = *(uint32_t*)digest; //this returns a invalid value

Этот код говорит, что нужно прочитать дайджест, как если бы он содержал 32-разрядное целое число в форме, в которой этот ЦП хранит 32-разрядные целые числа. Но это не содержит этого. Он содержит массив из 4 байтов, которые представляют хэш, но не как целое число в стиле x86-CPU.

Попробуйте это:

uint32_t checksum = ntohl(*(uint32_t*)digest);

Это говорит о том, что нужно прочитать необработанные байты в целое число, а затем преобразовать их в формат хоста X86.

...