RSA-Verfahren



  • Hiho,
    bin gerade im Informatikunterricht am rumwerkeln für ein RSA-Verfahren. Momentan bin ich bei der Verschlüsselung, die Hauptsache ist für mich allerdings, dass ich es theoretisch verstehe, der Algorithmus ist ja nicht von schlechten Eltern.
    Trotzdem will ich das ganze auch in ein Programm umsetzen und ich habe mich entschieden das ganze mit C++ zu gestalten (programmiere sonst nur in Delphi).
    Naja die Grundsachen kenne ich, aber irgendwie komme ich mit den ganzen Variablentypen nicht klar, jede Funktion will einen bestimmten Typen und ich muss hin- und herkonvertieren.

    Hier ist der Teil für die Verschlüsselung, wär nett, wenn ihr das mal überfliegen und grobe Schnitzer anstreichen könntet ^^

    #include <iostream>
    #include <cmath>
    
    using namespace std;
    
    int main() {
        char input;
        cin>>input;
    
        //Variablen für RSA - Verschlüsselung
        double m;
        m=static_cast<int>(input);
        int c;
        int mod=187;
        double pot2=(pow(m,2));
        int pot2a=static_cast<int>(pot2);
        double pot4=(pow(m,4));
        int pot4a=static_cast<int>(pot4);
        int x=(pot2a%mod);
        int y=(pot4a%mod);
        int j;
        j=static_cast<int>(m);
        int z=(j*x*y);
    
        c=z%mod;
        //Ausgabe der verschlüsselten Datensätze
        cout<<c<<endl;
    
        cin.get();
        cin.get();
    }
    

    Btw - wenn man als Wert "X" eingibt, dann ist der ASCII-Code ja 88 und verschlüsselt sollte das ganze mit den Werten aus meinem Programm 11 ergeben. Kommt aber 120 raus 😕
    Das nur das erste Zeichen codiert wird weiß ich, bin auch am planen, wie ich das umgestalten kann (brauche da also noch keine Hilfe :D)



  • lass am besten das ganze double-Gegurke weg und schreib dir eine eigene Potenzierungsfunktion, die den Modulo gleich mit einarbeitet (am effektivsten geht es wohl, wenn du jeweils den Exponenten halbierst und die Basis quadrierst).



  • Gute Idee - hab ich im Eifer des Gefechts wohl vergessen 🙂
    Danke für den Tipp.

    Edit:

    Cool, jetzt funktioniert das alles perfekt 😉



  • Hiho.
    Habe das jetzt fast fertig gestellt. Code ist dieser hier:

    #include <iostream>
    #include <string.h>
    #include <stdlib.h>
    using namespace std;
    
    void crypt(string& input) {
         int i=0;
             while (input[i]!=0) {
              input[i]=(input[i]*(((input[i]*input[i])%187)*((input[i]*input[i]*input[i]*input[i])%187)))%187;
              ++i;
              }  }
    
    int main() {
        string input;
        cin>>input;
    
        crypt(input);  
    
        int zahl;
        cout<<zahl<<endl;
    
        cin.get();
        cin.get();
    
    }
    

    Ich will jetzt aber den String als ASCII-Code/Zahl ausgelesen haben, Problem ist nur, dass ich nicht genau weiß wie. In einem anderen Programm, dass ich geschrieben habe:

    #include <iostream>
    using namespace std;
    
    int main() {
        char input;
        cin>>input;
    
        int m;
        m=static_cast<int>(input);
    
        cout<<m<<endl;
    }
    

    funktioniert es - der Unterschied ist halt char -> int und string -> int.
    Habt ihr 'nen Rat für mich?


Anmelden zum Antworten