Dato un nome file, come posso ottenere Adler32 usando Crypto ++
Domanda
Dato un " string nomefile " ;, come posso ottenere il checksum Adler32 usando la libreria C ++ Crypto ++. Sono un po 'confuso sull'uso del loro sistema Source e Sink.
Di seguito ho lo scheletro del codice che fa MD5, ma non riesco a trovare alcun esempio o tutorial sull'uso di 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;
Buoni esempi e codice di esempio qui http://www.cryptopp.com/wiki/Category : Esempio per tutto il Crypto ++ (ad eccezione delle cose di Adler32 che voglio)
Soluzione
Se segui questo http://www.cryptopp.com/wiki/HashFilter , devi modificare hashMD5 per hashAdler32 e file_md5_digest per file_adler32_digest
Adler32 hashAdler32;
FileSource( filename.c_str(),
true,
new HashFilter( hashAdler32,
new HexEncoder( new StringSink( file_adler32_digest ) ) ) );
Dopo questo file_adler32_digest
dovrebbe contenere l'hash desiderato.
Altri suggerimenti
.. un po 'confuso sull'uso del loro sistema Source e Sink.
OK. Quel particolare design è ispirato al sistema di tubazioni Unix. Se capisci le pipe Unix e come scorre Doata, allora capisci la Pipeline Crypto ++ .
Ad esempio, i seguenti comandi Unix:
cat somefile.bin | hexdump
diventerebbe il seguente programma Crypto ++:
FileSource fs("somefile.bin", true /*pumpAll*/, new HexEncoder(new FileSink(cout)));
Ho lo scheletro del codice che fa MD5, ma ho bisogno del codice ... per Adler32 ...
Come ti ha mostrato Ismael, è semplice come:
Adler32 adler32;
string digest;
FileSource fs(filename.c_str(), true /*pumpAll*/,
new HashFilter(adler32,
new HexEncoder(
new StringSink(digest))));
Ma ecco l'intuizione: in Crypto ++, i dati scorrono da Fonti a Lavelli . Nel mezzo, incontrerà Filtri che trasformano i dati.
Sopra, hai due filtri: il HashFilter e il HexEncoder . Tutti i filtri ereditano da un BufferedTransformation
, quindi possono essere tutti concatenati insieme in modo coerente.
Adler32
in sé non è un filtro. Ma eredita da HashTransformation
, e questo è ciò che HashFilter utilizza. Quindi puoi scambiare qualsiasi HashFilter e le cose funzioneranno.
Puoi trovare un elenco di HashFilter in Riferimento classe HashTransformation . Includono tutti gli hash (come MD5, SHA e Whirlpool), Adler32 e CRC32.