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

Учитывая "имя файла строки", как я могу получить контрольную сумму 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 ]

1 голос
/ 06 мая 2009

Если вы следуете этому 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 должен содержать желаемый хеш.

0 голосов
/ 15 апреля 2015

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

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

Например, следующие команды 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 ++ данные передаются от Sources до Sinks . Между ними встречаются фильтры , которые преобразуют данные.

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

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

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

...