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)

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top