Autor Beitrag
Fiete
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 617
Erhaltene Danke: 364

W7
Delphi 6 pro
BeitragVerfasst: Do 27.11.08 21:27 
Simulation einer Wehrmachts-Enigma mit drei Rotoren.
Die schrittweise Verarbeitung wird dargestellt.

Informationen zum Aufbau und der Funktionsweise gibt es hier:
de.wikipedia.org/wiki/Enigma_(Maschine)

Anleitung zur Bedienung:
Im Editfeld für die Walzenlage müssen drei Rotornummern aus dem Bereich 1-5 stehen, natürlich alle verschieden, z.B. 123 (Startseite von enigmaco.de/enigma/enigma_de.html, hier gibt es keine Ringe!).
Interne Werte:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
                                   0                        25
                              Alfa='ABCDEFGHIJKLMNOPQRSTUVWXYZ';
       Rotor:Array[1..5]of String=('EKMFLGDQVZNTOWYHXUSPAIBRCJ',  // Rotor I
                                   'AJDKSIRUXBLHWTMCQGZNPYFVOE',  // Rotor II
                                   'BDFHJLCPRTXVZNYEIWGAKMUSQO',  // Rotor III
                                   'ESOVPZJAYQUIRHXLNFTGKDCMWB',  // Rotor IV
                                   'VZBRGITYUPSDNHLXAWMJQOFECK'); // Rotor V
       Kerbe='QEVJZ';                                             // Übertragskerbe der Rotoren
       ReflektorB='YRUHQSLDPXNGOKMIEBFZCWVJAT';                   // Reflektor B
//     Umkehrwalze B: AY BR CU DH EQ FS GL IP JX KN MO TZ VW

       ReflektorC='FVPJIAOYEDRZXWGCTKUQSBNMHL';                   // Reflektor C
//     Umkehrwalze C: AF BV CP DJ EI GO HY KR LZ MX NW QT SU

Walze 1 ist links (langsamer Rotor), Walze 2 in der Mitte und Walze 3 rechts (schneller Rotor) eingesetzt. Die Ringe, die außen am Walzenkörper angebracht sind und den Versatz zwischen der internen Verdrahtung der Walzen und dem Buchstaben bestimmen, zu dem der Übertrag auf die nächste Walze erfolgt, seien HDX, wobei "HDX" bedeutet: 1.Rotor um 7, 2.Rotor um 3 und 3.Rotor um 23 verschoben.
Die Grundstellung ist die Startstellung der drei Walzen, "HDX" bedeutet Rotor 1 beginnt mit H, Rotor 2 beginnt mit D, Rotor 3 beginnt mit X. Als Reflektoren sind B oder C möglich.

Die Ein- bzw. Ausgabe können im Normalmodus oder in 5-Blöcken angezeigt werden.
Das Steckbrett enthält die Steckerverbindungen(max. 10 Paare, natürlich alle verschieden!)

Nach dem Start der Enigma können die Buchstaben per Tastatur oder Mausclick eingegeben werden. Zu jedem Buchstaben wird die Veränderung durch die Rotoren in der Rotoranzeige angezeigt, "rot" kennzeichnet den Weg der Veränderung zum Reflektor hin, "grün" den Weg zurück zur Tastatur.

Wer Texte über die Zwischenablage oder direkt im Eingabefeld eingeben möchte, der muß die Checkbox ReadOnly deaktivieren. Jetzt wird der Button "Coden" aktiviert. Die gesamte Eingabe wird verarbeitet.

Falls Einstellungen geändert werden sollen, muß die Enigma angehalten werden.

Mit dem Reset-Button kommt man in die Startstellung der Enigma.

Beispiel aus wikipedia:

Das Oberkommando der Wehrmacht gibt bekannt: Aachen ist gerettet.
Durch gebündelten Einsatz der Hilfskräfte konnte die Bedrohung abgewendet
und die Rettung der Stadt gegen 18:00 Uhr sichergestellt werden.

Da die ENIGMA nur Großbuchstaben und keine Ziffern oder Satzzeichen verschlüsseln kann und auch kein Leerzeichen kennt, muss der oben dargestellte Klartext vor der Verschlüsselung zunächst entsprechend aufbereitet werden. Dabei werden Satzzeichen durch „X“ ersetzt, Eigennamen verdoppelt und in „X“ eingeschlossen und Zahlen ziffernweise ausgeschrieben. Ferner war es üblich, (außer bei Eigennamen) das „ch“ durch „Q“ zu ersetzen und den Text anschließend in Fünfergruppen aufzuteilen.
Man erhält somit den folgenden für die Verschlüsselung vorbereiteten Klartext:

ausblenden Quelltext
1:
2:
3:
4:
DASOB ERKOM MANDO DERWE HRMAQ TGIBT BEKAN NTXAA CHENX AACHE
NXIST GERET TETXD URQGE BUEND ELTEN EINSA TZDER HILFS KRAEF
TEKON NTEDI EBEDR OHUNG ABGEW ENDET UNDDI ERETT UNGDE RSTAD
TGEGE NXEIN SXAQT XNULL XNULL XUHRS IQERG ESTEL LTWER DENX


Codetext:
ausblenden Quelltext
1:
2:
3:
4:
LJPQH SVDWC LYXZQ FXHIU VWDJO BJNZX RCWEO TVNJC IONTF QNSXW
ISXKH JDAGD JVAKU KVMJA JHSZQ QJHZO IAVZO WMSCK ASRDN XKKSR 
FHCXC MPJGX YIJCC KISYY SHETX VVOVD QLZYT NJXNU WKZRX UJFXM 
BDIBR VMJKR HTCUJ QPTEE IYNYN JBEAQ JCLMU ODFWM ARQCF OBWN


Erläuterung für die Codierung von "W"
Walzen: 143, Ringe PZH, Start RTZ, Reflektor B,
Steckbrett ADCNETFLGIJVKZPUQYWX

user defined image
aus W wird durch das Steckbrett X, IM Rotor3 wird aus X durch die Verdrahtung I (X->S->I, wegen Ring3=H <==> 7 Buchstaben nach links!), der Ausgang von Rotor3 ist P=I+7, P->I (Übergang von Rotor3 nach Rotor4), IM Rotor4 wird aus I durch die Verdrahtung Q (I->Y->Q, wegen Ring2=Z <==> 25 Buchstaben nach links!), der Ausgang von Rotor4 ist P=Q+25, P->N (Übergang von Rotor4 nach Rotor1), IM Rotor1 wird aus N durch die Verdrahtung C (N->W->C, wegen Ring3=P <==> 15 Buchstaben nach links!), der Ausgang von Rotor1 ist R=C+15, R->A->Y (Übergang im Reflektor)-A->Y, IM Rotor1 wird aus P durch die Verdrahtung A (A=P-15, wegen Ring3), ist verbunden mit J=U+15, J->L (Übergang von Rotor1 nach Rotor4), IM Rotor4 wird aus L durch die Verdrahtung M (M=L-25, wegen Ring2), ist verbunden mit W=X+25, W->D (Übergang von Rotor4 nach Rotor3), IM Rotor3 wird aus D durch die Verdrahtung W (W=D-7, wegen Ring1), ist verbunden mit Y=Q+7, aus Y auf dem Steckbrett wird Q.

Der Kern der Berechnungen:
Position:=pos(Zeichen,Alfa)-1;
Position:=SteckBrett[Position]; // Steckerverbindung
Position:=(RotorR_Liste[(Position+26-RingR+ZaehlerR)mod 26]+(RingR+26-ZaehlerR))mod 26;
Position:=(RotorM_Liste[(Position+26-RingM+ZaehlerM)mod 26]+(RingM+26-ZaehlerM))mod 26;
Position:=(RotorL_Liste[(Position+26-RingL+ZaehlerL)mod 26]+(RingL+26-ZaehlerL))mod 26;
Position:=UmkehrWalze[Position]; // Umkehrwalze
Position:=(RotorL_Invers[(Position+26-RingL+ZaehlerL)mod 26]+(RingL+26-ZaehlerL))mod 26;
Position:=(RotorM_Invers[(Position+26-RingM+ZaehlerM)mod 26]+(RingM+26-ZaehlerM))mod 26;
Position:=(RotorR_Invers[(Position+26-RingR+ZaehlerR)mod 26]+(RingR+26-ZaehlerR))mod 26;
Position:=SteckBrett[Position]; // Steckerverbindung
Zeichen:=Alfa[Position+1];

Viel Spaß
Fiete
Einloggen, um Attachments anzusehen!
_________________
Fietes Gesetz: use your brain (THINK)

Für diesen Beitrag haben gedankt: User93