Учитывая имя файла, как я могу получить 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.