Mamutfrage RSA --> Fehlersuche



  • Hi liebe Community, also ich schreib grad ein verschlüsselungsprogramm und das soll auch eine art rsa verschlüsselung enthalten jetzt hab ich die soweit auch geschrieben aber irgend wie haut sie nicht hin:( und ich find auch nicht wirklich den Fehler) ich hoffe mir einer von euch kann mir Helfen.

    Vorweg entschuldigt die Rechtschreibung und hier erst mal mein quellcode

    Die selbst definierten Datentypen

    // Datentypen, welche fuer RSA - benoetigt werden
       // key --> beinhaltet alle bestandteil des privat und public - keys
       struct key {
        		long int s;       //Teil des oeffentlichen schluessels
        		long int t;       //Teil des privaten schluessels
        		long int k;       //RSA Modul
       }; 
       typedef struct key key;
    
       // Public key
       struct publickey {
        		long int s;        //Oeffentlicher exponent
        		long int k;        //RSA Modul
       }; 
       typedef struct publickey publickey;
    
       // Private key
       struct privatkey {
        		long int t;        //Geiheimexponent
        		long int k;        //RSA Modul
       }; 
       typedef struct privatkey privatkey;
    

    Hier alles was mit der Schlüsselerzeugung zu tun hat:

    // menue fue die rsa schluesselerzeugung (rsacreatekeymenue())
            // Diese Funktion realisiert das Menue fuer die erzeugung des RSA - Schluesselpaares unter zuhilfenmahme der Funktion creatersakey(), aus der 
            // File rsa.c. Dabei werden die Schluessel seperat in zwei datein gespeichert die der Nutzer angeben muss
            // Parameter:
            //--> keine
            // Rueckgabewert
                 //--> int (0-->alles ok, 1--> Pointerinitialiesierungsfehler)
            int rsacreatekeymenue() {
             // Variablendeffinition -belegung
                int flag;
                char pfad[255];      // Pfadangabe     
                // Zeiger auf Datei
                    FILE *file;         // Zeiger auf datei
             // Pointerdeffinition
              key *key;           //Typdef key           
                 // Pointe - Initialisierung
                    key = malloc(sizeof(key));
                 // Pruefen ob Initialiesierung erfolgreich 
                    if (key == NULL){
                        return 1;     //Fehler beim Initialisieren von key
                    }
    
                 // Konsole leeren 
                    clearconsole();
                 // Private und Public key erzeugen ueber Funktionsaufruf creatersakey (key *key)
                    creatersakey (key);
                 // Nutzer informieren 
                    printf("Das RSA - Schluesselpaar wurde erfolgreich erzeugt!\n\n");
                 // Wo sollen die Schluessel gespeichert werden 
                     // Public Key
                       do {
                           // Entscheidungsvariable vordeffinieren 
                              flag = 0;
                           // Nutzer zur eingabe auffordern
                              printf("Geben sie bitte den Pfad, in dem der PublicKey gespeichert wird, an!\n\n");
                           // Eingabe von Nutzer
                              printf("> ");
                              scanf("%254[^\n]", &pfad);
                           // Datei oeffnen
                                file = fopen(pfad,"w");
                           // Datei erstellen
                                if (file==NULL) {       // Fehler
                                   printf("Die Datei <%s> konnte nicht erstellt werden!", pfad);
                                   getchar();
                                   flag = 1;
                                } else {
                                   // Datei beschreiben 
                                       if (fprintf(file, "%li %li",key->s, key->k)<=0) {        //Fehler beim schreiben in die Datei
                                          printf("Der Public Key konnte nicht in die Datei <%s> geschrieben werden.", pfad);
                                          getchar();
                                          flag = 1;
                                       } else {
                                          printf("Der Public Key wurde erfolgreich in die Datei <%s> geschrieben.\n\n", pfad);
                                          getchar();
                                       }
                                }
                           // Eingabepuffer loeschen
                              while (getchar() != '\n' && getchar() != EOF);
                           // Datei schliesen
                              fclose(file);
                       } while (flag==1);
    
                    // Privat Key
                       do {
                           // Entscheidungsvariable vordeffinieren 
                              flag = 0;
                           // Nutzer zur eingabe auffordern
                              printf("Geben sie bitte den Pfad, in dem der Private Key gespeichert wird, an!\n\n");
                           // Eingabe von Nutzer
                              printf("> ");
                              scanf("%254[^\n]", &pfad);
                           // Datei oeffnen
                                file = fopen(pfad,"w");
                           // Datei erstellen
                                if (file==NULL) {       // Fehler
                                   printf("Die Datei <%s> konnte nicht erstellt werden!", pfad);
                                   getchar();
                                   flag = 1;
                                } else {
                                   // Date beschreiben 
                                       if (fprintf(file, "%li %li",key->t, key->k)<=0) {        //Fehler beim schreiben in die Datei
                                          printf("Der Private Key konnte nicht in die Datei <%s> geschrieben werden.", pfad);
                                          getchar();
                                          flag = 1;
                                       } else {
                                          printf("Der Private Key wurde erfolgreich in die Datei <%s> geschrieben.\n\n", pfad);
                                          getchar();
                                       }
                                }
                           // Eingabepuffer loeschen
                              while (getchar() != '\n' && getchar() != EOF);
                           // Datei schliesen
                              fclose(file);
                       } while (flag==1);
    
                 // Speicherbereinigung
                    free(key);
                 // Rueckgabewert
                    return 0;
        }
    
    // Schluellerzeugungs - Funktion fuer RSA - Schluessel (void create_rsa_key (key *key))
         // Funktion welche die schluessel fuer die RSA - Verschluesselung erzeugt (privat, public - key) die schluessel werden über den zeiger 
         // key zurueckgegeben.
         // Parameter:           
           //--> key *key (Schluesselvariable)
         // Rueckgabewert:       
           //--> keine da void 
        void creatersakey (key *key) {
             // Variablendeffinition/ -belegung
               long int p, q;       //Variablen zur speicherung der primzahlen
               long int k;          //RSA - Modul, teil des oeffentlichen schluessels
               long int m;          //eulerische Funktion
               long int s;          //teil des oeffentlichen Schluessels
               long int t;          //geheimer exponent
    
               int flag;            //einfache entscheidungsvariable
    
             // p und q mit primzahlen belegen
                 p = primzahl();
                 // kleine schleife damit p !=q sehr geringe wahrscheinlichkeit muss aber dennoch geprueft werden
                   do {
                       q = primzahl();
                   } while(p==q);
             // RSA-Modul, k ermitteln
                 k = p*q;
             // eulerische funktion anwenden und m ermitteln
                 m = ((p-1)*(q-1));
             // s ermitteln unter zuhilfenahme der funktion ggt
                 srand(time(0));                  // es soll ja auch wirklich zuefallig sein
                 // s muss teilfremd zu m sein also wird probiert
                   do { 
                      s = rand()%m+1;
                      if (ggt(s,m) == 1) {         //teilfremd von m
                         flag = 0;
                      } else {                      //nicht teilfremd also noch mal 
                         flag = 1;       
                      }
                   } while(flag == 1);
             // t ermitteln
                 t = erweuklalgrsa (s, m);
             // t kann negatif sein also aendern wir das 
                 if(t<0){
                    do {
                       t=t+m;                   // Legetim da a^f(n) mod n = 1 (Satz von Euler-Fermat), somit ist a^n = a^n * 1 
                    } while(t<0);               //= a^n * a^f(n) = a^(n+f(n)) (mod n)
                 }
             // Schluessel erzeugung ist fertig, hinterlegung der Schluessel in zwei sepperate datein
                key->s = s;
                key->k = k;
                key->t = t;
          }
    

    Hier alles was mit der codierung zu tun hat

    // Menue fuer  die RSA - Verschluesselung (rsacodedmenue())
        // Diese Funktion Realisiert das Menue fuer die RSA - Verschluesselung unter zuhilfenahme der Funktion rsacoded aus der rsa.c file.
        // Das menue realisiert die gesamten voreinstellungen welche fuer die Funktion rsacoded benoetigt werden. Dazu gehoeren die pointer
        // auf die in und out files hinter dennen sich die Datein fuer den klartext und den verschluesselten text befinden sowie die bereitstellung 
        // des Public Key.
        // Anmerkung: es findet keine Pruefung statt ob sich in der Datei ein wirklicher Public Key befindet, dies waehre eine evtl. verbesserung
        // welche mit der naechsten Version realisiert werden koennte. 
        // Parameter
             //--> keine
        // Rueckgabewert
             //--> int (0--> alles ok, 1-->Fehler bei Pointerinialiesierung) 
        int rsacodedmenue() {
             // Variablendeffinition -belegung
                int flag;            // Entscheidungsvariable
                char pfad[255];      // Pfadangabe     
                char zs[100];
                // Zeiger auf Datei
                    FILE *in;         // Zeiger auf Datei in die der Cheffrierte text geschrieben wird
                    FILE *out;        // Zeiger auf Datei in der sich der Klartext befindet bzw. der Public key 
    
             // Pointerdeffinition
                publickey *publickey;           //Typdef publickey           
                // Pointe - Initialisierung
                   publickey = malloc(sizeof(publickey));
                // Pruefen ob Initialiesierung erfolgreich 
                   if (publickey == NULL){
                      return 1;     //Fehler beim Initialisieren von key
                   }
    
             // Ermitteln des Public Key
                do {
                   // Entscheidungsvariable vordeffinieren 
                      flag = 0;
                   // Konsole leeren 
                      clearconsole();
                   // Abfrage wo die key-datei ist
                      printf("Geben sie bitte den Pfad, in dem sich der Public Key befindet, an!\n\n");
                   // Eingabe von Nutzer
                      printf("> ");
                      scanf("%254[^\n]", &pfad);
                   // Datei oeffnen und key herausschreiben 
                      out = fopen(pfad,"r");
                      // Oeffnen
                         if (out==NULL) {        // Fehlerhafter pfad, erneute pfad abfrage
                            printf("Die Datei <%s> konnte nicht geoffnet werden!", pfad);
                            getchar();
                            flag = 1;        
                         } else {                // Datei konnte geoffnet werden
                           // Schluessel lesen 
                              fscanf(out,"%li %li",&publickey->s, &publickey->k);
                              printf("Der Public Key <%li;%li> wurde erfolgreich aus der Datei <%s> gelesen.",publickey->s, publickey->k, pfad);
                              getchar();
                              // Datei schliesen
                                 fclose(out);      
                         }
                     // Eingabepuffer loeschen
                        while (getchar() != '\n' && getchar() != EOF);
                 } while(flag==1);
    
             // Klartext oeffnen 
                do {
                   // Entscheidungsvariable vordeffinieren 
                      flag = 0;
                   // Konsole leeren 
                      clearconsole();
                   // Abfrage wo der Klartext ist
                      printf("Geben sie bitte den Pfad, in dem sich der Klartext befindet, an!\n\n");
                   // Eingabe von Nutzer
                      printf("> ");
                      scanf("%254[^\n]", &pfad);
                   // Ist die Datei vorhanden, Oeffnen der Datei zum lesen
                      out = fopen(pfad,"r");
                      if (out==NULL) {      // Datei nicht vorhanden
                         printf("Die Datei <%s> konnte nicht geoffnet werden!", pfad);
                         getchar();
                         flag = 1;
                      }
                   // Eingabepuffer loeschen
                        while (getchar() != '\n' && getchar() != EOF);
                } while (flag==1);    
    
             // cheffrierten text oeffnen 
                do {
                   // Entscheidungsvariable vordeffinieren 
                      flag = 0;
                   // Konsole leeren 
                      clearconsole();
                   // Abfrage wo der Klartext ist
                      printf("Geben sie bitte den Pfad, in dem sich der Cheffrierte Text befindet, an!\n\n");
                   // Eingabe von Nutzer
                      printf("> ");
                      scanf("%254[^\n]", &pfad);
                   // Ist die Datei vorhanden, Oeffnen der Datei zum lesen
                      in = fopen(pfad,"w");
                      if (in==NULL) {      // Datei nicht vorhanden
                         printf("Die Datei <%s> konnte nicht geoffnet werden!", pfad);
                         getchar();
                         flag = 1;
                      }
                   // Eingabepuffer loeschen
                        while (getchar() != '\n' && getchar() != EOF);
                } while (flag==1);
    
             // Aufruf der rsacoded() funktion
                rsacoded(publickey, in, out);
    
             // Speicherbereinigung
                free(publickey);
                // Datei schliesen
                   fclose (in);
                   fclose(out);
    
             // Rueckgabewert
                return 0;   
        }
    
    // RSA Verschluesseln - Funktion (rsacoded(publickey publickey, FILE *in, FILE *out))
        // Diese Funktion verschluesselt den Inhalte einer Datei welche den klartext enthaelt und schreibt den verschluesselten Text 
        // in eine seperate Datei. Aus den Klartext werden jeweils zwei zeichen gelesen welche in einer Long Int variablen hinterlegt werden
        // dieser werd wird ueber die Formel Klartext^Oeffentlicher Exponent % RSA Modul maniepuliert (unter zuhilfenahme der Funktion
        // moduloexponentiation()) dieser maniepulierte wert wird in die neue Datei geschrieben 
        // Parameter:
           //--> publickey *publickey (Schluessel zum verschluesseln)
           //--> FILE *in (Datei die verschluesselten Text beinhaltet)
           //--> FILE *out (Datei welche den Klartext enthaelt)
        //Rueckgabewert:
           //--> keiner da void
        void rsacoded(publickey *publickey, FILE *in, FILE *out){
             // Variablendeffinition -belegung
                int flag = 0;        // Entscheidungsvariable
                int zs1, zs2;        // Zwischenspeicher fuer das einlesen des Klartextes
                long int k;          // Variable zur hinterlegung der zusammengelegten zs1 und zs2
                long int ch;         // Variable fuer den Cheffrierten text
                char c;              // Zwischenspeicher fuer char
    
             // Schleife zur abarbeitung der Verschluesselung
                do {
                   // Herauslesen von zwei zeichen aus der Klartext Datei
                      // erstes zeichen 
                         c = fgetc(out);
                         // Ist Datei ende erreicht
                            if (c != EOF){         // Nein
                               zs1 = c;
                               // zweites zeichen
                                  c = fgetc(out);
                               // ist Datei ende erreicht
                                  if (c != EOF){         // Nein
                                     zs2 = c;
                                  } else {
                                     zs2 = 32;           // Lerzeichen
                                     flag = 1;
                                  }
                            } else {
                              flag = 1;
                            }
    
                   // Zusammfuegen zu einen Long Int Wert
                      k = (zs1*1000)+zs2;
                   // Start der Codierung
                      ch = moduloexponentiation(k, publickey->s, publickey->k);
                   // Schreiben in die Datei in
                      fprintf(in, "%li ",ch);
    
                } while (flag == 0);
    
        }
    

    Hier alles was mit der decodierung zu tun hat

    // Menue fuer  die RSA - Entschluesselung (rsadecodedmenue())
        // Diese Funktion Realisiert das Menue fuer die RSA - Entschluesselung unter zuhilfenahme der Funktion rsadecoded aus der rsa.c file.
        // Das menue realisiert die gesamten voreinstellungen welche fuer die Funktion rsadecoded benoetigt werden. Dazu gehoeren die pointer
        // auf die in und out files hinter dennen sich die Datein fuer den klartext und den verschluesselten text befinden sowie die bereitstellung 
        // des Private Key.
        // Anmerkung: es findet keine Pruefung statt ob sich in der Datei ein wirklicher Private Key befindet, dies waehre eine evtl. verbesserung
        // welche mit der naechsten Version realisiert werden koennte. 
        // Parameter
             //--> keine
        // Rueckgabewert
             //--> int (0--> alles ok, 1-->Fehler bei Pointerinialiesierung)
        int rsadecodedmenue() {
            // Variablendeffinition -belegung
                int flag;            // Entscheidungsvariable
                char pfad[255];      // Pfadangabe     
                char zs[100];
                // Zeiger auf Datei
                    FILE *in;         // Zeiger auf Datei in die der Klarttext geschrieben wird
                    FILE *out;        // Zeiger auf Datei in der sich der chiffrierte Text befindet bzw. der Private key 
    
             // Pointerdeffinition
                privatkey *privatkey;           //Typdef privatkey           
                // Pointe - Initialisierung
                   privatkey = malloc(sizeof(privatkey));
                // Pruefen ob Initialiesierung erfolgreich 
                   if (privatkey == NULL){
                      return 1;     //Fehler beim Initialisieren von key
                   }
    
             // Ermitteln des Private Key
                do {
                   // Entscheidungsvariable vordeffinieren 
                      flag = 0;
                   // Konsole leeren 
                      clearconsole();
                   // Abfrage wo die key-datei ist
                      printf("Geben sie bitte den Pfad, in dem sich der Private Key befindet, an!\n\n");
                   // Eingabe von Nutzer
                      printf("> ");
                      scanf("%254[^\n]", &pfad);
                   // Datei oeffnen und key herausschreiben 
                      out = fopen(pfad,"r");
                      // Oeffnen
                         if (out==NULL) {        // Fehlerhafter pfad, erneute pfad abfrage
                            printf("Die Datei <%s> konnte nicht geoffnet werden!", pfad);
                            getchar();
                            flag = 1;        
                         } else {                // Datei konnte geoffnet werden
                           // Schluessel lesen 
                              fscanf(out,"%li %li",&privatkey->t, &privatkey->k);
                              printf("Der Private Key <%li;%li> wurde erfolgreich aus der Datei <%s> gelesen.",privatkey->t, privatkey->k, pfad);
                              getchar();
                              // Datei schliesen
                                 fclose(out);      
                         }
                     // Eingabepuffer loeschen
                        while (getchar() != '\n' && getchar() != EOF);
                 } while(flag==1);
    
             // Chiffrierten Text oeffnen 
                do {
                   // Entscheidungsvariable vordeffinieren 
                      flag = 0;
                   // Konsole leeren 
                      clearconsole();
                   // Abfrage wo der Klartext ist
                      printf("Geben sie bitte den Pfad, in dem sich der Chiffrierte Text befindet, an!\n\n");
                   // Eingabe von Nutzer
                      printf("> ");
                      scanf("%254[^\n]", &pfad);
                   // Ist die Datei vorhanden, Oeffnen der Datei zum lesen
                      out = fopen(pfad,"r");
                      if (out==NULL) {      // Datei nicht vorhanden
                         printf("Die Datei <%s> konnte nicht geoffnet werden!", pfad);
                         getchar();
                         flag = 1;
                      }
                   // Eingabepuffer loeschen
                        while (getchar() != '\n' && getchar() != EOF);
                } while (flag==1);    
    
             // cheffrierten text oeffnen 
                do {
                   // Entscheidungsvariable vordeffinieren 
                      flag = 0;
                   // Konsole leeren 
                      clearconsole();
                   // Abfrage wo der Klartext ist
                      printf("Geben sie bitte den Pfad, in dem sich der Klartext befindet, an!\n\n");
                   // Eingabe von Nutzer
                      printf("> ");
                      scanf("%254[^\n]", &pfad);
                   // Ist die Datei vorhanden, Oeffnen der Datei zum lesen
                      in = fopen(pfad,"w");
                      if (in==NULL) {      // Datei nicht vorhanden
                         printf("Die Datei <%s> konnte nicht geoffnet werden!", pfad);
                         getchar();
                         flag = 1;
                      }
                   // Eingabepuffer loeschen
                        while (getchar() != '\n' && getchar() != EOF);
                } while (flag==1);
    
             // Aufruf der rsadecoded() funktion
                rsadecoded(privatkey, in, out);
    
             // Speicherbereinigung
                free(privatkey);
                // Datei schliesen
                   fclose (in);
                   fclose(out);
    
             // Rueckgabewert
                return 0; 
        }
    
    // RSA Entschluesseln - Funktion (rsadecoded(privatekey *privatekey, FILE *in, FILE *out))
        // Diese Funktion entschluesselt den Inhalte einer Datei welche den chiffrierten text enthaelt und schreibt den entschluesselten Text 
        // in eine seperate Datei. Aus den cheffrierten Text wird jeweils ein block gelesen vom typ long int, dieser werd wird ueber 
        // die Formel Chiffrierter Text^Geheim Exponent % RSA Modul maniepuliert (unter zuhilfenahme der Funktion
        // moduloexponentiation()) dieser maniepulierte wert wird nun in zwei int werte auseinander genommen und mithilfe der ASCII Tabelle in 
        // die Zeichen umgewandelt welchen sie symbolisieren diese zwei char werden in die neue Datei geschrieben 
        // Parameter:
           //--> privatekey *privatkey (Schluessel zum verschluesseln)
           //--> FILE *in (Datei die Klartext beinhaltet)
           //--> FILE *out (Datei welche den verschluesselten Text enthaelt)
        //Rueckgabewert:
           //--> keiner da void
        void rsadecoded(privatkey *privatkey, FILE *in, FILE *out) {
             // Variablendeffinition -belegung
                int flag = 0;        // Entscheidungsvariable
                long int k;          // Variable zur hinterlegung der zusammengelegten zs1 und zs2
                long int ch;         // Variable fuer den Cheffrierten text
                int zs1, zs2;        // Zwischenspeicher
    
             // Schleife zur abarbeitung der Entschluesselung
                do {
                    // Herauslesen der Bloecke aus den Cheffrierten Text
                       if (fscanf(out, "%li", &ch) != EOF) {        // Dateiende noch nicht erreicht
                          // Start der Decodierung
                             k = moduloexponentiation(ch, privatkey->t, privatkey->k);
                          // Block auseinander brechen
                             zs2 = k % 1000;   
                             zs1 = k / 1000;
                          // ASCII Werte in zeichen umwandeln und in Datei schreiben 
                             fprintf(in, "%c%c", zs1, zs2);
                       } else {                                     // Dateiende erreicht verlassen der Schleife
                          flag = 1;
                       }
    
                } while(flag==0);
    
        }
    

    Und nun noch alle mathematischen Funktion die ich verwende

    // primzahl - Funktion (long int primzahl())
        // Die Primzahl Funktion ermittelt eine Primzahl unter zuhilfenahme des Both Force III ansatzes
        // Parameter:           
           //--> keine
        // Rueckgabewert:       
           //--> long int
            long int primzahl() {
            	// Variablendefinition - belegung
            	   long int a;          //Hier wird die wahrscheinliche Primzahl gespeichert
            	   int i;               //Zaehlvariable
            	   int flag;            //einfache entscheidungs - variable
    
                // Voreinstellung fuer das ermitteln der Zuffalszahl
                   srand(time(0));
    
                // Ermitteln der Primzahl beginnt mit abarbeitung der Schleife
                	do {
                        // entscheidungsvariable zuruecksetzten
                		   flag = 0;    
                		// Zufallszahl ermitteln 
                		   a =rand()%40000+10000;
                		// prüfen ob es eine Primzahl ist 
                		   if (a % 2 == 0) {
     	                       flag = 1;
                           }
         	            // Versuche variable a mit den ungeraden Zahlen von 3 bis sqrt(a) zu teilen!  
         	               for (i = 3; i <= sqrt(a); i = i + 2) {
                    	       if (a% i == 0) { //Teilertest
                    	          flag = 1;
                 	           }
               	            }
         	            // Wenn es hier rausgeht dann ist a eine Primzahl
                	}while (flag == 1); 
            	// Rueckgabe der Primzahl
                   return a;           
            }
    
        // Groester Gemeinsamer Teiler - Funktion (long int ggt(long int a, long int b))
        // Die Funktion ggt, ermittelt den groeßten gemeinsammen teiler
        // Parameter:           
           //--> long int a(zahl 1) 
           //--> long int b(zahl 2) 
        // Rueckgabewert:       
           //--> long int
            long int ggt( long int a, long int b) {
            	if (a == 0) {                               // Wenn a=0 ist b der größste gemeinsame Teiler laut Definition
            	        // Rueckgabe des ggt 
                    	   return b;
                	}
                	while(b != 0) {                         // Solange wiederholen, solange b nicht 0 ist.
                    	if (a > b) {
                            	a = a - b;                  // Wenn a größer als b subtrahiere b von a.
                    	} else {
                            	b = b - a;                  // In jedem anderen Fall subtrahiere a von b.
                    	}
                	}
                	// Rueckgabe des ggt
                	   return a;                            // In a steht jetzt der größste gemeinsame Teiler von a und b.
             }
    
        // Erweiterter Euklidischer Algoritmus - Funktion (long int erweuklalgrsa (long int a, long int b))
        // Hierbei handelt es sich um eine Funktion welche im wesentlichen den erweiterten euklidische Algorithmus beinhaltet 
        // jedoch soweit abgeandert wurde das die Funktion den geheimexponenten des RSA Schluessels als rueckgabe wert liefert
        // Parameter:           
           //--> long int a(zahl 1) 
           //--> long int b(zahl 2)
        // Rueckgabewert:       
           //--> long int
            long int erweuklalgrsa (long int a, long int b){
    
                 // Variablendeffinition - belegung  
                    long int u, v, q, r, s, t;
    
                    u=t=1;
                    v=s=0;
    
                 // Die eigentliche abarbeitung findet statt 
                   while (b>0) {
                         q=a/b;    
                         r=a-q*b; a=b; b=r;
                          r=u-q*s; u=s; s=r;
                          r=v-q*t; v=t; t=r;  
                   }
    
                 // Rueckgabewert
                   return u;
    
            }
    
        // Module exponent - Funktion (long int moduloexponentiation(long int b, long int e, long int n))
        // Funktion welche eine module exponentation durchfuehrt (b^e) % n, welche fuer RSA benoetigt wird 
        // Parameter:           
           //--> long int b (basis) 
           //--> long int e(exponent) 
           //--> long int n(mod)
        // Rueckgabewert:       
           //--> long int
            long int moduloexponentiation(long int b, long int e, long int n){
    
                 // Variablendeffinition - belegung 
                  long int r = 1;
    
                // Lets go
                  while (e != 0){
                        if (e % 2 == 0) {  // gerade 
                           b = (b*b)%n;
                           e = e/2;
                        } else {           // ungerade 
                           e = e - 1;
                           r = (r*b)%n;
                        }
                  }
    
                  // Rueckgabewert
                    return r;
            }
    

    so das ist der Quellcode gewesen dieser ist noch in ein menü eingebunden weil die RSA ja nur ein teil des Programmes ist, aber da liegt der Fehler definitiv nicht. Ich hab es jetzt schon ein paar mal probiert aber es haut nicht richtig hin ich geb euch mal meinen letzten durchlauf.

    Ich hab mir ein schlüsselpaar erzeugen lassen pub (publickey) pri (privatkey), die Datei a.txt symbolisiert den Klartext, diese lass ich verschlüsseln und den entstandenen Quellcode lass ich in b.txt hineinschreiben. Diesen lasse ich nun wieder entschlüsseln in die Datei c.txt und hier das ergebniss

    Inhalt pub
    "25613 596570363"

    Inhalt pri
    "67213493 596570363"

    Inhalt a.txt
    "ABCDEFGH"

    Inhalt b.txt
    "-324893208 0 288842526 55194990 0 "

    Inhalt c.txt
    "à f<¹¡ "

    So ich hoffe jemand kann mir helfen und ich blamiere mich nicht vollständig:( aber auf jeden fall tausend dank für jeden der es überhaupt bishier her geschafft hat.



  • Was glaubst du, warum sollte sich jemand die Mühe machen, einen Fehler in deinem Code zu suchen? Es ist vielleicht wirklich nicht ganz einfach, geb ich zu. Schade, dass es hier keine strengeren Regeln gibt, wie in den meisten anderen Foren. Was hast du denn schon selber gemacht, um den Fehler einzugrenzen? Was genau geht nicht? Du könntest höchstens nach Ideen Fragen, wie man den Fehler eingrenzen kann, und nicht einfach deinen ganzen Code hinklatschen und sagen, so, viel Spass beim Suchen, ich leg erstmal die Füße hoch.



  • - irgendwelche Compilerfeatures abschalten
    - Compilerwarnstufe hochsetzen
    - erst dann wieder hier aufschlagen, wenn 0 Warnungen
    - konkreten Testfall überlegen
    - mit konkreter Fehlerbeschreibung und Frage hier aufschlagen

    -- char c für fgetc muss int sein
    -- fopen(...,"rb") sollte hierbei immer binär sein statt "r"
    -- zu mehr habe ich jetzt keine Lust
    -- ...



  • ok, erst mal bin ich nicht so ein depp der hier einfach sein code reinschreibt und dann die füße hochlegt und die anderen nach seinen Fehlern suchen lässt ich hab die letzten drei stunden nach den Fehler gesucht und alles mögliche abgeändert und ausprobiert.

    zweitens verlange ich nicht das jetzt jemand kommt und sagt genau da ist dein Fehler ich währe in allgemeinen schon sehr dankbar wenn mir jemand der schon mal mit rsa rum gespielt hat mir sagen könnte das mein Fehler vielleicht da liegt bzw. die Möglichkeiten eingrenzt wo der Fehler sein könnte.

    Des weiteren gibt mir mein Compieler keine Warnungen aus, der konkrete Testfall wurde von mir durchgeführt und am ende beschrieben und sehr viel mehr kann ich da leider nicht tun wenn ich genau wüsste wo der Fehler liegt hätte ich das gesagt aber die warheit ist das ich ihn nicht genau eingrenzen kann ich kann lediglich einige vermutungen aufstellen und da währe eine das meine Schlüsselerzeugung fehlerhaft ist aber auch hier muss ich sagen dass ich leider keinen Fehler finde. Aber bevor ich hiuer jetzt nur mit vermutungen und einigen codeschnipsel auftauche wollte ich lieber alles reinschreiben da ich den Fehler nicht eingrenzen kann, könnte ich das würde ich das tun.

    Zu letzt danke für die konspirative kritik von dir wutz ich werd sie umsetzten allerdings dürfte dass nicht erklären dass die Verschlüsselung und entschlüsselung nicht hinhaut.
    Jetzt möchte ich eigentlich nur noch ein was los werden was mir einigemale hier aufgefallen ist nähmlich ob diese latente gewaltbereitschaft in den Forum sein muss ich mein es gibt hier echt super leute die ein schnell und quallitatif hochwertige antworten geben und dann gibt es wiederum welche die einen einfach nur von vornerein schlecht machen, auch wenn man die sprache erst gerade gelernt hat.



  • Hierbei möchte ich noch eine weitere eingrenzung machen:

    Die einzelnen menüs dürften nicht die Fehlerquelle sein ebenso wenig die mathematischen (kann ich mir zumindest nicht vorstellen) wodurch eigentlich nur noch diese Funktion:

    creatersakey(), rsacoded(), rsadecoded() sowie die mathematische Funktion moduloexponentiation() (bei der ich mir auch noch unsicher bin übrig bleibt)

    übrig bleiben.

    Wie gesagt vielen dank an alle die es zumindest probieren mir zu helfen



  • Konstantin1507 schrieb:

    Zu letzt danke für die konspirative kritik von dir wutz [...]

    😃



  • so jetzt kann ich dass ganze noch mehr eingrenzen ich hab mal das wiki beispiel durchgespielt und es liegt eindeutig an der ver und entschlüsselungsfunktion also an rsacoded(...) und rsadecoded(...) und dementsprechend meiner meinung nach könnte der Fehler evtl. auch an der moduloexponentiation(...) Funktion liegen. soweit mein Fortschritt bei der Fehlersuche bzw. eingrenzen.


  • Mod

    Boah! Das ist ja noch nicht einmal eine vollständiges Programm. Das heißt, du erwartest, dass jemand dein mäßig beschriebenes Problem allein durch Anstarren von 600 Zeilen Code löst? Bist du des Wahnsinns? Auch wenn du abstreitest, dass du es so meinst, so ist doch die Faktenlage, dass du hier 600 Zeilen Code mit der Angabe postest, dass da irgendwo ein Fehler drin ist. Und wir dürfen den Fehler nicht einmal nachvollziehen, sondern müssen dir glauben, dass du den relevanten Code korrekt identifiziert hast! Glaubst du, irgendwer wird auch nur in Erwägung ziehen, sich das anzusehen?

    Zumal: 600+ Zeilen (und da kommt ja noch mehr dazu für das Hauptprogramm) für RSA? Wie hast du das denn geschafft?

    edit: Bei genauerem Hinsehen sind davon 350 Zeilen Kommentar. Was die Sache in normale Größenordnungen befördert, aber abschreckend ist es trotzdem.



  • Wenn Dir 0 Warnungen angegeben werden, setz mal die Compiler-Warnstufe hoch. Alleine so Späße wie fgetc mit Rückgabewert char wären Dir bei entsprechender Warnstufe schon gemeldet worden.
    Ansonsten initialisiere mal Deine Variablen.


Anmelden zum Antworten