Download Delphi Vordiplomsprogramm Enigma

Transcript
Delphi Vordiplomsprogramm
Enigma
von Robert Räthel
- Verbesserung -
Fachrichtung
: Medieninformatik
Matrikelnummer
: 2121
Verwaltungs- / Fachsemster
:4
Email
: [email protected]
Enigma
Inhaltsverzeichnis
I.
Benutzerhandbuch
3.
1.
2.
3.
4.
Ablaufbedingungen
Programminstallation
Programmstart
Bedienungsanleitung
3.
3.
3.
4.
4.1
4.2
4.3
4.4
4.5
4.6
4.6.1
4.6.2
4.6.3
4.6.4
4.6.5
4.6.6
4.6.7
4.7
4.8
Hintergrundinformation
Die Enigma (Übersicht)
Das Eingabefeld
Das Ergebnisfeld
Rotoren zurücksetzen
Die Einstellungen (Übersicht)
Plugboard ändern
Rotoren ändern
Umkehrwalze ändern
Übernehmen
Abbrechen
Sichern
Laden
Datei Konvertieren
Voreinstellungen konfigurieren
5.
6.
Wiederanlaufbedingungen
Fehlermeldungen
II.
Programmierhandbuch
1.
2.
Entwicklungskonfiguration
Problemanalyse und Realisation
2.1
2.1.1
2.1.2
2.2
2.2.1
2.2.2
2.2.3
2.2.4
2.3
2.3.1
2.3.2
Problemanalyse
Hauptformular
Formular Einstellungen
Realisierungsanalyse
Datei konvertieren
Plugboard
Steckplätze
Rotoren
Realisierungsbeschreibung
Grundsätzliches
Programmabläufe
4.
5.
5.
5.
6.
6.
6.
7.
7.
8.
8.
8.
8.
8.
9.
9.
10.
11.
11.
11.
11.
11.
11.
12.
12.
12.
13.
13.
14.
14.
14.
Programm-Start
Programm-Ende
Datei konvertieren
Formular „Einstellungen“ öffnen
Plugboard ändern
Einstellungen speichern
Ringe initialisieren
2.3.3
2.4
3.
Chiffrierung
Memory Check (Übersicht)
Datenstrukturen
3.1
3.2
4.
5.
6.
Einstellungen
Rotoren bzw. Ringe
Programmorganisationsplan
Programmtests
Änderungen...
6.1
6.2
-2-
...am Quellcode
...an der Dokumentation
16.
17.
18.
18.
18.
19.
20.
23.
23.
23.
Benutzer- & Programmierhandbuch
I. Benutzerhandbuch
1. Ablaufbedingungen
CPU
Arbeitsspeicher
Monitor
Auflösung
Betriebssystem
: mind. PentiumI mit 200 MHz
: mind. 32 MB
: 17’ oder 19’ – Monitor
: 1024 x 768px (optimal)
: Windows XP, 2000, 98SE
2. Programminstallation
Die Enigma braucht nicht installiert zu werden. Es ist lediglich notwendig den Ordner „Enigma“ von der beiliegenden CD auf die Festplatte zu kopieren.
Legen Sie dazu die CD in das CD-Rom-Laufwerk Ihres Computers. Öffnen Sie den Arbeitsplatz und wählen Sie
Ihr CD-Rom-Laufwerk an. Klicken Sie mit der rechten Maustaste auf den Ordner „Enigma“. Es öffnet sich ein
Kontext-Menü. Wählen Sie den Eintrag „Kopieren“. Schließen Sie den Arbeitsplatz wieder. Klicken Sie nun mit
der rechten Maustaste auf Ihren Desktop. Wieder öffnet sich ein Kontext-Menü. Wählen Sie hier den Eintrag
„Einfügen“. Der Ordner wird auf die Festplatte kopiert. Nach dem Kopiervogang ist die Installation abgeschlossen.
3. Programmstart
Machen Sie zunächst mit der linken Maustaste einen Doppelklick auf den Ordner „Enigma“. Der Ordner öffnet
sich. Doppelklicken Sie nun mit der linken Maustatse auf die Datei „Enigma.exe“. Das Programm öffnet sich.
Hinweis:
Es wird beim ersten Programmstart eine Datei mit dem Dateinamen „Enigma.ini“ in demselben Ordner angelegt.
Mithilfe dieser Datei können Sie die Voreinstellungen der Enigma konfigurieren. Lesen Sie dazu aber unbedingt
das Kapitel „Voreinstellungen konfigurieren“.
-3-
Enigma
4. Bedienungsanleitung
Bitte lesen Sie diese Bedienungsanleitung sorgfältig, bevor Sie mit dem Verschlüsseln von Texten beginnen.
4.1 Hintergrundinformationen
Die Enigma ist eine Codierungsmaschine aus dem 2. Weltkrieg. Sie wurde verwendet, um Nachrichten zu verschlüsseln und wieder zu entschlüsseln. Bei der Codierung, und gleichermaßen bei der Decodierung, durchläuft
ein eingegebener Buchstabe verschiedene Verschlüsselungseinheiten. Die folgende Grafik veranschaulicht Ihnen
die Funktionsweise der einzelnen Komponenten. Zur Erklärung gibt es in diesem Beispiel folgende Symbole: ♣
♠ ♥ und ♦. Es wird ein ♣ verschlüsselt.
Ablauf einer Chiffrierung:
1. Plugboard:
Ein Plugboard kann Symbole miteinander vertauschen. In
♣
♠
♥
♦
diesem Beispiel gilt: ♣ = ♥ und ♥ = ♣; die beiden übrigen
Symbole bleiben unverschlüsselt.
♥
♠
♣
♦
Geben Sie beispielsweise ♣ ein,
dann ist es nach dem Plugboard ein ♥.
2. Rotor:
Bei einem Rotor gibt es klar definierte Paare.
Hier gilt: ♣ = ♥ und ♠ = ♦ und ♥ = ♠ und ♦ = ♥.
Das ♥ wird zum ♠.
3. Umkehrwalze:
Die Umkehrwalze vertauscht alle Symbole miteinander.
♥
♣ ♠
♥ ♦ ♣ ♠ ♥ ♦ ♣ ♠
Dadurch wird nie ein Symbol auf sich selbst abgebildet.
♥ ♦ ♠♣ ♥ ♦ ♠ ♣ ♥ ♦♠
Es gilt: ♣ = ♠; ♠ = ♣ und ♥ = ♦; ♦ = ♥.
♠ wird demnach zu ♣.
4. Rotor: Nach der Umkehrwalze wird wieder durch den
Rotor verschlüsselt.
♣ wird zu ♦.
5. Plugboard: Zum Schluss wird das Symbol durch das
Plugboard chiffriert.
♣
♠
♥
♦
♦ bleibt ♦.
6. Das Symbol ♣ wird also insgesamt zu einem ♦. Als letzten Verschlüsselungs-Trick wird eine Scheibe des Rotors
um eine Stelle weitergedreht. Dadurch ergeben sich nach
jeder Verschlüsselung neue Paare. Die Codierung eines
Symbols ist jetzt von der Anzahl der bereits codierten
Symbole abhängig.
Der Codierungsvorgang ist abgeschlossen.
Bei der Enigma gibt es fünf verschiedene Rotoren, aus denen
man drei auswählen kann. Die drei Rotoren werden einfach hintereinander geschaltet. Jeder Rotor besitzt eine beliebig veränderbare Anfangsposition. Das Plugboard ist individuell einstellbar. Ausserdem gibt es zwei Umkehrwalzen, von denen man eine
auswählen kann. Alle Verschlüsselungseinheiten der Enigma
sind also individuell einstellbar.
-4-
♥
♣ ♠
♥ ♦ ♣ ♠ ♥ ♦ ♣ ♠
♥ ♦ ♠♣ ♥ ♦ ♠ ♣ ♥ ♦♠
♥
♣ ♠
♥ ♦ ♣ ♠ ♥ ♦ ♣ ♠
♦ ♠ ♣ ♥ ♦ ♠ ♣ ♥ ♦ ♠♣
Benutzer- & Programmierhandbuch
4.2 Die Enigma (Übersicht)
Nach dem Programmstart sehen Sie folgendes Fenster:
Eingabe und Ergebnis
im direkten Vergleich
Eingabefeld
Ergebnisfeld
Doppelklick zeigt das Ergebnis dauerhaft an
aktuelle Einstellungen
anzeigen und verändern
Textdatei mit aktuellen Einstellungen
in eine andere Datei chriffieren
Programm
beenden
von Vorne beginnen
oder einen Code decodieren
4.3 Das Eingabefeld
Geben Sie im Eingabefeld einen beliebigen Text ein (z.B „BEISPIELTEXT“). Sie erhalten sofort die codierte
Ausgabe im Ergebnisfeld. Bitte beachten Sie, dass ausschließlich Buchstaben von A bis Z zugelassen sind - alle
anderen Tasten sind im Eingabefeld gesperrt. Natürlich können Sie den Cursor bewegen und auch Zeichen löschen, aber berichtigen können Sie auf diese Weise nichts. Der Grund ist Folgender: die Rotoren der EnigmaMaschine drehen sich bei jedem gültigen Buchstaben weiter. Der zuerst eingegebene Buchstabe wird auch als
erster Buchstabe codiert. Den zweiten Buchstaben, den Sie eingeben (egal, ob vor oder nach dem Ersten) wird
als zweiter Buchstabe codiert. Es wird also genaugenommen die Eingabereihenfolge codiert. Aus diesem Grund
sehen Sie oberhalb des Eingabefeldes die eingegebenen Buchstaben und den dazugehörigen Code im direkten
Vergleich.
Sollten Sie sich vertippt haben, müssen Sie die Eingabe komplett wiederholen. Klicken Sie dazu die Schaltfläche
[Rotoren zurücksetzen] an. (Dies gelingt übrigens auch mit Hilfe der Tastatur: Drücken Sie die Tabulatorentaste
und dann die Returntaste.) Die Programmoberfläche und die Rotoren werden zurückgesetzt. Sie können sofort
mit der Wiederholung beginnen.
Es werden immer die aktuellen Einstellungen zur Chriffierung verwendet.
4.4 Das Ergebnisfeld
Im Ergebnisfeld sind alle Tasten gesperrt. Allerdings können Sie mit der Maus die chiffrierten Buchstaben markieren und dann kopieren, um diese zum Beispiel in eine Email einzufügen und dann zu verschicken. Wenn Sie
das Ergebnisfeld doppelt mit der linken Maustaste anklicken, werden die Buchstaben über der Ausgabenzeile
dauerhaft angezeigt.
Doppelklick auf
dem Ergebnisfeld
-5-
Enigma
4.5 Rotoren zurücksetzen
Um einen Text zu decodieren muss die Enigma-Maschine so eingestellt sein, wie Sie zum Codieren eingestellt
war. Anderenfalls erhalten Sie falsche Ergebnisse. Die Einstellungen werden im nächsten Kapitel erläutert.
Wenn Sie die Einstellungen nach dem Codieren nicht verändert haben, dann genügt es die Rotoren auf die Anfangstellungen zurückzusetzen. Klicken Sie hierzu auf die Schaltfläche [Rotoren zurücksetzen]. Alle Eingabefelder sind nun wieder leer. Geben Sie in dem Eingabefeld keinen Text sondern einen Code, wie zum Beispiel:
„PGFEZEPHJXJK“, ein. Sie erhalten in dem Ausgabefeld „BEISPIELTEXT“.
4.6 Die Einstellungen (Übersicht)
Ein Klick auf die Schaltfläche [Einstellungen] öffnet folgendes Fenster:
Plugboard
Vertauschte Buchstaben sind
farbig hervorgehoben.
Graue Buchstaben sind nicht
vertauscht. Beispiele:
rot -- A=R; R=A
grau -- F=F
Es können maximal 20
Buchstaben vertauscht sein.
Reset
Um das Plugboard
neu einzustellen
Default
Um die voreingestellten
Werte des Plugboards zu
laden.
Rotoren
In Steckplatz 1 steckt Rotor I
In Steckplatz 2 steckt Rotor II
In Steckplatz 3 steckt Rotor III
Reset
Um andere Rotoren
auszuwählen und eine
neue Anfangstellung
einzstellen.
Übernehmen
Schließt das Einstellungs-Fenster. Die angezeigten Einstellungen
werden geladen.
Anfangsstellung
von Rotor I ist A
von Rotor II ist B
von Rotor III ist O
Abbrechen
Schließt das Einstellungs-Fenster. Die alten Einstellungen werden geladen.
Umkehrwalze
Es wird Umkehrwalze A verwendet.
Um die Umkehrwalze zu wechseln.
Laden
Einstellungen können
aus einer externen Datei
eingelesen werden.
Sichern
Die angezeigten Einstellungen
können in einer externen Datei
abgespeichert werden.
4.6.1 Plugboard ändern
Die Buchstabenfelder des Plugboards sind normalerweise gesperrt. Um die Plugboard-Einstellungen zu
ändern, müssen Sie zuerst mit der Maus auf die Schaltfläche [R] wie Reset klicken. Danach sind alle
Buchstabenfelder grau hinterlegt und freigegeben. Sie können –müssen aber nicht– bis zu 20 Buchstaben
nacheinander anklicken. Jedes so ausgewählte Buchstabenpaar bekommt eine eigene Hintergrundfarbe.
Zwei Buchstaben mit gleicher Farbe werden bei der Chiffrierung vertauscht. Grau hinterlegte Buchstaben
werden nicht vertauscht.
Sollten Sie sich verklickt haben, müssen Sie auf [R]eset klicken, um von vorne zu beginnen.
Die Schaltfläche [D] steht für Default und lädt bei Bedarf die Voreingestellte-Einstellung aus der iniDatei.
-6-
Benutzer- & Programmierhandbuch
4.6.2 Rotoren ändern
Auch die Rotoren sind gesperrt, um diese zu verändern müssen Sie
die Schaltfläche [RESET] anwählen. Dabei ändert sich die Programmoberfläche. Nebenstehend sehen Sie den Programmausschnitt nachdem auf [RESET] gedrückt wurde. Jetzt müssen Sie
nacheinander drei von den fünf Rotoren auswählen. Bitte beachten
Sie, dass ein Buchstabe erst durch den Rotor der Stelle1, danach
durch den Rotor der Stelle2 und anschließend durch den Rotor der
Stelle3 chiffriert wird. Anschließend durchläuft der Buchstabe eine
Umkehrwalze und dann die Rotoren der Stelle3, der Stelle2 und anschließend wieder den Rotor der Stelle1. Es macht also einen großen Unterschied, für welchen Rotor Sie sich zuerst entscheiden. Im
folgendem Beispiel soll zuerst durch den Rotor II, danach durch Rotor V und anschließend durch Rotor III chiffriert werden.
Stelle1 ausgewählt
Stelle2 ausgewählt
RESET geklickt
Stelle3 ausgewählt
Um diese Einstellung vorzunehmen müssen Sie die Rotoren in genau dieser Reihenfolge auswählen. Von
links nach rechts sehen Sie jeden Zwischenschritt:
Das Programm ist so gestaltet, dass Sie niemals einen Rotor zweimal verwenden können. Sie benutzen
Rotor II in der Stelle 1 und damit können Sie den Rotor II nicht mehr in Stelle 2 oder in Stelle 3 benutzen.
Deshalb fehlt dort der entsprechende Eintrag.
Die Rotoren müssen noch auf eine Anfangsstellung gesetzt
werden. Jetzt, da Sie drei neue Rotoren ausgewählt haben, ist
der richtige Zeitpunkt um dies zu tun. Geben Sie einen dreistelligen Buchstabenschlüssel ein (z.B. „OPA“) und bestätigen Sie diesen mit der Return-Taste. Der Rotor in der Stelle1
wird auf „O“ gedreht, der Rotor in der Stelle2 wird auf „P“
gedreht und der dritte Rotor wird folgerichtig auf „A“ gedreht. Erst wenn Sie drei Buchstaben eingegeben haben und
diese mit Return bestätigt wurden, sehen Sie nebenstehende
Erfolgsmeldung. Und erst dann –und nur dann– hat das Programm Ihre Rotorenwahl akzeptiert und die Anfangstellung
gespeichert. Um das Fenster mit der Erfolgsmeldung zu
schließen, drücken Sie erneut die Returntaste.
Sollten Sie sich vertippt oder verklickt haben, müssen Sie die
Schaltfläche [RESET] anklicken und Ihre Rotorenwahl nocheinmal von vorne beginnen.
Oben: „OPA“
eingegeben
und Return
gedrückt.
Re: Meldung
bei Erfolg.
4.6.3 Umkehrwalze ändern
Es ist immer eine der beiden Umkehrwalzen ausgewählt. Möchten Sie die andere Umkehrwalze verwenden, dann klicken Sie diese einfach an.
-7-
Enigma
4.6.4 Übernehmen
Sie haben die Einstellungen individuell verändert und wollen die Einstellungen benutzen. Klicken Sie auf
die Schaltfläche [Übernehmen]. Das Programm schließt das Einstellungsfenster und benutzt die neuen
Einstellungen. Sie können mit den neuen Einstellungen sofort chiffrieren. Die Schaltfläche [Rotoren zurücksetzen] setzt die Rotoren jetzt auf die neu eingestellten Anfangstellungen zurück.
Sollten die Einstellungen fehlerhaft sein, dann werden Sie mit einer Fehlermeldung darauf hingewiesen.
Sie haben keine Möglichkeit die Einstellungen zu berichtigen. Das Fenster mit den Einstellungen schließt
sich also grundsätzlich, wenn Sie auf [Übernehmen] klicken.
Es werden die Einstellungen verwendet, die beim Öffnen des Fensters benutzt wurden.
4.6.5 Abbrechen
Sie haben die Einstellungen individuell verändert und interessieren sich nicht mehr dafür – oder sie wollten nur mal nachschauen, welche Einstellungen gerade gelten. Klicken Sie auf die Schaltfläche [Abbrechen]. Das Programm schließt das Einstellungs-Fenster. Die Chiffrierung kann im Hauptprogramm normal fortgesetzt werden.
Es werden die Einstellungen verwendet, die beim Öffnen des Fensters Einstellungen benutzt wurden.
4.6.6 Sichern
Sie haben die Möglichkeit Ihre individuellen Einstellungen in einer Datei zu sichern. Klicken Sie hierzu
auf die Schlatfläche [Sichern]. Es öffnet sich ein sogenannter Speichern-Dialog. Sie haben die Möglichkeit in ein beliebiges Verzeichnis Ihres Computers zu wechseln und müssen einen Dateinamen angeben.
Die Dateiendung von Enigma-Datensätzen ist „.dat“.
Es können verschiedene Fehlermeldungen auftreten. Beachten Sie hierzu bitte das gesonderte Kapitel
„Fehlermeldungen“
4.6.7 Laden
Sie haben ebenfalls die Möglichkeit Einstellungen aus einer Datei zu laden. Klicken Sie hierzu auf die
Schaltfläche [Laden]. Es öffnet sich ein sogenannter Öffnen-Dialog. Sie haben die Möglichkeit in ein beliebiges Verzeichnis Ihres Computers zu wechseln und müssen eine Datei mit einem gültigen EnigmaDatensatz anwählen. Die Dateiendung von Enigma-Datensätzen ist „.dat“. Das bedeutet nicht, dass jede
Datei, welche auf .dat endet eine gültige Enigma Datei ist.
Es können verschiedene Fehlermeldungen auftreten. Beachten Sie hierzu bitte das gesonderte Kapitel
„Fehlermeldungen“.
4.7. Datei konvertieren
Die Schaltfläche [Datei konvertieren] ermögtlicht Ihnen den Inhalt einer Textdatei zu codieren und diesen Code
in eine andere Textdatei zu schreiben. Die Quelldatei darf nur Buchstaben von A bis Z enthalten, Groß- und
Kleinschreibung ist hierbei unwichtig.
Bereiten Sie eine Textdatei vor, in welcher sich lediglich aneinandergereihte Buchstaben befinden. Speichern Sie
diese Datei ab (z.B. als Quelle.txt mit dem Inhalt „DiesIstEineQuelldatei“ ). Jetzt klicken Sie die Schaltfläche
[Datei konvertieren] an. Es öffnet sich ein Öffnen-Dialog. Wählen Sie die zu codierende Datei aus, also beispielsweise die Datei „Quelle.txt“. Bestätigen Sie mit der Schaltfläche [Öffnen]. Es öffnet sich ein SpeichernDialog. Jetzt vergeben Sie einen neuen Dateinamen, zum Beispiel „Ziel.txt“. Bestätigen Sie auch hier, aber
diesmal mit Hilfe der Schaltfläche [Speichern]. Sie bekommen nebenstehende Erfolgsmeldung zu sehen, wenn alles geklappt hat. Um das Fenster mit der Erfolgsmeldung zu
schließen, drücken Sie die Returntaste.
Es können auch hier verschiedene Fehlermeldungen auftreten. Beachten Sie hierzu bitte das gesonderte Kapitel „Fehlermeldungen“.
-8-
Benutzer- & Programmierhandbuch
4.8 Voreinstellungen konfigurieren
Wenn Sie die Enigma starten, ist diese bereits mit Einstellungen versorgt. Sie haben die Möglichkeit diese Voreinstellungen zu verändern. Dazu befindet sich in dem Ordner der „Enigma.exe“ eine weitere Datei, sie trägt den
Namen „Enigma.ini“.
Ini-Dateien können Sie mit einem Doppelklick ganz normal öffnen. Die „Enigma.ini“ ist in mehrere Abschnitte
unterteilt, wie z.B. [ROTOREN]. Die Abschnitte bestehen
wiederum aus Einträgen, wie z.B. „Rotor3=...“. Sie finden
insgesamt eine textuelle Repräsentation der einzelnen Enigma-Komponenten wieder (vgl. Bild).
Die blau eingerahmten Bereiche der nebenstehenden Grafik bestimmen die Voreinstellungen der Enigma. Sie dürfen die rechte Seite eines Eintrages verändern (also nur
nach einem Gleicheitszeichen!). Daraus folgt, dass Sie
beispielsweise keine zusätzlichen Rotoren einfügen können.
Umkehrwalze:
Sie können bei der Umkehrwalze entweder „WalzeA“
oder „WalzeB“ eintragen.
Key:
Hinter dem Begriff „Key“ verbirgt sich die Anfangstellung der drei Rotoren. Sie können die Voreinstellung “ABO“ durch irgendeine dreibuchstäbige, großgeschriebene Buchstabenfolge ersetzen.
Rotoren:
Sie können die Rotoren in den Steckplätzen 1 bis 3 durch je eine der fünf Rotoren ersetzen. Sie dürfen allerdings keinen Rotor doppelt verwenden!
Plugboard:
Sie können das Plugboard komplett löschen oder es durch eine gerade Anzahl von maximal 20 unterschiedlichen, aber immer großgeschriebenen Buchstaben ersetzen. Vertauscht werden die Buchstaben immer paarweise. Beispiel: Plugboard=AKTE – Es werden A und K vertauscht und es werden T und E vertauscht. Alle anderen Buchstaben würden unverändert bleiben.
Achtung:
Es ist ebenfalls möglich die übrigen Einträge zu verändern. Allerdings wird dringend davon abgeraten, da eine
korrekte Decodierung dann nicht mehr gewährleistet werden kann.
Ist die Enigma-Ini-Datei fehlerhaft oder nicht vorhanden, wird sie beim Starten des Programms neu angelegt.
5. Wiederanlaufbedingungen
Sollte Ihr Computer-System während der Arbeit mit der Enigma, beispielsweise durch einen Stromausfall, abstürzen, dann hat dies folgende Konsequenzen:
- Die aktuelle Chiffrierung ist verloren.
- Für die Sitzung vorgenommene, also individuelle Einstellungen sind verloren.
- In Dateien gesicherte Einstellungen, die Enigma-Datensätze (Dateiendung .dat), können neu eigelesen
werden.
- Ist das System während einer Konvertierung abgestürzt, muss im Einzelfall geprüft werden, ob die
Zieldatei vollständig gespeichert wurde.
- Die Ini-Datei (Enigma.ini) ist nicht beeinträchtigt worden.
-9-
Enigma
6. Fehlermeldungen
Fehlermeldung
Fehlerursache
Behebungsmaßnahme
Es wurden die alten Einstellungen
geladen, weil die Eingaben unvollständig sind.
Bitte beachten Sie:
(...)
Sie haben versucht unvollständige
Einstellungen zu übernehmen.
Lesen Sie nach, wie die Einstellungen korrekt vorgenommen werden
und versuchen Sie es nocheinmal.
Die Datei wird nicht gespeichert,
weil die Eingaben unvollständig
sind.
Bitte beachten Sie:
(...)
Speichern fehlgeschlagen.
Öffnen fehlgeschlagen.
Die Datei (...) ist fehlerhaft. Sie
wird nicht geöffnet.
Die Datei (...) existiert nicht. Sie
wird nicht geöffnet.
Die Datei (...) wird nicht geschrieben.
Die Datei (...) ist schreibgeschützt.
Soll der Schreibschutz entfernt werden?
Häufige Fehlerursache:
Die Anfangstellung der Rotoren
wurde nicht mit Return bestätigt.
Sie haben versucht unvollständige
Einstellungen in einer Datei zu sichern.
Der Fehler ist außerhalb dieses Programms zu suchen.
Der Fehler ist außerhalb dieses Programms zu suchen.
Entweder handelt es sich um eine
Datei mit der Endung .dat, welche
nicht zu dieser Enigma gehört; oder
die Datei ist beschädigt worden.
Es wird versucht eine Datei zu öffnen, welche es aber nicht gibt.
Vervollständigen Sie die Einstellungen und wiederholen Sie das Sichern der Einstellungen.
Starten Sie Ihr System neu.
Starten Sie Ihr System neu.
Wenn es sich um einen beschädigten Enigma-Datensatz handelt, können Sie diesen nur noch mit gültigen Einstellungen überschreiben
oder löschen.
Wiederholen Sie den Vorgang, aber
geben Sie eine existierende Datei
zum Öffnen an.
Bestätigen Sie die Meldung.
Sie haben einen Vorgang abgebrochen.
Sie versuchen eine schreibgeschütz- Bestätigen Sie die Meldung mit
te Datei zu überschreiben.
„Ja“, wird der Schreibschutz entfernt und das Programm führt seine
Aktion fort; anderenfalls bricht das
Programm den Vorgang ab.
Soll die Datei: (...) überschrieben
Sie versuchen eine Datei zu überBestätigen Sie die Meldung mit
werden?
schreiben, indem Sie beim Spei„Ja“, wird die Datei überschrieben,
chern eine existierende Datei ange- anderenfalls bricht das Programm
wählt haben, statt einen neuen Na- den Vorgang ab.
men zu vergeben.
Ihre ini-Datei ist Fehlerhaft. Sie
Die Datei „Enigma.ini“ wurde mit
Bestätigen Sie die Meldung. Die
wird neu angelegt und eingelesen.
ungültigen Werten verändert.
falsche Ini-Datei wird durch eine
funktionierende ersetzt.
Die Datei enthält ungültige Zeichen. In der Textdatei befinden sich Son- Entfernen Sie alle ungültigen ZeiSie wird nicht konvertiert!
derzeichen, Leerzeichen, Zahlen,
chen aus der Textdatei. Speichern
oder Steuerzeichen.
Sie die Datei ab und wiederholen
Sie die Konvertierung.
- 10 -
Benutzer- & Programmierhandbuch
II. Programmierhandbuch
1. Entwicklungskonfiguration
CPU
Arbeitsspeicher
Fesplattenkapazität
Monitor
Betriebssystem
Entwicklungsumgebung
: PentiumIII mit 1,4 GHz
: 1024 MB
: 80 GB, von Samsung
: 17’ - Monitor
: Windows XP, SP4
: Borland Delphi 7, Enterprise
2. Problemanalyse und Realisation
2.1 Was soll implementiert werden? (Problemanalyse)
Um diese Frage zu beantworten wird das Interfaces entwickelt. Dazu wird die geforderte Funktionalität in grafische Elemente unterteilt und zwar mit der begleitenden Fragestellung: „Was soll der Benutzer machen können?“
Das Interface soll so entwickelt werden, dass falsche Eingaben, soweit möglich, vermieden werden.
2.1.1 Hauptformular
Nach Programmstart soll der Benutzer
die Möglichkeit haben einen beliebigen
Text einzugeben, um sofort das codierte
Ergebnis zu gelangen (Editfelder). Will
der Benutzer einen Text decodieren,
dann muss er die Möglichkeit haben die
Rotoren wieder auf Anfangsstellung
zurückzudrehen [Decodieren / Codieren]. Darüber hinaus soll der Benutzer
die Möglichkeit haben sämtliche
Einstellungen verändern zu können.
Dafür ist eine gesonderte Oberfläche
vorgesehen [Einstellungen]. Die
Aufgabenstellung verlangt weiterhin,
dass der Benutzer eine Datei
konvertiert in eine neue Datei
schreiben können soll [Datei konvertieren]. Abschließend wird
natürlich die Möglichkeit
bereitgestellt das Programm
ordnungsgemäß zu beenden [Schließen].
2.1.2 Formular Einstellungen
Die Programmoberfläche wird in
vier logische Bereiche Unterteilt:
1. Einstellen des Plugboards (PB):
Der Benutzer erhält die Möglichkeit
Buchstaben miteinander zu
vertauschen. Es sind verschiedene
Realisierungen denkbar. Bei der hier
skizzierten Version wird die
Zusammengehörigkeit zweier
Buchstaben visuell verdeutlicht:
Gleiche Farben bedeuten gleiche
Buchstaben. Will der Benutzer ein
eigenes PB erstellen, so muss er auf
- 11 -
Enigma
[Reset] drücken, um danach durch Anklicken von Buchstabenpaaren je eine Vertauschung vorzunehmen.
Der Benutzer soll das PB auch auf Standardwerte zurücksetzen können [Default].
2. Wahl der Rotoren:
Aus 5 Rotoren sollen 3 Rotoren gewählt werden. Es muss dabei sichergestellt sein, dass drei RadioButtons angeklickt werden, aber in jeder Zeile, sowie in jeder Spalte höchstens ein Radio-Button ausgewählt wird. Dieses Problem wird gelöst, indem der Benutzer drei mal, aus erst 5, dann 4 und zuletzt aus 3
Radio-Buttons, wählen kann (vgl. Kap. I. 4.6.2 Rotoren ändern, Seite 7).
Die Anfangsstellung der drei Rotoren kann der Benutzer per Tastatur in ein Editfeld eingegeben. Das Editfeld lässt von vornherein nur gültige Eingaben zu.
3. Wahl der Umkehrwalze:
Für die Auswahl einer Umkehrwalze werden Radio-Buttons verwendet. Der Benutzer kann sich für die
jeweils andere Umkehrwalze entscheiden.
4. Umgang mit den Einstellungen:
Dem Anwender soll weiterhin die Möglichkeit gegeben werden die neuen Einstellungen in einer Datei zu
sichern und auch wieder von einer gesicherten Datei einzulesen [öffnen][speichern]. Außerdem müssen
die neuen Einstellung auf Vollständigkeit geprüft werden (Korrekt sind die Einstellungen immer!) und
dann auch wirksam werden. Dazu dient der Button [Schließen], welcher gleichzeitig das Formular
Schließt.
2.2 Wie soll die Funktionalität hergestellt werden? (Realisierungsanalyse)
Um diese Frage zu beantworten werden für die verschiedenen Probleme je eine Funktionsbeschreibung angegeben und mögliche Ansätze zur Umsetzung beschrieben, gleichzeitig werden die damit verbundenen Datenstrukturen besprochen.
2.2.1 Datei Konvertieren
Funktionsbeschreibung :
Jeder Buchstabe einer ausgewählten Textdatei soll gelesen, anschließend codiert und schlussendlich in eine neue Textdatei geschrieben werden. Die Quelldatei darf nur aus gültigen Zeichen bestehen (A..Z, a..z).
Vorhandene Dateien dürfen nicht beschädigt werden.
Ansätze zur Umsetzung :
Der Inhalt der Quelldatei kann in einen String geschrieben werden. Danach kann die Quelldatei geschlossen werden; sie wird nicht mehr benötigt. Der String könnte iterativ, also Buchstabenweise codiert werden und das Ergebnis kann Buchstabenweise in die Zieldatei geschrieben werden.
2.2.2 Plugboard
Funktionsbeschreibung :
Das Plugboard (PB) soll je zwei Buchstaben miteinander vertauschen. Es gibt also zu jedem Buchstaben
einen Partner. Wird beispielsweise ein A mit einem V vertauscht, dann muss ebenfalls gelten, dass ein V
ein A ergibt. Mindestens sechs Buchstaben bleiben dabei unvertauscht: Sie bilden sich auf sich selbst ab.
Ansätze zur Umsetzung :
Es kann sich bei dem Plugboard intern um eine art Liste handeln, die zwingend mit dem Datentyp char zu
tun hat. Es wäre möglich eine lineare Liste zu programmieren, welche man beim Suchen eines Codes
stets von vorne bis hinten durchlaufen muss. Bei dieser Überlegung wird es aber schwierig die Entsprechung A=V; V=A zu kontrollieren.
Eine andere Möglichkeit ist es, den Datentyp Array zu verwenden. Statt Zahlen könnte man, einen Teilbereichstyp für die Indizes benutzen. Vielleicht ein Array mit den Indizes A bis Z und als Inhalt verwende
man ebenfalls Buchstaben von A bis Z. Bei der Entsprechung der Buchstaben muss nur darauf geachtet
werden, dass bei einem A ein V eingetragen wird und bei einem V entsprechend das A. Das ließe sich mit
zwei direkten Zugriffen sehr kontrollieren.
- 12 -
Benutzer- & Programmierhandbuch
2.2.3 Steckplätze
Funktionsbeschreibung :
Es sollen drei Steckplätze mit je einem festen Rotor geben.
Ansätze zur Umsetzung :
Die naheliegendste Realisierung besteht darin drei feste Steckplätze zu implementieren. Steckplatz1 vom
Typ TRotor, Steckplatz2 vom Typ TRotor und den dritten Steckplatz ebenso vom Typ TRotor. Bei dieser
Implementierung gibt es allerdings einen großen Nachteil: Es muss ständig herausgefunden werden, welcher Rotor in welchem Steckplatz steckt, daraus folgt dann erst welcher Rotor überhaupt verwendet wird.
Auch problematisch ist der umgekehrte Fragestellung: In welchem Steckplatz steckt eigentlich welcher
Rotor? Mithilfe eines Case-Verteilers ist es zwar relativ leicht diese Abfragungen durchzuführen. Aber
diese Informationen werden im Programmablauf sehr oft benötigt. Die permanente Prüfung ist schlichtweg zu Zeitaufwendig – und auch unhandlich.
Ein eleganterer Umsetzungsansatz wäre wohlmöglich ein Array mit drei Werten (repräsentieren Steckplätze) vorzusehen und dann sprichwörtlich in jeden Steckplatz einen Rotor „Reinzustecken“, also abzuspeichern. Sehr komfortabel kann mit dieser Version ermittelt werden, welche Rotoren verwendet werden. Außerdem kann das komplette Array übergeben werden, womit dann alle Rotoren bekannt währen.
Auch bekannt ist die Zuordnung von Rotor zu Steckplatz und Steckplatz zu Rotor.
2.2.4 Rotoren
Funktionsbeschreibung :
Die Rotoren sind durch zyklische Ringe zu implementieren. Ein Rotor kann Buchstaben sowohl codieren, als auch decodieren. Nach jedem Chiffrierungsschritt muss der jeweilige Rotor „weitergedreht“ wer
den, damit bei mehrfacher, gleicher Eingabe unterschiedliche Ergebnisse erzielt werden.
(Wie ein Rotor funktioniert lesen Sie im Benutzerhandbuch: Kap. I 4.1 Hintergrundinformationen)
Ansätze zur Umsetzung :
Die Infokomponente könnte aus
zwei Elementen bestehen: Text und
Code. Wird beispielsweise ein „C“
codiert (PB Æ Rotor Æ Umkehrwalze), dann wird der Einstiegspunkt „SEARCH“ solange weitergesetzt, bis im Feld „Text“ das gesuchte „C“ steht und das „M“ aus
dem Feld „Code“ wird zurückgegeben.
Soll ein Buchstabe decodiert werden (Umkehrwalze Æ Rotor Æ
PB), dann wird „SEARCH“ eben
solange weitergesetzt, bis im Feld
„Code“ der zu decodierende Buchstabe steht. Zurückgegeben wird in
diesem Fall der Buchstabe im Feld
„Text“.
Es ist grundsätzlich ein zweiter
Einstiegspunkt in die Ringstruktur
notwendig: „Mileage“ wird auf die
gewünschte Anfangsstellung gesetzt und nach jedem Chiffrierungsvorgang (der beinhaltet codieren und decodieren) um ein Element weitergedreht. Zeigt „mileage“ wieder auf die Anfangsstellung, dann hat sich der Rotor einmal
komplett gedreht. Der dahintersitzende Rotor kann sich um eine Stelle weiterdrehen („mileage“ von dem
nächsten Rotor ein Element weitersetzen).
- 13 -
Enigma
2.3 Wie wurde die Funktionalität hergestellt? (Realisierungsbeschreibung)
2.3.1 Grundsätzliches
Sämtliche Einstellungen sind immer gültig. Daraus folgt, dass die Enigma zu jedem Zeitpunkt codieren
und decodieren kann.
Umkehrwalze:
Die Umkehrwalze ist ein spezielles Plugboard, bei dem sichergestellt sein muss, dass alle 26 Buchstaben
immer vertauscht sind. Genau dann gibt es den Umkehreffekt.
Die Umkehrwalze wird also genauso behandelt, wie ein Plugboard. Allerdings gibt es eine zusätzliche
Prüfung beim Initialisieren und beim Lesen des Eintrags aus der Ini-Datei.
FindComponent:
FindComponent ist eine Funktion von Delphi, genaueres kann also in der entsprechenden Hilfe nachgeschlagen werden. Hier lediglich ein Beispiel, um die Rotoren auf der Oberfläche entsprechend der internen Einstellungen zu setzen:
Deklaration:
Name : TRadioButton; (weitere...)
Quelltext:
for SP_Nr := 1 to 3 do
// Steckplatz 1 bis 3 abarbeiten
begin
Platz := IntToStr(SP_Nr);
// Steckplatz als string
Nr := IntToStr(Einst.Steckplatz[SP_Nr]);
// Welcher Rotor steckt im Steckplatz?
Name := findComponent('rb_' + Platz + Nr) as TRadioButton; // Name d. Komponente herausfinden
// Es resultiert der Name einer Komponente, z.B. „rb_24“ vom Komponententyp TRadioButton.
// Rotor 4 ist in Steckplatz 2.
Name.Checked := true; // entspricht der speziellen Anweisung : rb_24.Checked := true;
end;
2.3.2 Programmabläufe
Es werden die zum Verständnis notwendigen und damit grundlegenden und wichtigsten Abläufe in ihren
Kernpunkten beschrieben.
Programm-Start (foMain):
1.) Aus der Ini-Datei werden alle Einstellungen gemäß den Einträgen in der Sektion „Voreinstellungen“
geladen. Diese Einstellungen werden auf Vollständigkeit und Richtigkeit geprüft. Sind Einstellungen
Fehlerhaft, dann wird die Ini-Datei neu angelegt.
2.) Alle Einstellungen werden gesetzt.
3.) Aus der Ini-Datei werden die nötigen Strings gelesen, um die Ringstruktur zu initialisieren.
Programm-Ende (foMain):
1.) Noch geöffnete Dateien werden -falls nötig- per Try-Finally – Block geschlossen.
2.) Die Ringstruktur wird in jedem Fall wieder freigegeben.
Datei Konvertieren (foMain):
1.) Öffnen Dialog (Pfad für Quelldatei)
2.) Schließen Dialog (Pfad für Zieldatei)
3.) Chiffrieren (in lgMain):
a. Rotoren auf Anfangsstellung setzen
b. Quelle einlesen (AnsiString: ~2^31 Zeichen, bis 2 GB) (in unTypDatei)
i. öffnen,
ii. lesen,
iii. schließen
c. den String Buchstabenweise von vorne nach hinten
auf gültige Zeichen prüfen und Codieren
d. Ergebnis in Zielstring schreiben
4.) wenn alles geklappt hat: Erfolgsmeldung ausgeben.
- 14 -
Benutzer- & Programmierhandbuch
Formular „Einstellungen“ öffnen (in foMain):
1.) alte Einstellungen Sichern
2.) Die Oberfläche mit den aktuellen Einstellungen vorbereiten (in foMain)
a. show_Plugboard:
Das PB-Array iterativ abarbeiten:
wenn A = A, Panel-Komponente p_A finden und neutrale Farbe setzen
wenn B = Z, Panel-Komponente p_B und p_Z finden und Farbe aus Farbarray setzen
„Z“ zum überspringen merken
Farbindex weitersetzen und...
mit C fortfahren...
b. show_Rotoren:
alle Rotoren sichtbar machen
iterativ die Steckplätze abarbeiten:
herausfinden, welcher Rotor in dem Steckplatz steckt
diesen Rotor auf der Oberfläche markieren (vgl. FindComponent, Kap. II.2.3.1)
c. show_Umkehrwalze:
prüfen welche Umkehrwalze aktuell verwendet wird und entsprechend auf der Oberfläche
markieren.
3.) Oberfläche Einstellungen modal Anzeigen
Plugboard ändern (in foEinstellungen):
Alle PB Elemente (Panels) zeigen auf eine onClick-Procedur.
AnzClick = Die Anzahl der geklickten PB-Panels wird unit-global verwaltet.
merk1
= Der erste Buchstabe eines Buchstabenpaares wird unit-global verwaltet.
Farben = Farbwerte werden als Aufzählungstyp konstant und unit-global verwaltet
1.) AnzClick erhöhen
2.) Farbe bei jedem 2. Klick ändern (index entsprechend setzen)
3.) Sicherstellen, dass höchstens 20 Buchstaben vertauscht werden
4.) wenn AnzClick ungerade ist, handelt es sich um den ersten Klick
a. Komponente einfärben
b. Komponente unbenutzbar machen
c. Buchstabe merken
5.) wenn AnzClick gerade ist, handelt es sich um den zweiten Klick
a. Komponente einfärben
b. Komponente unbenutzbar machen
c. Beide Buchstaben im Array –intern– vertauschen
Einstellungen speichern (lgEinst):
Die einzelnen Einstellungen sind in einem Record zusammengefasst. Der Record wird komplett in eine
typerisierte Datei geschrieben (unTypDat). Der Dateityp ist TDatensatz, das ist eine Identität von dem
Datentyp TEinstellungen (Identitäten werden in unTypen hergestellt).
Die Unit unDatTools stellt sämtliche Prüfroutinen zur Dateiverarbeitung bereit. (überschreiben verhindern, Schreibschutz erkennen und entfernen, Benutzer fragen, usw.)
Ringe initialisieren (in lgRotor):
Rotor1, Rotor2, Rotor3 = unit-globale Einstiegstpunkte in die Ringstruktur
1.) Herausfinden, welcher Rotor steckt in welchem Steckplatz.
Folgende für jeden Steckplatz ausführen (3 mal):
2.) Den entsprechenden String aus der Ini-Datei lesen (unIniDatei)
3.) Den String Buchstabenweise in den entsprechenden
Rotor1
Ring hinzufügen (in unRing):
a. Neues Element erstellen, new()
b. Buchstabe Hinzufügen
Rotor2
c. wenn Ring leer:
Element auf sich selbst zeigen lassen
d. wenn Ring Elemente hat:
Rotor3
Element einfügen
e. Zeiger auf neues Element an lgRotor zurückgeben
lgRotor
unRing
lgRotor
unRing
- 15 -
Enigma
2.3.3 Chiffrierung
Problem: Weitersetzen:
Es hat sich gezeigt, dass die Vorüberlegungen zu den
Rotoren, wie beschrieben (vgl. Kap: II. 2.2.4 Rotoren) nicht ganz richtig sind. Das zentrale Problem bei
dem skizzierten Lösungsansatz ist die Tatsache, dass
durch das Weitersetzen des Einstiegszeigers „mileage“, keine neuen Buchstabenpaare gebildet werden.
Ein Buchstabe A, fünf mal hintereinander eingegeben, würde immer denselben chiffrierten Buchstaben
ergeben. Konsequent weitergedacht müsste man die
Ringstruktur nach jeder Chiffrierung komplett umspeichern: Man müsste jeden Buchstaben aus dem
inneren Ring (mit Code beschrieben) genau eine Position weiter abspeichern. Das wiederum ist
schlichtweg Blödsinn und hat nichts mit einer guten
Ringstruktur zu tun!
Lösung: Umstrukturierung:
Die Ringstruktur wurde deshalb um die Infokomponente „Text“, in der Zeichnung der mittlere Ring, verringert. Auch der Einstiegspunkt „mileage“ ist überflüssig.
Rotoren
Die Logik der Rotoren, das beinhaltet Codieren und Decodieren, initialisieren der Rotoren, auf Anfangstellung setzen etc. ist in der Unit lgRotoren realisiert worden. Die tatsächlichen Ringoperationen sind
hingegen in der unRing realisiert worden.
Der Einstiegspunkt für einen Ring wird in lgRotor verwaltet.
Codierung eines E’s (lgRotor):
1.) Der globale Einstiegspunkt (Rotor1) wird lokal kopiert (run).
2.) Der lokale Zeiger wird nun E-mal weitergesetzt
3.) Rückgabewert ist der Buchstabe, auf den
run aktuell zeigt. Es wurde der Buchstabe „C“
ausgezählt.
Decodierung eines C’s (lgRotor):
1.) Der globale Einstiegspunkt (Rotor1)
wird lokal kopiert (run).
2.) Der lokale Zeiger (run) wird nun
solange weitergesetzt, bis dieser auf das
gesuchte C zeigt.
3.) Die Schritte, bis zum C werden
Alphabetisch mitgezählt.
4.) Der Rückgabewert ist der aktuelle Zählstand.
Es sind genau E schritte notwendig.
lgRotor
unRing
Rotor1
C
D
B
E
A
A
P
I
B
R C
J
E
K
S
M
U
F
L
G
X
H
D
Y
Rotor drehen (lgRotor):
Q
W
1.) Es werden die aktuellen Einstiegspunkte mit der
O T N Z V
Anfangstellung (dreistelliger Key) verglichen
2.) Soll ein Rotor gedreht werden, dann wird (einfach!) der
globale Einstiegspunkt auf die nächste Komponente gesetzt.
Rotor1 zeigt nun nicht mehr auf A, sondern auf I. Bei der nächsten
Codierung wird nun ab dem I gezählt. (Ein „E“ würde jetzt beispielsweise ein „J“ ergeben!)
- 16 -
Benutzer- & Programmierhandbuch
2.4 Memory Check (Übersicht)
In Steckplatz 1
steckt zur Zeit der
Rotor mit der Nr. 1.
Die Einstiegsadresse in den jew.
Ring ist angegeben. Sie ist stets
die Erste „Self“ Adresse im Memofeld
Veränderungen,
sowie die Anzeige, beziehen
sich auf den Rotor in diesem
Steckplatz
Um einen
Buchstaben
manuell aus
dem Ring zu
entfernen
bzw. wieder
hinzuzufügen.
Sollten zu Testzwecken einzelne Elemente aus einem
Ring entfernt werden, dann werden
Diese nach dem Aktualisieren hier angezeigt.
Ring1 = Ring in
Steckplatz 1
Alle Ringelemente werden
gefüllt / freigegeben entspricht
Programmstart
und –ende.
Aktuelles Plugboard
und aktuelle Umkehrwalze.
Aktualisiert
Plugboard,
Umkehrwalze,
Memofeld und
die gelöschten Buchstaben werden
aufgelistet.
Eine Codierung wird
mit allen Zwischenschritten (untereinander) angezeigt.
Setzt die Rotoren auf
Anfangstellung zurück.
1. Spalte:
Zur Orientierung wird das
Alphabet in einer Schleife
mit ausgegeben.
(Das nachzuvollziehen der Codierung / Decodierung der Enigma
wird dadurch stark vereinfacht.)
2. Spalte (Info-Komponente):
Von oben nach unten gelesen ergeben sich die Buchstaben des Rotors.
In der ersten Zeile steht der Buchstabe, auf den gerade gezeigt wird.
Beim Weiterdrehen des Rotors wird
der Einstiegspunkt um eine Stelle
weitergesetzt; das „I“ stünde dann
an erster Stelle, alle Buchstaben
rückten eine Zeile auf und das „A“
stünde ganz unten.
Eingabefeld zum
Codieren eines
Buchstabens.
A -- A Self: $C32410 Next: $C3241C
B -- I Self: $C3241C Next: $C32314
C -- B Self: $C32314 Next: $C32428
D -- R Self: $C32428 Next: $C32434
E -- C Self: $C32434 Next: $C32440
F -- J Self: $C32440 Next: $C3232C
G -- K Self: $C32338 Next: $C32344
H -- M Self: $C32344 Next: $C32350
I -- F Self: $C32350 Next: $C3235C
J -- L Self: $C3235C Next: $C32368
K -- G Self: $C32368 Next: $C32374
L -- D Self: $C32374 Next: $C32380
…
Y -- S Self: $C323F8 Next: $C32404
Z -- P Self: $C32404 Next: $C32410
Self: $123456
Das Ringelement mit der
Infokomponente „A“ hat die
Speicheradresse
$C32410HEX .
Es handelt sich um die, mit
einem new( ) – Aufruf alloziierte, Adresse aus dem
Heap-Speicher.
Vgl. II. 3.2 Rotoren / Ringe
Next: $123456
In der Nextkomponente des
Ringelementes A steht die
Speicheradresse
$C3241CHEX .
Weil das Element „I“ (Self)
die Adresse $C3241C hat,
zeigt das Element „A“ auf
das Element „I“.
Vgl. II. 3.2 Rotoren / Ringe
- 17 -
Enigma
3. Datenstrukturen
3.1 Einstellungen
Der Datentyp TPlugboard besteht aus einem Array, in welche
m einzelne Buchstaben abgespeichert werden. Das Array
kann von „A“ bis „Z“ durchlaufen werden. Dieser Datentyp
stellt sowohl das Plugboard, als auch die Umkehrwalze dar.
Der Datentyp TSteckplatz ist ein Array und repräsentiert die
drei Stäckplätze der Enigma-Maschine. Zu jedem Steckplatz
wird die Information festgehalten, welcher Rotor in welchem
Steckplatz steckt. Mithilfe dieser Zuordnung ist es möglich
festzustellen, welcher Rotor im Einzelfall angesprochen werden muss.
Die Anfngstellung der Rotoren wird in dem Datentyp Tkey
festgehalten. Es handelt sich um einen dreistelligen String.
Alle Teileinstellungen sind in dem Record TEinstellungen
zusammengefasst.
Tplugboard:
A B C D
R Z L X
E
J
F
F
G
G
H
N
I
I
J
E
K
T
L
C
M N
W H
Tabc = 'A'..'Z';
TPlugboard = array[Tabc] of char;
TSteckNr = 1..3;
TRotorNr = 1..5;
TSteckplatz = array[TSteckNr] of TRotorNr;
TKey = string[3];
TEinstellungen = record
Plugboard : TPlugboard;
Steckplatz : TSteckplatz;
Key
: TKey;
UmWalze : TPlugboard;
end;
O
O
P
S
Q
Q
S
P
R
A
U
Y
T
K
V
V
W X
M D
Y
U
3.2 Rotoren bzw. Ringe
Die Rotoren werden als Ringstruktur verwaltet. Ein Ring besteht aus Recordelementen, welcher wiederum aus einer Infokomponente (Info vom Typ TRotor) und einer Nextkomponente (Next vom Typ PRing) besteht. Die Infokomponente
beinhaltet die Buchstaben der Rotoren. In der Nextkomponente steht die Speicheradresse des nächsten Ringabschnitts.
Eine Grafik veranschaulicht den Aufbau eines Rings:
A
I
B
|
Nextkomponente
E
K
S
M
U
F
L
G
X
Y
W
- 18 -
PRing = ^TRing;
TRing = record
Next : PRing;
Info : TRotor;
end;
Infokomponente
R C
J
P
H
TRotor = 'A'..'Z';
O T N Z V
Q
D
A
|
I
|
...
Das Element mit der Infokomponente
„A“ zeigt auf das Element „I“.
Z
B
Benutzer- & Programmierhandbuch
4. Programmorganisationsplan
foEinstellungen
Unit zu dem
Formular von
den Einstellungen
foMain
Unit zu dem
Hauptformular
foMemCheck
Unit zu dem
Formular MemCheck.
Programmtest!
Set
lgMain
Hauptlogik der
Enigma
lgEinst
Logik der Einstellungen
Text
Dateien
lgRotor
Logik der Rotoren
DatenSätze
unTypDatei
Funktionen zur
Benutzung von
typerisierten
Dateien.
unIniDatei
Funktionen zur
Benutzung von
Ini-Dateien.
unDatTools
Werkzeuge zur
Überprüfung
und Änderung
von Dateien.
unRing
Funktionen
zum Erstellen
einer Ringstruktur.
unTypen
Typen-deklaration
des Enigma-Projekts.
(wird von allen verwendet)
- 19 -
Enigma
5. Programmtests
Datei Konvertieren
Testfall
1. Text.txt in Code.txt konvertieren
2. Code.txt in reText konvertieren
3. ReadOnly.txt in
nicht_Überschrieben.txt konvertieren
--> Nicht Überschreiben
erwartetes Ergebnis
erzieltes Ergebnis
Code.txt wird angelegt
entspricht erwartetem Ergebnis
reText.txt wird angelegt und besitzt denselben entspricht erInhalt, wie Text.txt
wartetem Ergebnis
Meldung: "Soll die Datei (...) überschrieben entspricht erwerden." Nein. Meldung: "Datei (...) wird nicht wartetem Ergeschrieben!"
gebnis
4. ReadOnly.txt in Überschrieben.txt kon- Meldung: "Soll die Datei (...) überschrieben
vertieren --> Überschreiben!
werden." Ja. Datei wird mit neuem Inhalt überschrieben.
entspricht erwartetem Ergebnis
5. ReadOnly.txt in RO_Leer.txt konvertie- Meldung: "Soll die Datei (...) überschrieben entspricht erren --> Schreibschutz nicht entfernen. werden." Ja. Meldung: "Datei (...) ist Schreib- wartetem Ergeschützt, soll der Schreibschutz entfernt
gebnis
werden?" Nein. Datei wurde nicht geschrieben.
6. ReadOnly.txt in RO_Leer.txt konvertie- Meldung: "Soll die Datei (...) überschrieben entspricht erren --> Schreibschutz entfernen.
werden." Ja. Meldung: "Datei (...) ist Schreib- wartetem Ergeschützt, soll der Schreibschutz entfernt
gebnis
werden?" Ja. Datei wurde mit neuem Inhalt
überschrieben. Der Schreibschutz ist entfernt
worden.
7. myself.txt in myself.txt kodieren.
Meldung: "Soll die Datei (...) überschrieben
werden." Ja. Datei wird mit neuem Inhalt überschrieben.
entspricht erwartetem Ergebnis
8. KM-Zähler Test: 26x26x26 = 17576
Nach genau 17576 Buchstaben wiederholt
Buchstaben. Die Datei AAA20k.txt be- sich die kodierte Buchstabenfolge der
steht aus 20.000 A's, sie wird in die
AAA20k_Code -- Datei.
Datei AAA20k_Code.txt kodiert.
entspricht erwartetem Ergebnis
Einstellungen Sichern /Laden
Testfall
erwartetes Ergebnis
1. anlegen von einst.dat
einst.dat wird erstellt
2. überschreiben von überschreib_mich.dat
Meldung: "Datei (..) existiert bereits, soll Sie
überschrieben werden?" Ja. Datei wurde überschrieben.
3. überschreiben von Read_Only.dat
Meldung: "Datei (..) existiert bereits, spll sie
überschrieben werden?" Ja. "Datei (..) ist
Schreibgeschützt, soll SS entfernt werden?"
Ja. SS ist entfernt worden, die Datei wurde
überschrieben.
- 20 -
erzieltes Ergebnis
entspricht erwartetem Ergebnis
entspricht erwartetem Ergebnis
entspricht erwartetem Ergebnis
Benutzer- & Programmierhandbuch
4. Laden von überschreib_mich.dat
Die Einstellungen werden geladen und im
Fenster "Einstellungen" korrekt angezeigt.
5. Fehlerhafte Einstellungen sichern.
(Bsp: Anfangstellung nicht mit Return
bestätigt.)
Meldung: "Datei wird nicht gespeichert, weil entspricht erdie Eingaben unvollständig sind. Bitte beach- wartetem Erten Sie (..)" Die Einstellungen können korigebnis
giert werden.
Einstellungen vornehmen
Testfall
entspricht erwartetem Ergebnis
erwartetes Ergebnis
erzieltes Ergebnis
1. Fehlerhafte Einstellungen übernehmen Meldung: "Es wurden die alten Einstellunngen entspricht er(Bsp: Anfangstellung nicht mit Return geladen, weil die Eingaben unvollständig
wartetem Erbestätigt.)
sind. Bitte beachten Sie (..)" Die Einstellun- gebnis
gen können nicht mehr korigiert werden. Das
Fenster "Einstellungen" ist geschlossen.
2. Fehlerhafte Einstellungen abbrechen. Das Fenster wird geschlossen, die alten Ein- entspricht erstellungen werden verwendet.
wartetem Ergebnis
3. Drei (ungerade Anzahl) Stecker im
Keine Meldung! Die korrekt vertauschten
entspricht erPlugboard getauscht. --> Übernehmen Buchstaben wurden vertauscht. Der "Partner- wartetem Erlose" wurde ignoriert und wird nicht vergebnis
tauscht.
4. veränderte (aber vollständige) Einstel- Das Fenster wird geschlossen, die neuen Ein- entspricht erlungen Übernehmen.
stellungen werden verwendet.
wartetem Ergebnis
5. veränderte (aber vollständige) Einstel- Das Fenster wird geschlossen, die alten Ein- entspricht erlungen Abbrechen.
stellungen werden verwendet.
wartetem Ergebnis
Ini-Datei
Testfall
erwartetes Ergebnis
erzieltes Ergebnis
1. Es existiert keine "Enigma.ini" in dem Eine korrekte Enigma.ini wird stillschweigend entspricht erselben Verzeichnis der Enigma.exe.
angelegt.
wartetem Ergebnis
2. Plugboard hat mehr als 20 Buchstaben
Meldung: "Ihre Ini-Datei ist fehlerhaft. Sie wird entspricht erneu angelegt und eingelesen." Programm
wartetem Erstartet mit den Einstellungen aus der übergebnis
schriebenen Ini-Datei.
3. Plugboard hat keine gerade Anzahl
Meldung: "Ihre Ini-Datei ist fehlerhaft. Sie
entspricht ervon Buchstaben
wird neu angelegt und eingelesen." Prowartetem Ergramm startet mit den Einstellungen aus der gebnis
überschriebenen Ini-Datei.
5. Die Rotoren bestehen nicht aus 26 un- Meldung: "Ihre Ini-Datei ist fehlerhaft. Sie wird entspricht erterschiedlichen Buchstaben.
neu angelegt und eingelesen." Programm
wartetem Erstartet mit den Einstellungen aus der übergebnis
schriebenen Ini-Datei.
6. Doppelte Rotoren oder falsche Rotoren Meldung: "Ihre Ini-Datei ist fehlerhaft. Sie wird entspricht erin den Voreinstellungen (z.B. "Ro4"
neu angelegt und eingelesen." Programm
wartetem Eroder "Rotor6")
startet mit den Einstellungen aus der übergebnis
schriebenen Ini-Datei.
- 21 -
Enigma
7. Falscher Key in den Voreinstellungen
(er ist nicht dreistellig oder besteht
nicht aus Großbuchstaben)
Meldung: "Ihre Ini-Datei ist fehlerhaft. Sie wird entspricht erneu angelegt und eingelesen." Programm
wartetem Erstartet mit den Einstellungen aus der übergebnis
schriebenen Ini-Datei.
8. Die Umkehrwalze ist nicht "WalzeA"
oder "WalzeB"
Meldung: "Ihre Ini-Datei ist fehlerhaft. Sie wird entspricht erneu angelegt und eingelesen." Programm
wartetem Erstartet mit den Einstellungen aus der übergebnis
schriebenen Ini-Datei.
Speicherverwaltung
Die folgenden Testfälle beziehen sich auf das Formular „Memory Check“ (siehe Kap. XXX).
(im Hauptformular Btn_MemoryCheck auf visible = true setzen.)
Testfall
erwartetes Ergebnis
erzieltes Ergebnis
1. Ist der Ring richtig verkettet?
Für jeden Eintrag i muss gelten:
entspricht erNext(i) = Self(i +1) .
wartetem ErDie letzte Adresse (Next(last)) muss dabei im- gebnis
mer (!) auf die Adresse des ersten Ringelements (Self(first)) zeigen.
2. Wird der Speicher wieder freigegeben? Meldung: „C gelöscht.“
entspricht erEinen Eintrag löschen, dazu in dem E- Das „C“ wird aus dem Ring (=der zweiten
wartetem Erditfeld „Löschen“ z.B. ein „C“ eingeben. Spalte) gelöscht.
gebnis
Beim Anzeigen der Ringelemente wird das C
ausgelassen (erste Spalte). Die Next-Adresse
von „B“ (Vorgänger) ist nun identisch mit der
Self-Adresse von „D“ (Nachfolger).
Zähler verringert sich um 1 (dispose).
3. Wird der Speicher für die Ringelemente richtig alloziiert?
Einen Eintrag hinzufügen, dazu in dem
Editfeld „Hinzufügen“ z.B. ein „C“ eingeben.
Es können nur die Buchstaben hinzugefügt werden, die fehlen!
entspricht erMeldung: „C wieder hinzugefügt.“
Das „C“ wurde an der nächsten Position von wartetem Erdem aktuellen Einstiegspunkt in den Ring
gebnis
(zweite Spalte) eingefügt.
In der ersten Spalte wird das „C“ wieder angezeigt.
Next(i) = Self(i+1) gilt.
Zähler erhöht sich um 1 (new).
4. Schrittweise entfernen eines ganzen
Rings.
Im Editfeld „Löschen“ das gesamte Alphabet eingeben (jeden Buchstaben
mit Return bestätigen).
5. Programm-Start simulieren:
„Alle Füllen“
6. Programm-Ende simulieren:
„Alle Freigeben“
- 22 -
Meldung für jeden Buchstaben.
Die Liste wird immer kürzer, die Ringstruktur
bleibt dabei stets geschlossen.
Ist nur noch ein Buchstabe vorhanden, zeigt
dieser auf sich selbst.
Ist kein Buchstabe mehr vorhanden, dann ist
die Einstiegsadresse #0 (NIL).
Alle drei Ringe werden gelöscht und komplett
neu angelegt.
Der Zähler steht bei 26 x 3 = 48.
entspricht erwartetem Ergebnis
Alle drei Ringe werden gelöscht.
Der Zähler steht auf 0.
Die Einstiegspunkte sind alle drei #0 (NIL).
entspricht erwartetem Ergebnis
entspricht erwartetem Ergebnis
Benutzer- & Programmierhandbuch
6. Änderungen...
6.1 ...am Quellcode
Datum
13.05.05
Name
R. Räthel
Unit
Procedur / Funktion
-- Compilereinstellungen --
Änderung
Optimierung = Aus
Erweiterte Syntax = Aus
Bereichsprüfung = Ein
I/O-Prüfung = Ein
Überlaufprüfung = Ein.
13.05.05
R. Räthel
foEinstellungen
saveClick (P)
showmessage statt messageDlg
verwendet.
13.05.05
R. Räthel
foMemCheck
ed_Pointer2KeyPress (P)
vor ins_Ringelemente Variable und
Zuweisungsoperator eingefügt.
13.05.05
R. Räthel
foEinstellungen
ed_KeyKeyPress (P)
untere Grenze der lokalen Variable
„l“ (länge) auf 0 gesetzt, statt auf 1.
13.05.05
R. Räthel
unRing
unit-global
globale Variable "Current" entfernt.
6.2 ...an der Dokumentation
Datum
14.05.05
Name
R. Räthel
Kapitel
5. Progammtests
Änderung
Test-Tabelle „Speicherverwaltung“ hinzugefügt
14.05.05
R. Räthel
2.4 Memory Check (Übersicht)
Neues Kapitel eingeführt
14.05.05
R. Räthel
3.2 Rotoren bzw. Ringe
Grafik angepasst und hinzugefügt.
22.05.05
R. Räthel
2. Problemanalyse
komplett überarbeitet,
diverse Kapitel eingefügt,
Skizzen eingefügt
15.05.05
R. Räthel
6. Änderungen...
Neues Kapitel eingeführt
22.05.05
R. Räthel
Inhaltsverzeichnis
Inhaltsverzeichnis angepasst
- 23 -