2009-05-06 13 views
1

Gegeben eine "Zeichenfolge Dateiname", wie bekomme ich die Adler32 Prüfsumme mit der C++ Crypto ++ Bibliothek. Ich bin ein wenig verwirrt über die Verwendung ihres Source- und Sink-Systems.Gegeben ein Dateiname, wie bekomme ich die Adler32 mit Crypto ++

Unten habe ich das Skelett des Codes, der MD5 tut, aber ich kann anscheinend keine Beispiele oder Tutorials auf der Adler32 Verwendung finden.

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; 

Gute Beispiele und Beispielcode hier http://www.cryptopp.com/wiki/Category:Sample für alle Crypto ++ (mit Ausnahme des Adler32 Sachen ich will)

Antwort

1

Wenn Sie diese http://www.cryptopp.com/wiki/HashFilter folgen, müssen Sie hashMD5 für hashAdler32 ändern und file_md5_digest für file_adler32_digest

Adler32 hashAdler32; 

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

nach dieser file_adler32_digest sollte die gewünschte Hash enthalten.

+0

Das funktioniert .. das ist seltsam, ich bin mir ziemlich sicher, dass ich es früher versucht habe und es hier gepostet, weil es nicht war. Aber funktioniert jetzt. Es ist deine antwortende Magie, die es zum Laufen gebracht hat. Vielen Dank! –

+0

Ja, das sollte eine Art Regel sein: Es wird nicht funktionieren, wenn du jemand anderen fragst, dann wird es auf magische Weise anfangen zu arbeiten. Tha ist mir mehrmals passiert :) – Ismael

0

.. ein wenig verwirrt über die Verwendung ihrer Source-und Sink-System.

OK. Dieses spezielle Design ist vom Unix-Rohrsystem inspiriert. Wenn Sie Unix-Pipes verstehen und wie Doata durch sie fließt, dann verstehen Sie die Crypto++ Pipeline.

Zum Beispiel die folgenden Unix-Befehle:

cat somefile.bin | hexdump 

würde das folgende Crypto ++ Programm geworden:

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

Ich habe das Skelett des Codes, der MD5 tut, aber Ich brauche den Code ... für Adler32 ...

Als Ismael zeigte man, seine so einfach wie:

Adler32 adler32; 
string digest; 

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

Aber hier ist die Erkenntnis: In Crypto ++, Datenflüsse von Sources zu Sinks. Zwischendurch wird es auf Filters treffen, die die Daten transformieren.

Oben haben Sie zwei Filter: HashFilter und HexEncoder. Alle Filter erben von einer BufferedTransformation, so dass sie alle auf eine konsistente Weise miteinander verkettet werden können.

Adler32 selbst ist kein Filter. Aber es erbt von HashTransformation, und das ist was HashFilter verwendet. So können Sie in jedem HashFilter basierten Objekt tauschen und die Dinge werden einfach funktionieren.

Sie können eine Liste von HashFilter basierten Objekt unter HashTransformation Class Reference finden. Sie enthalten alle Hashes (wie MD5, SHA und Whirlpool), Adler32 und CRC32.