2016-04-19 13 views
-1

Ich bin nicht wirklich sicher, wie dieses Problem zu nähern:Assembly Vigenère-Chiffre Programm

Für eine bessere Frequenzeigenschaften das Schlüsselwort Buchstaben alle wiederholt nicht haben sollte. Wenn es den Buchstaben A enthält, ist der verschlüsselte Buchstabe derselbe wie der Klartext, obwohl dies nicht unbedingt eine schlechte Sache ist. Um diesen Algorithmus mit einem Stift und Papier zu implementieren, fordern viele Beschreibungen Sie einen Vigenère Square zu bauen. Dies ist jedoch nicht wirklich notwendig, wenn Sie einen Computer verwenden, um die Codierung und Decodierung zu tun. Im Wesentlichen wird das Schlüsselwort immer wieder über den Klartext geschrieben.

Angenommen, das Schlüsselwort ist CRYPTOGRAM.

CRYPTOGRAMCRYPTOGRAMCRYPTOGRAMCRYPTOGRAMCRYPTOGRAMCRYPTOGRAMCRYPTOGR WEHAVEBEENBETRAYEDALLISDISCOVEREDFLYATONCEMEETUSBYTHEOLDTREEATNINEPM

Bedenken Sie, dass die Buchstaben 0 bis 25. Die Buchstaben auf der Oberseite nummeriert sind, bestimmt das Caesar-Chiffre unten für die Buchstaben zu verwenden. C bedeutet also, dass das Alphabet um 2 verschoben wird, A bedeutet Verschiebung um 0 und so weiter. In mathematischer Hinsicht fügen wir die beiden Buchstaben zusammen modulo 26 hinzu. (Das Quadrat wurde verwendet, weil das Konzept der modularen Arithmetik 1553 von Soldaten nicht allgemein verstanden wurde.)

Zum Entschlüsseln der Nachricht wird die gleiche Operation ausgeführt umkehren. Das heißt, der Wert des Schlüsselwortbuchstaben wird subtrahiert und nicht hinzugefügt. Schritt 3. Was ist Ihr Code tun sollten

  1. Der Code sollte STDIN und STDOUT zur Ein- und Ausgabe verwenden. (Dies ist der Standardwert .) Verwenden Sie die Umleitung in der Befehlszeile, um aus einer Datei zu lesen und in eine Datei zu schreiben.

  2. Ihr Code sollte eine Datei öffnen, sie Zeichen für Zeichen lesen und in einem Array speichern.

  3. Wenn Sie zum Ende der Datei erhalten, sollten Sie den Inhalt des Array mit einer Vigenère-Chiffre mit dem Schlüsselwort Kryptogramm kodieren, dann drucken Sie es aus.

  4. Pflegen Sie die Unterscheidung zwischen Groß- und Kleinbuchstaben, und ändern Sie nicht nicht alphabetische Zeichen. Dies ist nicht sehr gut für die Sicherheit von Ihre Nachricht, aber das Ergebnis wird besser aussehen.

  5. Dieses Programm sollte glibc-Funktionen verwenden. Zusätzlich zu printf() benötigen Sie getchar() und putchar().

  6. Angenommen, die Eingabedatei enthält nur ASCII-Text. Machen Sie sich keine Gedanken darüber, was bei Nicht-Textdateien mit passiert.

  7. Sobald der Encoder funktioniert, bauen Sie einen Decoder durch Duplizieren des Codes und Ändern der Addition zu einer Subtraktion.

  8. Wenn Sie printf() verwenden, um das Array auszugeben, denken Sie daran, dass für eine Zeichenfolge ein Nullterminal erforderlich ist.

+3

starten, indem das Problem in kleinere Teile nach unten zu brechen wie "lese eingabe von' stdin' "," verschlüssele eine string "," verschlüssele ein char "," drucke ausgabe an stdout ". –

+0

Die Frage wird mit "c" und "assembly" markiert. Es gibt keine Hinweise in der Frage, dass die Assemblersprache benötigt wird. Alle Verweise auf den Code erwähnen Standard-c-Funktionen. –

+0

Was @ KlasLindbäck sagt, genauso wie jede komplexe Aufgabe. Teile es auf. Es scheint sich teilweise schon aufgeteilt zu haben und mit welcher Unteraufgabe hast du ein Problem? –

Antwort

0

starten, indem das Problem zu brechen in kleineren Teilen nach unten wie „Eingabe von stdin lesen“, „Verschlüsseln einen String“, „Druckausgabe stdout“.

Sie müssen mit dem Modulo-Operator vertraut sein, da Sie ihn in Ihrem Programm mehrmals verwenden müssen.

Wenn Sie eine harte Zeit haben, hier ist ein Weg, um das Problem (es gibt auch andere Möglichkeiten, die genauso gut sind) zu brechen:

/* For printf, getchar etc: */ 
#include <stdio.h> 
/* For isalpha, isupper, islower etc: */ 
#include <ctype.h> 

char encryptChar(char ch, char cypher) { 
    int shiftBy = cypher - 'A'; 
    char encryptedLetter; 

    /* There are 3 cases: uppercase, lowercase, other char */ 
    if (isupper(ch)) { 
     /* add code to encrypt uppercase char */ 
    } else if (islower(ch)) { 
     /* add code to encrypt lowercase char */ 
    } else { 
     /* Other characters stay as they are */ 
     encryptedLetter = ch; 
    } 
    return encryptedLetter; 
} 

char *cypherString = "CRYPTOGRAM"; 

int main(int argc, char **argv) { 
    int ch; 
    int cypherStringLength = strlen(cypherString); 
    int counter = 0; 
    char cypher; 

    while ((ch = getchar()) != EOF) { 
     cypher = cypherString[counter%cypherStringLength]; 
     ch = encryptChar(ch, cypher); 
     /* Add code to print the character */ 

     counter++; 
    } 
    return 0; 
} 
+0

Leider habe ich es nicht erwähnt, aber ich muss den Code in Assembly schreiben – user142743

+0

Sie haben noch nicht angegeben, was Ihr Problem ist. Ist es der Algorithmus oder ist es Assembler? Wenn es der Algorithmus ist, könnte meine Antwort hilfreich sein. Wenn es eine Assemblersprache ist, schlage ich vor, dass Sie mit ein paar einfachen Übungen beginnen und dann einen weiteren Versuch machen. –