JavaRush /Java-Blog /Random-DE /Harvard CS50: Aufgaben für Woche 2 (Vorlesungen 5 und 6)
Masha
Level 41

Harvard CS50: Aufgaben für Woche 2 (Vorlesungen 5 und 6)

Veröffentlicht in der Gruppe Random-DE
CS50-Aufgaben für die Vorlesungen 5 und 6 Die CS50-Vorträge finden Sie hier: https://cdn.javarush.com/images/article/155cea79-acfd-4968-9361-ad585e939b82/original.pngcs50.html . Dieses Material enthält 3 Aufgaben, theoretische Informationen dazu und eine Handlungsanleitung.

Ziele

• Tauchen Sie tiefer in Funktionen und Bibliotheken ein. • Machen Sie sich mit der Kryptographie vertraut und implementieren Sie ein paar einfache Chiffren

Zusätzliche Materialien

https://reference.cs50.net/ – Erläuterung der während des Trainings verwendeten Bibliotheksfunktionen. Auf Englisch. http://computer.howstuffworks.com/c.htm Seiten 11 – 14 und 39

Vorbereitung

Melden Sie sich bei cs50.io an update50 , um sicherzustellen, dass Ihre Workspace-Version auf dem neuesten Stand ist. Wenn Sie das Terminalfenster versehentlich schließen, gehen Sie zum Menü „Ansicht“ und stellen Sie sicher, dass neben dem Konsolenelement ein Häkchen gesetzt ist (markieren Sie es, wenn dies nicht der Fall ist). Harvard CS50: Aufgaben der zweiten Woche (Vorlesungen 5 und 6) – 1 Klicken Sie auf (+), wählen Sie innerhalb des grünen Kreises im Rahmen des Terminalfensters „Neues Terminal“ aus . Harvard CS50: Aufgaben der zweiten Woche (Vorlesungen 5 und 6) – 2 Erstellen Sie ein Arbeitsverzeichnis: Beachten Sie, dass zwischen mkdir und ~/workspace/pset2mkdir ~/workspace/pset2 ein Leerzeichen steht . Um es noch einmal zusammenzufassen: ~ bedeutet das Stammverzeichnis, ~/workspace ist ein Ordner namens workspace innerhalb des Stammverzeichnisses, ~/workspace/pset2 ist ein Verzeichnis namens pset2 innerhalb von ~/workspace . Führen Sie nun Folgendes aus: um in das neue Verzeichnis zu wechseln. Die Befehlszeile sieht in etwa so aus: Wenn etwas nicht stimmt, wiederholen Sie die Schritte. Sie können auch einen Befehl aufrufen , um die letzten Befehle in chronologischer Reihenfolge anzuzeigen. Sie können Ihren Cursor auch auf der Befehlszeile platzieren und den Aufwärtspfeil auf Ihrer Tastatur drücken, um alle Befehle in der Reihenfolge vom zuletzt eingegebenen bis zum ersten anzuzeigen. Mit der Abwärtstaste gelangen Sie zurück. Anstatt jedes Mal die gleichen Befehle einzugeben, können Sie übrigens durch die bereits eingegebenen Befehle scrollen und diese erneut ausführen, indem Sie die Eingabetaste drücken. Sie haben vielleicht bemerkt, dass David in seinen Vorlesungen genau das tut. Die Aufgaben der zweiten Woche sollten in pset2 gespeichert werden . cd ~/workspace/pset2username:~/workspace/pset2 $history

Aufgabe 0. Initialisierung

Schauen wir uns die Linien genauer an. Schreiben Sie in der Datei initials.c ein Programm, das den Namen des Benutzers anfordert (mit der GetString-Funktion erhalten wir den Namen als Zeichenfolge) und dann die ersten Buchstaben des Vornamens (oder der Namen) und des Nachnamens in Großbuchstaben ohne Leerzeichen anzeigt. Punkte oder andere Zeichen, nur mit Zeilenvorschub ( \n ). Wir gehen davon aus, dass Benutzer nur Buchstaben (Klein- oder Großbuchstaben oder beides) plus ein Leerzeichen zwischen den Wörtern eingeben. Bedenken Sie, dass Leute namens Joseph Gordon-Levitt, Conan O'Brien oder David J. Malan das Programm nicht verwenden werden. Um den korrekten Betrieb des Programms zu überprüfen, rufen Sie check50 auf: Möchten Sie mit der von den CS50-Mitarbeitern vorbereiteten Implementierung des Programms spielen? Geben Sie die Zeile ein: username:~/workspace/pset2 $ ./initials Zamyla Chan ZC username:~/workspace/pset2 $ ./initials robert thomas bowden RTBcheck50 2015.fall.pset2.initials initials.c~cs50/pset2/initials
Kryptographie
Kryptographie, die Wissenschaft der Verschlüsselung und Entschlüsselung von Informationen... Tatsächlich gibt es verschlüsselte Nachrichten seit der Antike und wurden von Armeen zur Übermittlung geheimer Nachrichten verwendet. Nun werden Ihre Passwörter auf Facebook und anderen Netzwerken verschlüsselt gespeichert.

Aufgabe 1. Heil, Cäsar!

Theoretische Informationen
Wir werden eine der einfachsten Chiffren studieren – die Caesar-Chiffre, benannt nach dem römischen Kaiser. Bei dieser Chiffre wird jeder Buchstabe des Textes durch einen anderen ersetzt, der eine feste Anzahl von Buchstaben weiter unten im Alphabet liegt. Diese feste Anzahl von Buchstaben wird als Schlüssel bezeichnet . Schlüssel 1 wandelt also den lateinischen Buchstaben C in den Buchstaben D und Z durch den Zyklus in A um. Wenn der Schlüssel 3 ist, dann wandelt sich der Buchstabe C in F und Z in C um. Beispiele: Wir verwenden die Caesar-Chiffre mit Schlüssel 5 zum Wort Katze. c -> h a -> f t -> y Caesar (cat, 5) = hfy Schlüssel = 7, Wort = Computer c->j o->v m->t p->w u->b t->a e->l r->y Caesar(computer,7) = jvtwbaly Harvard CS50: Aufgaben für Woche 2 (Vorlesungen 5 und 6) – 3 Die Caesar-Chiffre ist einfach, aber leider unzuverlässig (das sind miteinander verbundene Dinge!): Für das englische Alphabet gibt es nur 25 Verschlüsselungsoptionen, es ist auch ohne Computer einfach, alle Optionen durchzugehen. Die Caesar-Chiffre wird jedoch häufig als Schritt in anderen Chiffren verwendet, beispielsweise in der Vigenère-Chiffre (mehr dazu im nächsten Absatz). Lassen Sie uns die Caesar-Chiffre „mathematisieren“. Bezeichnen wir den Klartext mit dem Buchstaben p, pi ist der Buchstabe im Text p, der an der Positionsnummer i steht. Nennen wir den Geheimschlüssel den Buchstaben k, c den Chiffretext und ci den Buchstaben im Chiffretext, der sich an Position i befindet. Dann können Sie jeden Buchstaben der Chiffre anhand der Formel berechnen: ci = (pi + k) % 26 Gewöhnen Sie sich an diese Formalisierung, sie ermöglicht Ihnen, den Algorithmus zu programmieren und die Bedeutung der Chiffre genau und prägnant auszudrücken. Wenn der Schlüssel k = 13 und der Originaltext p „Trinken Sie unbedingt Ihre Ovomaltine!“ lautet, erhalten wir folgende Chiffre: Or fher gb qevax lbhe Binygvar! Beachten Sie, dass O (der erste Buchstabe im Chiffretext) um 13 Positionen gegenüber dem Buchstaben B (dem …) verschoben ist erster Buchstabe im Originaltext). Das Gleiche gilt für den Buchstaben r (der zweite Buchstabe in der Verschlüsselung), der um 13 Buchstaben gegenüber e (dem zweiten Buchstaben im Original) verschoben ist. Der dritte Buchstabe in der Verschlüsselung, f, ist gegenüber s (dem dritten im Original) um 13 Buchstaben verschoben, hier geht es im Kreis von z nach a. Eine Caesar-Chiffre mit Schlüssel 13 hat den speziellen Namen ROT13 . Es ist symmetrisch: Bei zweimaliger Anwendung kehren wir zum Originaltext zurück. Natürlich gibt es auch ROT26, dieser ist generell supersicher, aber nur, wenn man seine Gedanken nicht klar ausdrückt =).
Zustand
Schreiben Sie in die Datei caesar.c ein Programm, das Text mit der Caesar-Chiffre verschlüsselt. Geben Sie ein Befehlszeilenargument als Eingabe für das Programm an: eine nicht negative Ganzzahl. Nennen wir es der Einfachheit halber k. Wenn der Benutzer das Programm ohne Befehlszeilenargumente oder mit mehr als einem Argument ausführt, sollte sich die Anwendung beschweren und den Wert 1 zurückgeben (so werden Fehler normalerweise bezeichnet): In return 1; allen anderen Fällen fordert das Programm den Benutzer zur Eingabe des Textes auf zu verschlüsseln, und zeigt dann den mit dem Schlüssel k verschlüsselten Text an (d. h. entlang des Zyklus um k Positionen nach rechts verschoben). Wenn der Text Zeichen enthält, die außerhalb des englischen Alphabets liegen, werden diese vom Programm nicht geändert. Nach dem Drucken des Geheimtextes wird die Anwendung beendet, main gibt 0 zurück: return 0; Wenn main nicht explizit Null zurückgibt, wird diese automatisch zurückgegeben (int ist eigentlich der Rückgabetyp von main, aber dazu ein anderes Mal mehr). Gemäß der Konvention (den Regeln des guten Tons in der Programmierung) sollten Sie, wenn Sie explizit 1 zurückgeben, um einen Fehler anzuzeigen, auch 0 als Zeiger auf den erfolgreichen Abschluss des Programms zurückgeben. Obwohl es im englischen Alphabet nur 26 Buchstaben gibt, kann k größer als 26 sein. Im Wesentlichen liefert der Schlüssel k = 27 das gleiche Ergebnis wie k = 1, Sie müssen dem Benutzer jedoch die Eingabe nicht negativer Zahlen ermöglichen größer als 2^31 – 26 (es muss in int passen). Das Programm muss außerdem berücksichtigen, dass Kleinbuchstaben in Kleinbuchstaben und Großbuchstaben in Großbuchstaben verschlüsselt werden. Wo fangen wir an? Da die Anwendung den Wert von k direkt im Argumentstring akzeptieren muss, sieht unser Hauptfunktionsheader so aus: int main(int argc, string argv[]) Aus Kapitel 6 wissen Sie, dass argv ein Array von Strings ist. Die Anordnung kann man sich wie eine Reihe von Schließfächern in einem Fitnessstudio vorstellen. Jeder von ihnen hat eine verborgene Bedeutung. In unserem Fall gibt es in jeder Zelle ein Argument wie: string Um das erste Schließfach zu öffnen, verwenden wir argv[0], das zweite - argv[1] und so weiter. Wenn wir n Sperren haben, müssen wir bei argv[n - 1] anhalten, da argv[n] nicht mehr existiert (oder existiert, aber jemand anderem gehört, wir sollten es besser nicht anfassen). Sie können also wie folgt auf das Argument k zugreifen: string k = argv[1]; Wir glauben, dass da wirklich etwas ist! Denken Sie daran, dass argc eine int-Variable ist, die der Anzahl der Zeilen in argv entspricht. Dies bedeutet, dass es besser ist, den Wert von argc zu überprüfen, bevor Sie versuchen, die Zelle zu öffnen, da sich möglicherweise herausstellt, dass sie nicht vorhanden ist. Idealerweise ist argc = 2. Warum ist das so? In argv[0] steht normalerweise der Name des Programms. Das heißt, argc ist immer mindestens 1. Unser Programm benötigt jedoch, dass der Benutzer ein Befehlszeilenargument k bereitstellt, daher ist argc = 2. Wenn der Benutzer mehr als ein Argument in die Befehlszeile eingibt, wächst natürlich auch argc und kann dies tun größer als 2 sein Wenn der Benutzer eine Ganzzahl in eine Zeichenfolge eingibt, bedeutet dies nicht, dass der eingegebene Wert automatisch als Ganzzahl gespeichert wird. Genauer gesagt, das wird NICHT der Fall sein. Es wird ein String sein, auch wenn er genau wie ein int aussieht! Also müssen wir den String selbst in int konvertieren. Glücklicherweise gibt es für diesen Zweck eine Funktion namens atoi. Die Syntax lautet: int k = atoi(argv[1]); Beachten Sie, dass k vom Typ int ist, sodass Sie damit rechnen können. Mit dieser Funktion müssen Sie sich keine Gedanken darüber machen, ob der Benutzer eine Ganzzahl oder beispielsweise foo eingibt: In diesem Fall gibt atoi 0 zurück. Die atoi-Funktion ist in der stdlib.h- Bibliothek deklariert . Stellen Sie daher sicher, dass # Fügen Sie es am Anfang des Programms ein. Der Code wird ohne dies kompiliert, da wir diese Funktion bereits in die cs50.h- Bibliothek aufgenommen haben . Es ist jedoch besser, nativen Bibliotheken zu vertrauen. Sie haben also k als int gespeichert. Lassen Sie uns nun um eine Texteingabe bitten. Wenn Sie die Aufgaben der ersten Woche erledigt haben, sind Sie bereits mit der CS50-Bibliotheksfunktion namens GetString vertraut. Sie wird uns helfen. Nachdem Sie k und den Anfangstext erhalten haben, beginnen wir mit der Verschlüsselung. Um es noch einmal zusammenzufassen: Sie können alle Zeichen einer Zeichenfolge durchlaufen und sie mithilfe der folgenden Schleife ausgeben: for (int i = 0, n = strlen(p); i < n; i++) { printf("%c", p[i]); } Mit anderen Worten: Genau wie argv ein Array von Zeichenfolgen ist, ist string ein Array von Zeichen. Daher können wir eckige Klammern verwenden, um auf einzelne String-Elemente zuzugreifen, genauso wie wir einzelne Strings in argv erhalten. Natürlich ist das Drucken jedes einzelnen Zeichens nicht kryptographisch. Oder technisch gesehen, wenn k = 0. Aber wir müssen Caesar helfen, seinen Text zu verschlüsseln! Heil, Cäsar! Um strlen verwenden zu können, müssen Sie eine weitere Bibliothek einbinden . Da wir einige Validierungstests automatisieren, sollte sich das Programm genau so verhalten: username:~/workspace/pset2 $ ./caesar 13 Be sure to drink your Ovaltine! Or fher gb qevax lbhe Binygvar! Neben atoi finden Sie weitere coole Funktionen in den Bibliotheken ctype.h und stdlib.h . Folgen Sie dazu dem Link und stöbern Sie dort ein wenig herum. Zum Beispiel ist isdigit eindeutig etwas Interessantes =). Wenn Sie von Z nach A (oder von z nach a) wechseln, vergessen Sie nicht den Modulo-Operator %in der Sprache C. Studieren Sie auch die Tabelle , sie zeigt ASCII-Zeichen nicht nur für Buchstaben. Um zu überprüfen, ob das Programm mit check50 korrekt funktioniert , gehen Sie wie folgt vor: check50 2015.fall.pset2.caesar caesar.c Und wenn Sie daran interessiert sind, mit dem von den CS50-Mitarbeitern erstellten Code zu spielen, führen Sie den Befehl aus: ~cs50/pset2/caesar Übrigens, uggc://jjj.lbhghor.pbz/jngpu ?i=bUt5FWLEUN0 .
Analyse der Aufgabe
  1. Hol den Schlüssel
  2. Holen Sie sich Text
  3. Verschlüsseln
  4. Eine verschlüsselte Nachricht anzeigen
1. Wir bilden die Hauptfunktion so, dass der Benutzer den Schlüssel in der Befehlszeile eingibt und den Schlüssel auf Richtigkeit überprüft. int main(int argc, string argv[]) argc: • int • Anzahl der in der Befehlszeile eingegebenen Argumente • wenn argc = 2 ist alles in Ordnung. Wenn nicht, drucken Sie die Anleitung aus und schließen Sie das Programm. • Wenn argc = 2, prüfen wir, ob der Schlüssel eine Ganzzahl ist. • Argv ist ein Array von Zeichenfolgen, eine Liste mit darin eingegebenen Argumenten. Array ist eine Datenstruktur, die verschiedene Daten desselben Typs in verschiedenen Zellen enthält. Harvard CS50: Aufgaben der zweiten Woche (Vorlesungen 5 und 6) – 4 Der Benutzer hat beispielsweise die Zeichenfolge „Blaststoff Team Rocket“ eingegeben und dann: Harvard CS50: Aufgaben der zweiten Woche (Vorlesungen 5 und 6) – 5 Mit der Funktion „atoi()“ konvertieren wir die resultierende Zahl in eine Ganzzahl. Wenn dies nicht möglich ist, gibt die Funktion 0 zurück. Harvard CS50: Aufgaben der zweiten Woche (Vorlesungen 5 und 6) – 6 2. Fordern Sie den Benutzer zur Texteingabe auf. Es ist ganz einfach: Alles, was der Benutzer eingibt, ist eine Zeichenfolge. 3. Verschlüsselung. Der Algorithmus ist einfach, aber wie kann man dem Computer erklären, welche Buchstaben nacheinander kommen? Es ist Zeit, sich an die ASCII-Tabelle zu erinnern! Harvard CS50: Aufgaben der zweiten Woche (Vorlesungen 5 und 6) – 7 Eine Zeichenfolge kann jedoch mehr als nur Buchstaben enthalten ... Bevor Sie mit dem Ändern von Zeichenfolgen fortfahren, stellen Sie sich vor, dass Sie nur ein Zeichen ändern müssen. Wir möchten die Buchstaben des ursprünglichen Textes ändern, nicht die Zeichen oder Zahlen. Was sollen wir machen? Zuerst müssen wir prüfen, ob dieses Zeichen im Alphabet vorkommt. Dies kann mit der Funktion isalpha() erfolgen . Wenn das Zeichen im Alphabet ist, gibt diese Funktion „true“ und andernfalls „false“ zurück. Zwei weitere nützliche Funktionen – isupper() und islower() – geben „true“ zurück, wenn der Buchstabe groß bzw. klein geschrieben ist. Also: Isalpha(‘Z’) -> true Isalpha(‘;’) -> false Isupper(‘Z’) ->true Isupper(‘z’) -> false Islower(‘Z’) -> false Islower(‘z’)->true Wenn isalpha true zurückgibt, müssen wir dieses Zeichen mit dem Schlüssel ändern. Betrachten und analysieren wir als Beispiel das Programm von Zamili, dem CS50-Assistenten. Sie fragen sich vielleicht, warum „A“ eine Ganzzahl ist, obwohl es sich eindeutig um einen Buchstaben handelt. Es stellt sich heraus, dass Symbole und ganze Zahlen austauschbar sind. Indem Sie den Buchstaben A in einfache Anführungszeichen setzen, erhalten Sie seinen ASCII-Code in int. Seien Sie vorsichtig: Sie benötigen einfache Anführungszeichen. Ohne diese sucht der Compiler nach einer Variablen namens A und nicht nach einem Symbol. Anschließend fügen wir den Schlüsselwert zum ASCII-Code des Buchstabens hinzu und speichern ihn in einer Ganzzahlvariablen. Auch wenn das Ergebnis ein int ist, verwendet die printf-Anweisung den %c-Platzhalter für Zeichen. Das Programm gibt also das Zeichen aus, das dem ganzzahligen Ergebnis zugeordnet ist. Im zweiten Fall zeigen wir die Zahl mit dem Platzhalter %d an. Sie können diesen Code in die CS50-IDE eingeben und damit spielen. Sehen wir uns an, wie Asciimath für verschiedene Tasten funktioniert. Nehmen wir den Wert 25, dann sehen wir folgendes Bild: Und jetzt sei der Schlüssel 26: Wir haben [ und überhaupt nicht den Buchstaben A. Es ist nur das nächste ASCII-Zeichen nach Z. Das einfache Hinzufügen des Schlüssels reicht also nicht aus arbeiten. Wir müssen eine Chiffrierformel verwenden, um zum Anfang des Alphabets zurückzukehren, sobald uns die Buchstaben ausgehen. Denken Sie daran, wir haben oben bereits geschrieben: /* * asciimath.c * by Zamyla Chan * * Calculates the addition of a char and an integer, * and displays both the resultant character and its * ASCII value. * * Usage: ./asciimath key [char] * */ #include #include #include int main(int argc, string argv[]) { if (argc != 2) { printf("print the key next time \n"); return 1; } // key is the second command line argument int key = atoi(argv[1]); //преобразование строки в int int letter = 'A'; printf("\nCalculating '%c' + %d...\n", letter, key); int result = (letter + key); printf("The ASCII value of %c is %d.\n\n", result, result); return 0; } int result = (letter + key);Harvard CS50: Aufgaben der zweiten Woche (Vorlesungen 5 und 6) – 8Harvard CS50: Aufgaben der zweiten Woche (Vorlesungen 5 und 6) – 9ci = (pi + k) % 26 Dabei ist ci der Buchstabe Nummer i im Chiffretext, pi der Buchstabe Nummer i im Klartext, k der Schlüssel und %26 der Rest der Division durch 26 (oder „Modulo 26“). Wenden wir diese Formel auf den Buchstaben Y an. Nehmen wir k = 2. Berechnen Sie ('Y' + 2) %26 ASCII-Code des Buchstabens 'Y' = 89. Dann ist ('Y' + 2) %26 = (89 + 2 )% 26 = 91%26 = 13 Dies ist jedoch nicht der ASCII-Wert des Buchstabens A, den wir benötigen, nämlich 65. Nun geben wir jedem Buchstaben des Alphabets der Reihe nach einen Wert von 0 bis 25. In diesem Fall ist Y = 24. (24+2)%26 = 0 Der Buchstabe A hat genau einen solchen Index. Daher bezieht sich diese Formel auf den alphabetischen Index der Buchstaben und nicht auf deren ASCII-Werte. Um ein verschlüsseltes Zeichen zu drucken, benötigen Sie seinen ASCII-Wert. Und finden Sie heraus, wie Sie zwischen einem ASCII-Wert und einer Zahl im Alphabet wechseln können. Sobald wir die Formel für ein Zeichen herausgefunden haben, müssen wir sie auf jeden Buchstaben in der über die Tastatur eingegebenen Zeichenfolge anwenden. Aber nur, wenn es sich um Buchstaben handelt! Und denken Sie daran, dass Groß- und Kleinbuchstaben unterschiedliche Bedeutungen haben. Hier kommen die Funktionen isupper und islower zum Einsatz. Möglicherweise verfügen Sie über zwei Formeln, eine für Großbuchstaben und eine für Kleinbuchstaben. Funktionen helfen Ihnen bei der Auswahl der anzuwendenden Formel. Wie wende ich eine Formel auf jedes einzelne Zeichen in einer Zeichenfolge an? Denken Sie daran, dass eine Zeichenfolge nur ein Array von Zeichen ist. Mit der Funktion strlen (Stringlänge) können Sie die Anzahl der Iterationen in einer Schleife bestimmen .Harvard CS50: Aufgaben der zweiten Woche (Vorlesungen 5 und 6) – 10

Aufgabe 2. Parlez-vous français?

Theorie
Die Vigenère-Chiffre ist etwas sicherer als die Caesar-Chiffre: Sie verwendet ein Wort als Schlüssel und lässt sich nur schwer manuell mit Frequenzanalyse oder roher Gewalt knacken. Jeder Buchstabe der Taste generiert eine Zahl, und als Ergebnis erhalten wir mehrere Tasten zum Verschieben von Buchstaben. Beispiel: p = Meet me in the park at eleven am В качестве ключевого слова возьмем k = bacon Длина Mitteilungen p = 25 В то время Wie длина k = 5 Поэтому его нужно повторять 5 раз. Harvard CS50: Aufgaben der zweiten Woche (Vorlesungen 5 und 6) – 11 Wenn die Anzahl der Buchstaben in der Nachricht nicht durch den Schlüssel teilbar ist, verwenden wir bei der letzten Anwendung des Schlüssels nur einen Teil davon: Harvard CS50: Aufgaben der zweiten Woche (Vorlesungen 5 und 6) – 12 Um den Wert für den Offset zu ermitteln, verwenden wir die Positionen jedes Buchstabens unseres Bacon-Schlüssels im Alphabet (von a bis z). Wir zählen von Grund auf, wie echte Programmierer. Und jeder Buchstabe im Originaltext wird um eine bestimmte Zahl verschoben, wie in der Caesar-Chiffre, und kehrt bei Bedarf nach Z zum Anfang des Alphabets zurück. M bewegt sich also um 1, das erste e bewegt sich überhaupt nicht und das zweite e bewegt sich um 2 Positionen. Unten sehen Sie die Originalnachricht, den geschriebenen Schlüssel und das Ergebnis seiner Anwendung. Harvard CS50: Aufgaben der zweiten Woche (Vorlesungen 5 und 6) – 13 Die Vigenère-Chiffre ist natürlich stärker, aber wenn man die Länge des Schlüssels kennt, ist sie recht leicht zu knacken. Wie erkennt man es? Wenn der Originaltext lang genug ist, dass einige Wörter darin mehrmals vorkommen, werden Sie einige Wiederholungen sehen: Sie Harvard CS50: Aufgaben der zweiten Woche (Vorlesungen 5 und 6) – 14 können auch rohe Gewalt anwenden, aber es gibt viele Optionen: 26^n – 1 wobei n die Länge des unbekannten Schlüssels ist . Aber normalerweise ist das eine Menge. Für einen Computer ist das zwar kein Problem. Und nun die Mathematik der Chiffre: Sei p ein Text, k das Schlüsselwort, kj der j-te Buchstabe des Schlüssels, pi die Buchstabenzahl i im Originaltext, ci die Buchstabenzahl i in der Verschlüsselung . Dann: ci = (pi + kj) % 26
Übung
Bedingung: Schreiben Sie ein Programm vigenere.c, das eine Nachricht mit der Vigenere-Chiffre verschlüsselt. Wir liefern ein Befehlszeilenargument an die Programmeingabe: das Schlüsselwort k, bestehend aus Buchstaben des englischen Alphabets. Wenn die Anwendung mit mehr als einem Argument oder einem Argument gestartet wird, das nicht im Alphabet enthalten ist, müssen Fehlerinformationen angezeigt und das Programm beendet werden. Das heißt, main gibt 1 zurück – in diesem Fall erkennen unsere automatischen Tests, dass hier alles in Ordnung ist, und diese Bedingung wird berücksichtigt. Wenn alles in Ordnung ist, sollte das Programm damit fortfahren, eine Textzeichenfolge p anzufordern, die wir mit dem oben erhaltenen Schlüssel k verschlüsseln, das Ergebnis ausdrucken und das Programm beenden, wobei der Wert 0 zurückgegeben wird. Klarstellung Es muss sichergestellt werden, dass im Schlüssel k werden die Zeichen A und a als 0, B und b als 1, ..., Z und z als 25 bezeichnet. Das Programm darf die Vigenère-Chiffre nur auf die Buchstaben des Textes p anwenden. Die restlichen Zeichen (Zahlen, Satzzeichen, Leerzeichen) müssen unverändert ausgegeben werden. Wenn der Algorithmus das j-te Zeichen k auf das i-te Zeichen p anwenden soll , das nicht im Alphabet ist, wenden Sie dieses j-te Schlüsselzeichen auf das nächste alphabetische Zeichen im Text an; Sie können es nicht einfach verlassen und zu einem anderen Charakter in k übergehen. Schließlich muss das Programm die Groß-/Kleinschreibung jedes Buchstabens in p beibehalten .
Sie wissen nicht, wo Sie anfangen sollen?
Harvard CS50: Aufgaben der zweiten Woche (Vorlesungen 5 und 6) – 15
Hier sind einige Tipps von Zamilya, CS50-Kursassistentin
Glücklicherweise ist das Programm der Caesar-Chiffre sehr ähnlich, nur dass der Schlüssel eine Zeichenfolge und keine ganze Zahl ist. Wenn Sie die Namensverschlüsselung des römischen Herrschers erfolgreich implementiert haben, kann dies ein guter Start für die zweite Aufgabe sein. Sie haben wahrscheinlich bereits erkannt, dass die Vigenère-Chiffre mit einem Buchstaben als Schlüssel mit der Caesar-Chiffre identisch ist. Der Vigenère-Algorithmus verwendet die gleichen Schritte wie Caesar:
  1. Hol den Schlüssel
    • Codewort ist das zweite Befehlszeilenargument argv[1]
    • muss im Alphabet sein: isalpha-Funktion
  2. Holen Sie sich Text
  3. Verschlüsseln
  4. Geheimtext drucken
Schauen wir uns also das zweite Befehlszeilenargument argv[1] an, um zu sehen, ob es zu alphabetischen Zeichen gehört. Wir tun dies mit dem bereits bekannten isalpha . Wenn der Schlüssel korrekt ist, erhalten wir vom Benutzer eine Zeichenfolge und beginnen mit der Verschlüsselung. Die Vigenère-Chiffrierformel ähnelt der Caesar-Chiffrierformel. Wie konvertiert man einen Buchstaben in den entsprechenden Chiffre-Offset? Versuchen Sie, die Werte mithilfe der ASCII-Tabelle zu vergleichen. Harvard CS50: Aufgaben der zweiten Woche (Vorlesungen 5 und 6) – 16 Höchstwahrscheinlich können Sie anhand der Reihenfolgen in der Tabelle ein Muster zwischen den Buchstaben und ihren alphabetischen Indizes finden. Haben Sie herausgefunden, wie man einen Buchstaben vom anderen subtrahiert, um das gewünschte Ergebnis zu erhalten? Die Versätze für Groß- und Kleinbuchstaben sind gleich, daher müssen Sie zwei ähnliche Formeln definieren, um den Versatz für Kleinbuchstaben und separat für Großbuchstaben zu ermitteln. Denken Sie auch daran, dass die Textschleife nicht-englische Zeichen ignorieren sollte. Und vergessen Sie nicht, die Groß-/Kleinschreibung aufzubewahren. Wenn Sie sich die Chiffrierformel ansehen, ci = (pi + kj) % 26 sehen Sie zwei Indexvariablen, i und j. Der eine speichert die Position im Quelltext, der andere im Schlüssel. Wenn Ihr Text länger als der Schlüssel ist, reicht der Index des Schlüssels vom Ende des Schlüssels zurück zum Anfang. Wie kann man das machen? Verwendung der Modulo-Divisionsoperation! Das Ergebnis der Operation ist der Rest der Division zweier Zahlen. Der praktische Nutzen dieser Operation in der Programmierung ist einfach enorm! Stellen Sie sich vor, dass eine große Gruppe von Menschen in drei Untergruppen aufgeteilt werden muss. Eine Möglichkeit, dies zu tun, besteht darin, sie zu bitten, für den ersten, zweiten und dritten Betrag zu zahlen. Harvard CS50: Aufgaben der zweiten Woche (Vorlesungen 5 und 6) – 17 Das heißt, der erste gehört zur ersten Gruppe, der zweite zur zweiten, der dritte zur dritten, der vierte wieder zur ersten und so weiter. Sie können die Modulo-Division verwenden, um denselben Vorgang auszuführen. Lassen Sie uns die gleichen drei Gruppen von Grund auf nummerieren. So geht's: Harvard CS50: Aufgaben der zweiten Woche (Vorlesungen 5 und 6) – 18 Wenn Sie einen Index nehmen und ihn modulo durch den Maximalwert dividieren, wird das resultierende Ergebnis niemals größer oder gleich diesem Wert sein. Probieren Sie dieses Prinzip aus, um ein Schlüsselwort an den Anfang zurückzubringen! Anstatt nach Gruppen zu sortieren, benötigen Sie jedoch den Index des Schlüsselworts, damit Sie den richtigen Buchstaben versetzen können, ohne die Schlüssellänge zu überschreiten. Da wir einige Tests Ihres Codes automatisieren, sollte sich das Programm wie folgt verhalten: jharvard@appliance (~/Dropbox/pset2): ./vigenere bacon Meet me at the park at eleven am Negh zf av huf pcfx bt gzrwep oz Wie können Sie das Programm sonst noch testen, außer den Chiffretext manuell zu berechnen? Wir sind nett: Dafür haben wir das Programm devigenere geschrieben . Es benötigt ein und nur ein Befehlszeilenargument (Schlüsselwort) und seine Aufgabe besteht darin, Chiffretext als Eingabe zu verwenden und Klartext zurückzugeben. Führen Sie es aus: ~cs50/pset2/devigenere k Wobei k das Schlüsselwort ist. Wenn Sie die Korrektheit Ihres Programms mit check50 überprüfen möchten, führen Sie Folgendes aus: check50 2014.fall.pset2.vigenere vigenere.c Und wenn Sie unsere Vigenere-Implementierung bewerten möchten, geben Sie Folgendes ein: ~cs50/pset2/vigenere

So validieren Sie Ihren Code und erhalten Noten

Aufmerksamkeit! Wenn es für Sie wichtig ist, nur die Richtigkeit von Aufgaben zu überprüfen, dann verwenden Sie cs50check. Wenn Sie Noten auf der edx-Plattform erhalten möchten, befolgen Sie die unten beschriebene Vorgehensweise. Beachten Sie, dass dieses Verfahren denselben cs50check zum Überprüfen von Aufgaben verwendet. Der einzige Unterschied besteht darin, dass es sich die Ergebnisse merkt und die Gesamtpunktzahl berechnet.
  1. Melden Sie sich bei der CS50-IDE an
  2. Klicken Sie in der oberen linken Ecke der CS50-IDE , wo sich der Dateibrowser befindet (nicht im Terminalfenster), mit der rechten Maustaste auf Ihre initials.c- Datei im pset2- Verzeichnis und klicken Sie auf „Herunterladen“ . Sie sollten sehen, dass der Browser initials.c geladen hat .
  3. Wiederholen Sie dies für caesar.c .
  4. Wiederholen Sie dies für vigenere.c .
  5. Melden Sie sich in einem separaten Fenster oder Tab bei CS50 Submit an
  6. Klicken Sie auf das Senden- Symbol in der oberen linken Ecke des Bildschirms. Harvard CS50: Aufgaben der zweiten Woche (Vorlesungen 5 und 6) – 19
  7. Klicken Sie in der Ordnerliste auf der linken Seite auf das Verzeichnis „Problem Set 2“ und dann auf die Schaltfläche „Neue Einreichung hochladen“ . Es ist auf der rechten Seite. Harvard CS50: Aufgaben der zweiten Woche (Vorlesungen 5 und 6) – 20
  8. Klicken Sie auf dem angezeigten Bildschirm auf die Schaltfläche Dateien hinzufügen .... Es öffnet sich ein Fenster zum Auswählen von Dateien von Ihrem Computer. Harvard CS50: Aufgaben der zweiten Woche (Vorlesungen 5 und 6) – 21
  9. Navigieren Sie zu dem Ordner, in dem Sie initials.c aufbewahren . Es befindet sich höchstwahrscheinlich in Ihrem Download- Ordner oder dort, wo Ihr Browser standardmäßig Dateien ablegt. Wenn Sie initials.c finden , klicken Sie einmal darauf, um es auszuwählen, und klicken Sie dann auf Öffnen.
  10. Klicken Sie erneut auf Dateien hinzufügen .
  11. Suchen Sie caesar.c und öffnen Sie es.
  12. Machen Sie dasselbe für die Datei vigenere.c .
  13. Klicken Sie auf Hochladen starten. Ihre Dateien werden auf CS50- Server hochgeladen .
  14. Auf dem angezeigten Bildschirm sollte das Fenster „Keine Datei ausgewählt“ angezeigt werden . Wenn Sie den Mauszeiger nach links bewegen, wird eine Liste der heruntergeladenen Dateien angezeigt. Klicken Sie zur Bestätigung auf die einzelnen Elemente. Wenn Sie sich bei etwas nicht sicher sind, können Sie die Dateien erneut hochladen, indem Sie dieselben Schritte wiederholen. Sie können dies bis Ende 2016 so oft tun, wie Sie möchten.
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION