2016-11-15 17 views
1

Ich versuche derzeit, eine Substitution Verschlüsselung/Entschlüsselungsprogramm zu machen. Dieses Programm liest aus einer Datei und verschlüsselt Zeichen für Zeichen basierend auf einem vom Benutzer angegebenen Schlüssel. Wenn die Datei beispielsweise "ATTACK AT DAWN" lautet und der Schlüssel "LEMON" lautet, lautet der resultierende Chiffretext "LXFOPV EF RNHR".Substitution Verschlüsselung nicht zurück Zeichen

Ich habe eine Funktion für die Verschlüsselung gemacht, ändert jedoch die Werte in andere Zeichen als alphanumerische Buchstaben. Jede Hilfe wäre willkommen. Ich habe die Funktion unten eingefügt:

void encrypt(ifstream& in_s, ofstream& out_s, char next, char& cypher, int& i, char key[]) 
{ 

    in_s.get(next); // get character from file 
    while (!in_s.eof()) 
    { 
      check_i(i); // check i value is within the constraint for key[4] 

      if(isupper(next)) // if uppercase run cypher 
      { 
        cypher = ((next - 65) + (key[i] - 65) % 26) + 65; 
      } 
      else if (islower(next)) 
      { 
        next = toupper(next); // change to upper 
        cypher = ((next - 65) + (key[i] - 65) % 26) + 65; 
        cypher = tolower(cypher); // change to lower 
      } 
      else // if blank do nothing 
      { 
        cypher = next; 
      } 
      cout << cypher; 


      in_s.get(next); // get next char 
      i++; // add 1 to i for key[i] 
    } 
} 

Antwort

0

Sie haben ein Problem mit operator precedence. Der Modulo-Operator % hat eine höhere Priorität als die Addition. Also lassen Sie uns brechen Ihre Summe:

cypher = ((next - 65) + (key[i] - 65) % 26) + 65; 

Dies wird wie folgt verarbeitet werden:

cypher = (next - 65) 
     + ((key[i] - 65) % 26) 
     + 65; 

Was Sie wollten eigentlich war für die Modulo über die ganze Sache zu handeln:

cypher = ((next - 65 + key[i] - 65) % 26) + 65; 

Sie brauchen diese äußere Klammer nicht wirklich, aber sie ist ein wenig einfacher zu lesen.

+0

Ah ich sehe! Danke für die Eingabe. Ich habe das behoben, aber die "verschlüsselten" Zeichen sind immer noch nicht alle alphanumerisch. Ich denke, es könnte etwas mit meiner Schlüsselfunktion nicht stimmen. –

+0

Es ist schwer zu kommentieren, weil Sie nie die _actual_ Ausgabe Ihres Programms gezeigt haben und Sie die Definition der 'check_i' Funktion nicht gezeigt haben. – paddy

0

Das Problem war, wie ich die Eingabe für mein Array bekam. ich versuchte, so etwas zu tun:

cout << "Please enter a 5 character key: "; 
cin >> key[5]; 

Wenn ich so das Array gespeichert haben sollte:

cout << "Please enter a 5 character key: "; 
cin >> key;