Highscores

1. Funktionsweise der Highscoreliste
Das Programm greift im wesentlichen auf zwei Operationen zurück: Für das Lesen der Highscores benutzen wir die Funktion GetHighscore, die die Highscores aus einer Datei (sofern vorhanden) ausliest und in zwei Arrays (jeweils eins für Punkte und Namen) überträgt. Existiert keine Datei, erstellt diese Prozedur eine leere Datei. Das Schreiben der Highscores erfolgt über die Procedure SetHighScore(Name : String, Punkte : Longint). Hierfür müssen die Highscores logischerweise ersteinmal bekannt sein, also erfolgt am Anfang der Procedure ein Aufruf von GetHighscore. Jetzt erfolgt eine Schleife, in der die Highscores eingetragen werden. Das Punkte-Array wird solange durchlaufen, wie die erreichten Punkte größer als die bisherigen Rekorde sind. Gleichzeitig wird in dem Array immer der Vorgänger der Zahl mit der aktuellen Zahl überschrieben. Damit rückt der letzte (und schlechteste) Highscore aus der Liste raus. Wenn die Bedingung der Schleife nicht mehr erfüllt werden kann, wird der Highscore an diese Position im Array kopiert. Schlieslich wird die Highscore-Datei überschrieben (ist also leer) und mit den aktuellen Werten aus den Arrays gespeist.


2. Die Verschlüsselung der Highscoreliste
Die Verschlüsselung der Highscoreliste hat mit der eigentlichen Projektidee wenig zu tun und stellt somit nur eine Art Kür dar. Von den Gedanken ausgehend, dass jeder die Highscorelist mit eine Texteditor öffnen und manipulieren kann, hielten wir es für notwendig diese Datei zu verschlüsseln, damit es unmöglich wird sie sinnvoll zu verändern.
Beim Start des Programms entschlüsselt das Programm die Datei "crypt" und speichert den entschlüsselten Inhalt in "Highsc.001". Mit dieser Datei wird dann während des Spielens gearbeitet. Beim Beenden des Programms wird die "Highsc.001" wieder in "crypt" verschlüsselt und gelöscht. Wenn man das Programm nicht geladen hat, befindet sich auch nur noch die crypt-Datei im selben Ordner. Als Verschlüsselungsverfahren wählten wir Vigenere-Verfahren. Dabei wird der ASCII-Wert jedes Zeichens um eine bestimmte Verschiebungszahl verschoben. Die Verschiebungszahl ergibt sich aus einen Codewort das sich je nach Länge des Textes immer wieder wiederholt. Das Vigenere-Verfahren ist daher nichts weiter als eine Caesarverschiebung, mit den Unterschied das jedes Zeichen anders verschoben wird. Die Schwierigkeit dieses Verfahren zu knacken liegt darin das gleiche Buchstaben im verschlüsselten Text nicht gleich gleiche Buchstaben im Originaltext sind. Die Verschiebungen ergeben sich jeweils aus den Verschiebungen des Codebuchstaben zum kleinen a. Da wir Anfangs das Codewort "Mastermind" wählten, kam somit bei großen M eine negative Verschiebung raus. Da der ASCII-Wert vom großen M vor den vom kleinen a liegt (M=ASCII(77), a=ASCII(97), v=77-97=-20). Daraus resultierte ein Problem:
Wenn man beim Namen in der Highscoreliste ein Punkt eingegeben hatte (ASCII(46)) und dieser Punkt mit der Verschiebung des großen M verschoben wurde entstand im verschlüsselten Text das Zeichen mit den ASCII(26). Die Entschlüsselungsprozedur enthält eine REAPEAT-Schleife mit der Abbruchbedingung "eof=true" enthält. Dass heißt die Zeichen werden solange entschlüsselt bis das Ende der Datei erreicht ist (eof=end of file). Pascal interpretierte den ASCII(26) aber auch als Ende der Datei. Somit wurde immer nur bis dort hin entschlüsselt. Das selbe Problem trat mit den Enterzeichen nach jeden Namen und jedem Punktewert auf. "Enter" hat den ASCII-Wert 13 und ergab mit der Verschiebung des kleinen "n" (Verschiebung=13) ebenfalls ASCII(26). Aus diesen Grund haben wir das Passwort noch mal geändert.

Zurück
Startseite