RSA-Verschlüsselung ergiebt falsche Ergebnisse



  • Hallo Community,
    ich bin gerade dabei ein Programm zu schreiben, dass Passwörter gespeichert werden, die zuvor von dem Programm über die RSA-Methode (http://de.wikipedia.org/wiki/RSA-Kryptosystem) verschlüsselt wurden...
    Wenn ich mein Programm laufen lasse erscheinen flasche Ergebnisse der Verschlüsselung, aber ich weiß leider nicht woran das liegt.
    Hier der Code :

    #include <iostream>
    #include <stdio.h>
    #include <cmath>
    
    using namespace std;
    
    //Rechenwerte
    const int SIZE = 3;
    int Werte[SIZE];
    int Dreier[SIZE/3];
    int p = 307;
    int q = 859;
    double N = p*q;
    float phi = (p-1)*(q-1);
    double e = 1721;
    
    long double Verschlusselung[SIZE/3];
    
    int main()
    {
        char input[SIZE];
        // Eingabe...
        cout << "Geben sie den zu verschluesselnden Zeichensatz ein: ";
        cin >> input;
    
        //ASCII Werte
        for(int i=0; i < SIZE; ++i)
    
               Werte[i] = int(input[i]);
    
        //Formung von DreierBlöcken
        for(int i=0; i < SIZE/3; ++i)
        {
              Dreier[i] = Werte[3*i]*10000 + Werte[3*i + 1]*100 + Werte[3*i +2];
    
              //Zur Kontrolle...
              cout << Dreier[i]<< endl;
        }
    
        //Verschlüsselung...
        for(int i=0; i < SIZE/3; ++i)
        {
             Verschlusselung[i] = fmod(pow(Dreier[i], e), N);
             //THEORETISCHES Ergebnis
             cout << Verschlusselung[i] << endl;
        }
    
        return 0;
    }
    

    Der Code ist erstmal vorläufig (Zahlen werden später verändert) um zu testen, ob das funktioniert, habe statt "Dreier[i]" in der pow() Funktion auch schon direkt Zahlen eingegeben aber es sind trotzdem falsche Werte herausgekommmen
    Vielleicht kann mir ja jemand helfen...
    ...Danke schonmal im Voraus



  • Da gibt es so einiges, was daran verbesserungswürdig ist
    - Unnütze Verwendung globaler Variablen
    - rohes char-Array statt std::string
    - rohes int-Array statt std::vector<int>
    - Verwendung von Fließkommazahlen (die haben bei RSA nix zu suchen)

    Ich hoffe auch, dass du dir darüber im Klaren bist, dass RSA erst sicher ab relativ großen Zahlen wird ... von mindestens 1000 Bits.

    Wenn du nur mit dem Algorithmus etwas spielen willst, dann mach das mal mit Ganzzahlen und schreib dir eine eigene Potenzier-Funktion, die alle Zwischenergebnisse frühstmöglich reduziert auf [0,n). Google mal nach "square and multiply". Die endliche Genauigkeit von Fließkommazahlen wird dir hier mit dem "erst potenzieren, dann modulo"-Ansatz sehr schnell zum Verhängnis. Im wesentlichen schmeißt du beim Porenzieren, so wie du es im Moment machst, all die Informationen weg.

    Wenn man RSA "richtig" anwendet, dann verschlüsselt man damit auch nicht seine Nachrichten ... sondern nur einen symmetrischen Schlüssel. Und den steckt man auch nicht direkt in RSA rein, sondern "padded" den mit einem Verfahren wie OAEP. Das nennt sich dann RSA-OAEP. Alles andere an RSA-Gefrickel ist im Wesentlichen Kinderkacke.



  • ok ich gebe zu ich habe einen schlechten schreibstil und ich denke dass liegt daran,dass ich nie "richtig c++" gelernt habe sondern mir nur irgendwelche Videos angeschaut habe
    Vielleicht kannst du mir ja mal genauer erklären, wie/ was man an meinem Text verbessern könnte 🙂

    Ich hoffe auch, dass du dir darüber im Klaren bist, dass RSA erst sicher ab relativ großen Zahlen wird ... von mindestens 1000 Bits.

    Ja darüber bin ich mir schon im klaren aber wenn du meine post bis zum Ende lesen würdest, hättest du gesehn dass ich später andere/größere Zahlen benutzen werde...

    P.S.: die double, float werte am Anfang "ignorieren" , die sind jetzt

    int
    

    werte



  • Mourthag schrieb:

    Ja darüber bin ich mir schon im klaren aber wenn du meine post bis zum Ende lesen würdest, hättest du gesehn dass ich später andere/größere Zahlen benutzen werde...

    Ich habe es zu Ende gelesen. Das einzige was du da sagtest war, dass der Code erstmal "vorläufig" sei.

    Von der eigenen RSA-Implementierung rate ich dir ab, wenn du etwas haben willst, was einigermaßen sicher sein soll.



  • Es soll nichts extrem sicheres, wie für eine Firma oder den Geheimdienst sein 😉
    Es soll nur eine Methode, um wie gesagt Passwörter zu speichern, ohne dass sich jmd an meinen PC setzt und die innerhalb von ein paar Sekunden hat (diese Leute sind keine IT-Begabten 😉 )



  • Wenn es nur ist um Passwörter zu speichern würde ich dir empfehlen einfach eine Hashfunktion zu nehmen. Die musst du auch nicht selbst schreiben.



  • DarkShadow44 schrieb:

    Wenn es nur ist um Passwörter zu speichern würde ich dir empfehlen einfach eine Hashfunktion zu nehmen. Die musst du auch nicht selbst schreiben.

    Wenn er sie auf seinem Rechner speichern will, will er sie doch wahrscheinlich auch wieder entschlüsseln. Da hilft ihm ein Hash wenig. AES wäre vielleicht angebracht, denn wozu man hier eine asynchrone Verschlüsselung brauchen sollte, ist mir auch schleierhaft.


  • Mod

    cooky451 schrieb:

    wozu man hier eine asynchrone Verschlüsselung brauchen sollte, ist mir auch schleierhaft.

    Du weißt es ganz genau, du willst es nur nicht aussprechen 🙂 : Weil es (881+456) ist.



  • Weil es (881+456) ist.

    Den versteh ich jetzt nicht? Was meinst du damit?

    Und AES habe ich mir einmal angeschaut, und bin dabei darauf gestoßen, dass der zu verschlüsselnde Text ja eine bestimmte Länge haben muss...
    Dafür müsste man ja dann theoretisch eine Funktion schreiben die eine bestimmte Zahl von Stellen an den eigentlich zu verschlüsselnden Text anhängen müsste und beim entschlüsseln wieder entfernen oder?

    Außerdem ist meiner Meinung nach AES um einiges schwerer zu verstehen, wenn man bisher mit keinen Matrizen ( wenn ich das richtig verstanden habe? ) programmiert hat...


  • Mod

    Mourthag schrieb:

    Weil es (881+456) ist.

    Den versteh ich jetzt nicht? Was meinst du damit?

    Wenn du den Witz nicht verstehst, dann bist du wohl einfach nicht leet genug 🙂

    Und AES habe ich mir einmal angeschaut, und bin dabei darauf gestoßen, dass der zu verschlüsselnde Text ja eine bestimmte Länge haben muss...
    Dafür müsste man ja dann theoretisch eine Funktion schreiben die eine bestimmte Zahl von Stellen an den eigentlich zu verschlüsselnden Text anhängen müsste und beim entschlüsseln wieder entfernen oder?

    Ja. Oh Graus! Diese Funktionen könnten 2-3 Zeilen lang sein! Oder sogar schon fertig in einer AES-Bibliothek vorhanden! Ich stimme zu, das kommt wirklich nicht in Frage, das so zu machen. Viel zu umständlich! Dann lieber ein unpassendes, kompliziertes Verfahren implementieren. Wie wäre es mit einem OTP?



  • Das is nich mein Hauptgrund 😃
    Wie gesagt verstehe ich AES momentan leider noch nicht.... Habe gegoogelt und bin bisher nur auf hexadezimale Matrizen/ schwer zu verstehende Texte gestoßen aus denen ich nicht viel verstanden habe...
    Ich bin ein absoluter Anfänger in der Kryptographie und fände es echt nett wenn mir einer helfen/ es erklären könnte;)


  • Mod

    Dann nutz doch eine Bibliothek! Das ist bei Kryptoanwendungen sowieso immer zu empfehlen, weil man sonst bloß dumme Anfängerfehler macht, selbst wenn man den Algorithmus verstanden hat. Denn die praktische Umsetzung ist dann doch meist tückischer als man denkt.

    Das Argument "Es soll nichts extrem sicheres, wie für eine Firma oder den Geheimdienst sein" zieht nicht. Entweder willst du Sicherheit oder eben nicht. Alles zwischen sicher und unsicher ist auch nur unsicher, bloß auf umständlichere Art und Weise.

    Ansonsten:

    ok ich gebe zu ich habe einen schlechten schreibstil und ich denke dass liegt daran,dass ich nie "richtig c++" gelernt habe sondern mir nur irgendwelche Videos angeschaut habe

    Das reicht nicht für Kryptographie. Für Kryptographie musst du einigermaßen in der Lage sein, Algorithmen zu verstehen und korrekt umzusetzen. Für beides brauchst du eigene Erfahrung und zusätzlich hinreichende Sprachkenntnisse. Das wird durch das Ansehen von Videos nicht geboten. Du solltest dich erst einmal an einfacheren Aufgaben versuchen, um dort die Erfahrung zu sammeln. Zusätzlich solltest du auch ein dickes, schlaues Buch über C++ lesen (siehe meine Signatur für Tipps), denn erfahrungsgemäß ist C++ viel zu komplex, um es in Videotutorials zu lernen. Sieh nur, wie krümelkacker deinen Quellcode in der ersten Antwort kritisiert, da fehlt noch vieles, was in c++ zu den Grundlagen gehört. Für einen einigermaßen guten Überblick über C++ kannst du ca. 2 Monate Lernen einplanen. Es würde mich im Moment überraschen, wenn du in der Lage wärst, eine externe Bibliothek (sei es AES oder RSA) eigenständig zu benutzen. AES oder RSA selber programmieren ist auf deinem Kenntnisstand einfach viel zu schwer, das wird nur zu Frust führen, weil es am Ende doch nicht funktioniert.

    (Das sage ich nicht, um dich runterzumachen. C++ ist eben schwer. Das lernt man nicht aus Videotutorials oder wenn doch, dann nur mit extrem viel eigener Übung an einfachen Beispielen verknüpft mit eigenständiger Weiterbildung)



  • Ok vielen Dank für die ehrliche Antwort 😉
    Nein, natürlich nehme ich es nicht persönlich und bin. Ich hatte mir auch vorgenommen mir ein gescheites Buch zuzulegen vlt. für Weihnachten oder so...
    Ich mein ich habe die Grundsätze verstanden und bräöuchte also kein absolutes Neulingbuch. Hättest du da vlt eine direkte Empfehlung?


  • Mod

    Seppj schrieb:

    (siehe meine Signatur für Tipps)

    Ich mein ich habe die Grundsätze verstanden und bräöuchte also kein absolutes Neulingbuch.

    Ich denke, mit dem Niveau "Für C++ Einsteiger mit etwas Programmiererfahrung" fährst du schon ganz gut. Dann kannst du die ersten 50 Seiten von den 1000 eben querlesen oder besser: Nochmal richtig gründlich den Stoff nachholen!



  • ja diesen Post habe ich schon gelesen, jedoch lässt sich daraus nicht gut schließen welches Buch gut ist...
    Deswegen wollte ich ja dich fragen 😉 Lohnt es sich Bücher für 50€ zu kaufen?!?
    Ich finde das etwas teuer für ein Buch, lasse mich jedoch umstimmen 😃


  • Mod

    Mourthag schrieb:

    Lohnt es sich Bücher für 50€ zu kaufen?!?

    Ja. Das sind nun einmal 1000+ Seiten, daher kostet es. Aber danach bist du auch fit und lachst sowohl über RSA als auch AES.



  • OK danke für die Hilfe noch einmal...
    Muss der Weihnachtsmann wohl mal ein dickeres Geschenk bringen 😉



  • SeppJ schrieb:

    Aber danach bist du auch fit und lachst sowohl über RSA als auch AES.

    Na ja, also so weit würde ich nicht gehen. Für die ganzen Modi CBC etc. ein schönes einheitliches Interface etc. zu finden und gleichzeitig nicht alles so sehr mit Templates zu zu klatschen, dass die gesamte Implementierung im Header offen liegt, ist nicht unbedingt trivial, genau so wenig wie die performanten big_int Klassen, die man für RSA braucht. 🤡



  • krümelkacker schrieb:

    Wenn du nur mit dem Algorithmus etwas spielen willst, dann mach das mal mit Ganzzahlen und schreib dir eine eigene Potenzier-Funktion, die alle Zwischenergebnisse frühstmöglich reduziert auf [0,n). Google mal nach "square and multiply".

    naja, eher modulares potenzieren, das geht sogar öfters noch im kopf, oder mit einer zeile papier

    krümelkacker schrieb:

    Wenn man RSA "richtig" anwendet, dann verschlüsselt man damit auch nicht seine Nachrichten ... sondern nur einen symmetrischen Schlüssel. Und den steckt man auch nicht direkt in RSA rein, sondern "padded" den mit einem Verfahren wie OAEP. Das nennt sich dann RSA-OAEP. Alles andere an RSA-Gefrickel ist im Wesentlichen Kinderkacke.

    quatsch, RSA auf alles anzuwenden wäre schon ein stück sicherer. das problem ist mal wieder nur die laufzeit, es dauert zu lange ganze messages zu ver- und zu entschlüsseln



  • Für Anfänger der Kryptographie eignet es sich evtl. einfachere, klassische Verfahren anzuschauen, bevor man sich an RSA versucht.



  • Skym0sh0 schrieb:

    quatsch, RSA auf alles anzuwenden wäre schon ein stück sicherer. das problem ist mal wieder nur die laufzeit, es dauert zu lange ganze messages zu ver- und zu entschlüsseln

    ROFL, dann erklär mal, jetzt bin ich echt gespannt.


Anmelden zum Antworten