Учитывая имя файла, как я могу получить Adler32 с помощью Crypto++

Учитывая "строковое имя файла", как я могу получить контрольную сумму Adler32, используя библиотеку C++ Crypto++. Я немного запутался в использовании их системы Source и Sink.

Ниже у меня есть скелет кода, который делает MD5, но я не могу найти какие-либо примеры или учебники по использованию Adler32.

string filename = "/tmp/data.txt"
string file_adler32_digest;
string file_md5_digest;

MD5 hashMD5;

FileSource fs( filename.c_str(), 
              true, 
              new HashFilter( hashMD5, 
              new HexEncoder( new StringSink( file_md5_digest ) ) ) );

/* Confusion begins here */   

//how do I do the adler32 ?

/* Confusion ends here */

cout << file_adler32_digest << endl
     << file_md5_digest << endl;

Хорошие примеры и пример кода здесь http://www.cryptopp.com/wiki/Category:Sample для всего Crypto++ (кроме материала Adler32, который я хочу)

2 ответа

Решение

Если вы будете следовать этому http://www.cryptopp.com/wiki/HashFilter, вам придется изменить hashMD5 для hashAdler32 и file_md5_digest для file_adler32_digest

Adler32 hashAdler32;

FileSource( filename.c_str(), 
            true, 
            new HashFilter( hashAdler32, 
            new HexEncoder( new StringSink( file_adler32_digest ) ) ) );

После этого file_adler32_digest должен содержать желаемый хэш.

.. немного запутался в использовании их системы Source и Sink.

ХОРОШО. Именно этот дизайн вдохновлен системой трубопроводов Unix. Если вы понимаете каналы Unix и то, как через них проходит поток данных, вы понимаете конвейер Crypto++.

Например, следующие команды Unix:

cat somefile.bin | hexdump

станет следующей программой Crypto++:

FileSource fs("somefile.bin", true /*pumpAll*/, new HexEncoder(new FileSink(cout)));

У меня есть скелет кода, который делает MD5, но мне нужен код... для Adler32 ...

Как показал Исмаил, все так просто, как:

Adler32 adler32;
string digest;

FileSource fs(filename.c_str(),  true /*pumpAll*/, 
              new HashFilter(adler32, 
                    new HexEncoder(
                        new StringSink(digest))));

Но здесь есть понимание: в Crypto++ данные передаются от источников к приемникам. В промежутке он встретит фильтры, которые преобразуют данные.

Выше у вас есть два фильтра: HashFilter и HexEncoder. Все фильтры наследуются от BufferedTransformationтак что все они могут быть последовательно соединены вместе.

Adler32сам по себе не фильтр. Но это наследует отHashTransformationи это то, что использует HashFilter. Таким образом, вы можете поменять любой объект на основе HashFilter, и все будет работать.

Вы можете найти список объектов на основе HashFilter в Ссылке класса HashTransformation. Они включают в себя все хэши (например, MD5, SHA и Whirlpool), Adler32 и CRC32.

Другие вопросы по тегам