2009-05-06 5 views
1

Étant donné un "nom de fichier chaîne", comment puis-je obtenir la somme de contrôle Adler32 en utilisant la bibliothèque C++ Crypto ++. Je suis un peu confus à propos de l'utilisation de leur système Source and Sink. Ci-dessous j'ai le squelette du code qui fait MD5, mais je ne peux pas trouver d'exemples ou de tutoriels sur l'utilisation d'Adler32.Étant donné un nom de fichier, comment puis-je obtenir l'Adler32 en utilisant Crypto ++

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; 

bons échantillons et des exemples de code ici http://www.cryptopp.com/wiki/Category:Sample pour tous les Crypto ++ (sauf pour les choses Adler32 je veux)

Répondre

1

Si vous suivez ce http://www.cryptopp.com/wiki/HashFilter, vous devez changer hashMD5 pour hashAdler32 et file_md5_digest pour file_adler32_digest

Adler32 hashAdler32; 

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

Après cette file_adler32_digest doit contenir le hachage désiré.

+0

Cela fonctionne .. c'est bizarre, je suis sûr que je l'ai essayé plus tôt et posté ici parce que ce n'était pas le cas. Mais travaille maintenant. C'est votre magie de réponse qui l'a fait fonctionner. Merci! –

+0

Eh oui, cela devrait être une sorte de règle: Il ne fonctionnera pas si vous demandez à quelqu'un d'autre, alors il va magiquement commencer à travailler. Tha est arrivé à moi plusieurs fois :) – Ismael

0

.. un peu confus quant à l'utilisation de leur système Source et Sink.

OK. Ce design particulier est inspiré du système de tuyauterie Unix. Si vous comprenez les pipes Unix et comment le doata le traverse, alors vous comprenez le Crypto++ Pipeline.

Par exemple, les commandes Unix suivantes:

cat somefile.bin | hexdump 

deviendrait le programme Crypto ++ suivant:

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

Je le squelette du code qui MD5, mais J'ai besoin du code ... pour Adler32 ...

Comme Ismael vous a montré, est aussi simple que:

Adler32 adler32; 
string digest; 

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

Mais voici l'aperçu: Dans Crypto ++, les flux de données de Sources à Sinks. Entre les deux, il rencontrera Filters qui transforme les données. Ci-dessus, vous avez deux filtres: le HashFilter et le HexEncoder. Tous les filtres héritent d'un BufferedTransformation, de sorte qu'ils peuvent tous être chaînés de manière cohérente.

Adler32 lui-même n'est pas un filtre. Mais il hérite de HashTransformation, et c'est ce que HashFilter utilise. Donc, vous pouvez échanger dans n'importe quel objet basé HashFilter et les choses vont simplement fonctionner.

Vous pouvez trouver une liste d'objets basés HashFilter au HashTransformation Class Reference. Ils incluent tous les hashes (comme MD5, SHA et Whirlpool), Adler32 et CRC32.

Questions connexes