Problem: Fremde Library verwenden und verstehen



  • Hallo, bin ja erbärmlicher Newbie. Zwecks Vereinfachung von String-Operationen habe ich Boost eingebunden und das Wunder geschah: es funktionierte. In Visual Studio in den Projektoptionen ("Zus. Includeverzeichnisse") angegeben und im Code als #include. Das klappt soweit.

    Nun wollte ich sha.h einbinden. Ich will nämlich einen Eingabestring reintun und einen SHA512-Hash in ein Stringobjekt rausbekommen.

    Mit dem #include <sha.h> klappt das schon mal. Wenn ich anfange, den Namespace "CryptoPP::" zu tippen, macht mir Visual Studio auch Angebote. Das ist ja schon mal etwas :D. Nun versuche ich zu ergründen, wie ich meinen String "flatinput", ein Objekt der Klasse string afaics, da hineinbekomme und einen SHA512-String heraus.

    Ich schaue mir also sha.h an. Und da sehe ich:

    00044 class CRYPTOPP_DLL SHA512 : public IteratedHashWithStaticTransform<word64, BigEndian, 128, 64, SHA512, 64, CRYPTOPP_BOOL_X86>
    00045 {
    00046 public:
    00047         static void CRYPTOPP_API InitState(HashWordType *state);
    00048         static void CRYPTOPP_API Transform(word64 *digest, const word64 *data);
    00049         static const char * CRYPTOPP_API StaticAlgorithmName() {return "SHA-512";}
    00050 };
    

    Hinter dem public, sind das "öffentliche Methoden", d.h. 3 Methoden, die ich nutzen kann?
    Müsste ich also in meinem Code ein Objekt vom Typ sha512 erzeugen ("CryptoPP::SHA512 sha512objekt") und dann mit "sha512objekt.Transform" weitermachen? Leider gehts in meinen Tests nicht weiter, denn, siehe die Zeile im Code unten "CryptoPP::SHA512 sha512objekt;" bringt mir 1000 Linker-Fehler: "error LNK2001: Nicht aufgelöstes externes Symbol ""public: __thiscall CryptoPP::Algorithm::Algorithm(bool)" ??0Algorithm@CryptoPP@@QAE@_N@Z)"."

    #include "stdafx.h"
    #include <iostream>
    #include <string>
    #include <boost/algorithm/string/case_conv.hpp>
    #include <sha.h>
    
    using namespace std;
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	CryptoPP::SHA512 sha512objekt; //bringt Compilerfehler!
    	string svc, usr, add, flatinput;
    	cout << "svc:"; cin >> svc;
    	cout << "usr:"; cin >> usr;
    	cout << "add:"; cin >> add;
    	boost::to_lower(svc); boost::to_lower(usr); boost::to_lower(add);
    	flatinput = svc + usr + add;
    	cout << endl << "Ausgabe:" << flatinput << endl;
    	cin >> svc; // Wusste nicht, wie sonst die .exe anhält.
    	return 0;
    }
    

    Wie immer für jeden Hinweis dankbar 🙂
    Michael



  • Das drei sind alles statische Methoden, d.h. du benötigst kein Objekt der Klasse, sondern rufst sie einfach mit 'CryptoPP::SHA512::' auf, d.h.:

    CryptoPP::SHA512::InitState(...);
    

    Und um den Linker-Fehler zu entfernen, mußt du auch noch die ".lib"-Datei deinem Projekt hinzufügen.



  • Th69 schrieb:

    Das drei sind alles statische Methoden, d.h. du benötigst kein Objekt der Klasse, sondern rufst sie einfach mit 'CryptoPP::SHA512::' auf, d.h.:

    CryptoPP::SHA512::InitState(...);
    

    Aber sowas hier funktioniert nicht, ich nehme an die Typen sind unverträglich:
    CryptoPP::SHA512::Transform(flatinput,output);
    (flatinput,output) sind Objekte der String-Klasse.

    "error C2664: 'CryptoPP::SHA512::Transform': Konvertierung des Parameters 1 von 'std::string' in 'CryptoPP::word64 *' nicht möglich"

    Ich nehme an, ich habe hier grundsätzlich nicht verstanden, welcher Art Eingabe und Ausgabe von sha512::transform sein sollen?! Was kann ich mir unter Word64 vorstellen?



  • static void CRYPTOPP_API Transform(word64 *digest, const word64 *data);
    

    Als Parameter werden zwei Variablen vom Typ word64 erwartet, nicht string.
    Es ist unwahrscheinlich dass word64 ein typedef auf string ist.
    Vermutlich ist irgendwo in der Header Datei ein #define oder ein typedef aus dem du schließen kannst was dahinter steckt.



  • Ja, word64 ist als 'unsigned __int64' (bzw. 'unsigned long long') definiert (in "config.h"). Aber mit welchen konkreten Daten die Funktion jetzt aufgerufen wird, k.A.

    Am besten, du suchst dir ein Tutorial zu der Klasse direkt auf http://cryptopp.com/...



  • Squeller schrieb:

    Müsste ich also in meinem Code ein Objekt vom Typ sha512 erzeugen ("CryptoPP::SHA512 sha512objekt") und dann mit "sha512objekt.Transform" weitermachen? Leider gehts in meinen Tests nicht weiter, denn, siehe die Zeile im Code unten "CryptoPP::SHA512 sha512objekt;" bringt mir 1000 Linker-Fehler: "error LNK2001: Nicht aufgelöstes externes Symbol ""public: __thiscall CryptoPP::Algorithm::Algorithm(bool)" ??0Algorithm@CryptoPP@@QAE@_N@Z)"."

    Das sind Linker-Fehler, d.h. die Kompilierung ist schon erfolgreich durch gelaufen. Du hast wahrscheinlich einfach vergessen die Crypto Library dazu zu linken, in der CryptoPP::Algorithm::Algorithm(bool) implementiert ist.



  • Habe es mir nicht angeschaut, aber man kann hier was runter laden:
    http://www.bitvise.com/users-guide.html
    Evtl. sind bei der Library auch Test-Units bei, in die man sich was abschauen kann?



  • Artchi schrieb:

    Habe es mir nicht angeschaut, aber man kann hier was runter laden:
    http://www.bitvise.com/users-guide.html
    Evtl. sind bei der Library auch Test-Units bei, in die man sich was abschauen kann?

    Danke, die hatte ich auch gefunden. Leider wird mir unter Win7 nichts angezeigt "Die Navigation zu der Webseite wurde abgebrochen.", muss mal sehen...



  • Squeller schrieb:

    Artchi schrieb:

    Habe es mir nicht angeschaut, aber man kann hier was runter laden:
    http://www.bitvise.com/users-guide.html
    Evtl. sind bei der Library auch Test-Units bei, in die man sich was abschauen kann?

    Danke, die hatte ich auch gefunden. Leider wird mir unter Win7 nichts angezeigt "Die Navigation zu der Webseite wurde abgebrochen.", muss mal sehen...

    Dann verwende einen anderen Browser als "Win7"...



  • Broosa schrieb:

    Squeller schrieb:

    Artchi schrieb:

    Habe es mir nicht angeschaut, aber man kann hier was runter laden:
    http://www.bitvise.com/users-guide.html
    Evtl. sind bei der Library auch Test-Units bei, in die man sich was abschauen kann?

    Danke, die hatte ich auch gefunden. Leider wird mir unter Win7 nichts angezeigt "Die Navigation zu der Webseite wurde abgebrochen.", muss mal sehen...

    Dann verwende einen anderen Browser als "Win7"...

    Gemeint war "unter Windows 7 wird das .chm nicht angezeigt". Es ist vermutlich eine Frage der IE-Sicherheitsoptionen, da im chm viewer vermutlich ein IE-Objekt werkelt.



  • Naja, das wird wenig mit Win7 zu tun haben, als eher, das der IE entfernte Objekte aus Sicherheitsgründen ungern anzeigt. Lösung: auf die gespeicherte Datei gehen, rechte Maustaste, Eigenschaften und dann unten auf "Zulassen" klicken (unter WinXP). Danach geht es.


Log in to reply