Verwendung von SHA256?



  • Nabend,

    vielleicht kann mir einer erklären, was ich bei folgendem Quelltext falsch gemacht habe?

    key.h

    #ifndef KEY_H
    #define KEY_H
    
    #include <QString>
    #include <stdlib.h>
    #include <QByteArray>
    #include <openssl/sha.h>
    
    class Key
    {
    public:
        Key();
        ~Key();
    
        QString randomPW();
        QString passwordToKey(QByteArray password);
        unsigned char getKeySHA256();
    
    private:
        unsigned char keySHA256[32];
    };
    
    #endif // KEY_H
    

    key.cpp

    #include "key.h"
    
    Key::Key()
    {
    }
    
    Key::~Key()
    {
    }
    
    QString Key::randomPW()
    {
        QString pw;
    
        for(int i = 0; i < 8; i++)
        {
            int j = rand() % 122;
    
            if(j > 96 && j < 123)
            {
                pw += (char) j;
            }
            else if(j > 64 && j < 91)
            {
                pw += (char) j;
            }
            else
            {
                pw += QString::number(j % 9);
            }
        }
    
        return pw;
    }
    
    QString Key::passwordToKey(QByteArray password)
    {
        unsigned char *input = (unsigned char*) password.data();
        unsigned long pwLength = password.length();
    
        keySHA256 = SHA256(input, pwLength, keySHA256);
    
        return QString(keySHA256);
    }
    
    unsigned char Key::getKeySHA256()
    {
        return keySHA256;
    }
    

    Bekomme folgende Fehlermeldungen:

    1. error: incompatible types in assignment of ‘unsigned char*’ to ‘unsigned char [32]’ (bei "keySHA256 = SHA256...")
    2. error: call of overloaded ‘QString(unsigned char [32])’ is ambiguous (bei "return QString(keySHA256);")
    3. error: invalid conversion from ‘unsigned char*’ to ‘unsigned char’ (bei "return keySHA256;")

    Ich habe von dem ganzen Umwandeln wenig Ahnung, wie man mit Sicherheit sieht :p
    Allerdings will der SHA256-Algo mit "(const unsigned char *d, size_t n, unsigned char *md)" aufgerufen werden.

    Kann mir da jemand weiterhelfen?

    MfG
    gorgel


  • Mod

    Was soll man da noch sagen? Steht doch schon genau da. Dein keySHA256 ist ein unsigned char[32] (ein Array von 32 unsigned chars hintereinander), aber es werden unsigned char* (ein Zeiger auf einen char) benötigt. Ist doch klar, dass das nicht passt, das wäre als wenn ein Wegweiser das gleiche wie eine Straße wäre. Der Wegweise kann zwar auf eine Straße zeigen, dennoch sind es ganz unterschiedliche Dinge und man kann z.B. eine Straße nicht so verbiegen, dass sie zu einem Wegweiser wird.



  • Okay, die "[32]" ist entfernt. Aber weiter komme ich immernoch nicht. Ich kann "rumzeigern" soviel ich will... ich krieg's nicht gebacken!

    Selbst wenn ich keySHA256 als Zeiger deklariere, bzw. keySHA256 gar nicht anfasse und einen neuen Zeiger auf diese Variable erstelle, funktioniert es nicht. Kann mir jemand sagen, wie ich das zu schreiben habe?


  • Mod

    gorgel schrieb:

    Okay, die "[32]" ist entfernt. Aber weiter komme ich immernoch nicht. Ich kann "rumzeigern" soviel ich will... ich krieg's nicht gebacken!

    Selbst wenn ich keySHA256 als Zeiger deklariere, bzw. keySHA256 gar nicht anfasse und einen neuen Zeiger auf diese Variable erstelle, funktioniert es nicht. Kann mir jemand sagen, wie ich das zu schreiben habe?

    Erstmal: Beschäftige dich mit Pointern, wenn du mit diesen hantierst. Sonst geht das ganz schnell ganz schief. Und besonders nicht zufällig rumprobieren bis es passt. Das funktioniert nie!

    Wenn du aus keySHA256 einen Pointer auf unsigned char machst, sollte es eigentlich syntaktisch funktionieren (d.h. compilieren), was geht denn dann nicht? Ob es dann von der Semantik her stimmt (d.h. ob es so funktioniert wie gewünscht), kann ich nicht sagen, weil die Informationen nicht ausreichen. Man müsste dazu wissen, was die Funktionen machen.



  • Habe mein Programm jetzt nach dahingehend abgeändert:

    key.h

    #ifndef KEY_H
    #define KEY_H
    
    #include <QString>
    #include <stdlib.h>
    #include <QByteArray>
    #include <openssl/sha.h>
    
    class Key
    {
    public:
        Key();
        ~Key();
    
        QString randomPW();
        QString passwordToKey(QByteArray password);
        unsigned char getKeySHA256();
    
    private:
        unsigned char* keySHA256;     <--- vorher "unsigned char keySHA256"
    };
    
    #endif // KEY_H
    

    key.cpp

    #include "key.h"
    
    Key::Key()
    {
    }
    
    Key::~Key()
    {
    }
    
    QString Key::randomPW()
    {
        QString pw;
    
        for(int i = 0; i < 8; i++)
        {
            int j = rand() % 122;
    
            if(j > 96 && j < 123)
            {
                pw += (char) j;
            }
            else if(j > 64 && j < 91)
            {
                pw += (char) j;
            }
            else
            {
                pw += QString::number(j % 9);
            }
        }
    
        return pw;
    }
    
    QString Key::passwordToKey(QByteArray password)
    {
        unsigned char *input = (unsigned char*) password.data();
        unsigned long pwLength = password.length();
        unsigned char tmp[32];
    
        keySHA256 = SHA256(input, pwLength, tmp);
    
        return QString(*keySHA256);     <--- vorher "return QString(keySHA256);"
    }
    
    unsigned char Key::getKeySHA256()
    {
        return *keySHA256;    <--- vorher "return keySHA256;"
    }
    

    Knackpunkt ist das allerletzte return.
    Wenn ich dort anstatt "return keySHA256" nur "return keySHA256" schreibe, bekomme ich logischerweise diese Fehlermeldung:
    - "error: invalid conversion from ‘unsigned char
    ’ to ‘unsigned char’"

    Wenn ich allerdings das return mit Sternchen versehe, wird mir folgendes gesagt:
    - "undefined reference to `SHA256'" (und zwar am Ort "keySHA256 = SHA256(...);")
    - "👎 error: collect2: ld returned 1 exit status"

    Bin schonmal froh, dass es weniger Fehlermeldungen geworden sind 😃
    Das macht das Programm aber leider noch nicht lauffähig...

    P.S.: Habe mal markiert, was ich im Code verändert habe!


  • Mod

    gorgel schrieb:

    Wenn ich allerdings das return mit Sternchen versehe, wird mir folgendes gesagt:
    - "undefined reference to `SHA256'" (und zwar am Ort "keySHA256 = SHA256(...);")
    - "👎 error: collect2: ld returned 1 exit status"

    Die Funktion SHA256 wird vom Linker nicht gefunden. Du musst wohl noch irgendeine Bibliothek dazulinken. Welche, steht in der Anleitung wo du auch das #include <openssl/sha.h> her hast. Wie, steht in der Anleitung deines Linkers/Compilers/IDE.

    Das was du mit dem return *keySHA256; gemacht hast, ist wahrscheinlich nicht das was du meinst. Das gibt das Zeichen zurück, welches an der Stelle steht, wo keySHA256 hinzeigt. Nochmals: Beschäftige dich gründlich mit Zeigern bevor du sie benutzt.

    Ich hoffe auch mal ganz dringend, dass SHA256 auch Speicher reserviert, auf den keySHA256 hinterher zeigt, sonst fliegt dir alles um die Ohren. Die Art der Benutzung deutet darauf hin, aber ich hoffe du hast das in der Anleitung auch mal nachgelesen.



  • Anleitung - schön wär's! Ich muss das Programm für die Uni zusammenschustern. Stehe kurz vor meinem Abschluss, bin eigentlich Java-Programmierer und muss mich noch durch dieses eine Fach "quälen" (bei des es primär um Sicherheitsalgorithmen geht; trotzdem wurde die Programmiersprache auf C++ festgelegt).

    Ich werde mich dann nochmal gründlich in die Zeigerbenutzung einlesen und mein OpenSSL-Buch weiterhin studieren. Wobei ich dort gerade nicht mehr finde, als dass die Bibliothek openssl/sha.h eingebunden werden muss...

    Also bis dahin vielen Dank für deine Geduld und Hilfe! Werde mich sicher morgen nochmal zurück melden.

    Schönen Abend
    gorgel


Log in to reply