Autor Beitrag
D0P3 F!$H
Gast
Erhaltene Danke: 1



BeitragVerfasst: Mo 04.11.02 22:07 
So ... da bin ich wieder!

Ich kann es ja nicht oft genug sagen:
DANKE, dass ich mir helft! (Ich bin zu Tränen gerührt :cry: )

MathiasSammack hat folgendes geschrieben:
Aber die ENIGMA dürfte nach einem anderen Prinzip arbeiten. Ich habe insgesamt 8 Rotoreinstellungen gefunden, von denen einer diese Zusammensetzung hatte:

Wo ... Wo ... Wo find ich die (nur wichtig, wenn es Originaleinstellungen sind)

MathiasSammack hat folgendes geschrieben:
ausblenden Quelltext
1:
2:
abcdefghijklmnopqrstuvwxyz 
EKMFLGDQVZNTOWYHXUSPAIBRCJ

So würde jedenfalls die Walze aussehen, wenn man die numerischen Rotorwerte in ihre ASCII-Entsprechungen umsetzt. Hier gibt es übrigens schöne Kombinationen, oder sagt man "Permutationen"? Verfolge mal den Weg von A! Also
ausblenden Quelltext
1:
A -> E -> L -> T -> P ...					

Irgendwann landest du wieder beim A. Bei I und J ist es noch deutlicher.

Also da steige ich nicht mehr durch!
Aber ich sehe vier Möglichkeiten für deine einzigartigen, unergründlichen 'Gedankenwege': :wink:
1. Du meinst, dass du nacheinander die Buchstaben 'A', 'E', 'L', 'T', 'P' ... eingetippt hast (Dann ergäbe das Beispiel aber wenig Sinn, oder?)
2. Du meinst, du hast 'A' eingetippt und erhälst 'E', dann 'L' und 'T', dann 'P' und ... (Wäre unlogisch, da du die Walzendrehung nach jeden Buchstaben vergessen hättest, nicht wahr?)
3. Es hat etwas mit
Zitat:
So würde jedenfalls die Walze aussehen, wenn man die numerischen Rotorwerte in ihre ASCII-Entsprechungen umsetzt.
zu tun, nur das verstehe ich nicht. :wink:
4. Es ist etwas ganz anderes!

MathiasSammack hat folgendes geschrieben:
Ausgehend von meiner o.g. Änderung des Codes habe ich noch folgendes für dich. Da du aber die gute Note haben willst, mache ich´s dir nicht ganz so einfach ...

:shock: Erstmal war ich geschockt ... (So ein altes, zensiert, zensiert, zensiert ZENSIERT) *schämt sich auch wirklich ganz ganz dolle dafür - doppelschwör*

Aber ich habe es dann ziemlich schnell geknackt, weil du es mir doch einfach gemacht hast (viele Wörter konnte ich schon vorher erraten - VSMRKSZTGNRHTA1 - also das war echt schwer :wink: )

MathiasSammack hat folgendes geschrieben:
Im Augenblick kann man leider noch nichts an den Einstellungen ändern, d.h. die Kodierung erfolgt immer nach dem selben Schema.

Also meine Enigma kann jetzt mit einer Walze und beliebiger Startposition verschlüsseln. 8) (Oh yeah, baby ... -.-) :wink:

MathiasSammack hat folgendes geschrieben:


So ... das war es erstmal.
Als nächstes will ich eine Auswahl mehrerer Walzen ins Programm integrieren.

Aber eine Frage habe ich dann doch noch!
Wenn ich das Prinzip richtig verstanden habe, dann kann ich mit der richtigen Walzenanordnung, der Anfangsposition und der kodierten Nachricht diese entschlüsseln, oder?
Beispiel:
Ich nehme folgende Walze: 'QWERTZUIOPASDFGHJKLYXCVBNM'
Anfangsbuchstabe: 'C'
Text: 'Hallo ihr da draussen'
Kodierter Text: 'PRHJX HHQ FS HTGPOPVU'

Wenn ich jetzt den Text dekodieren müsste, würde ich die Enigma so einstellen:
Walze : NR 1. 'QWERTZUIOPASDFGHJKLYXCVBNM'
Anfangsbuchstabe: 'C'
Text: 'PRHJX HHQ FS HTGPOPVU'
"kodierter" Text: 'Hallo ihr da draussen'

Richtig so, oder habe ich was falsch verstanden? :?
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mo 04.11.02 23:06 
Hi!

Ich weiß natürlich nicht, wie sicher diese Quelle ist, aber hier habe ich etwas zu den Originaleinstellungen der Enigma gefunden.

DOP3 F!$H hat folgendes geschrieben:
2. Du meinst, du hast 'A' eingetippt und erhälst 'E', dann 'L' und 'T', dann 'P' und ... (Wäre unlogisch, da du die Walzendrehung nach jeden Buchstaben vergessen hättest, nicht wahr?)
Trotzdem ist es IMHO das, was er sagen wollte. Aber Du hast Recht: so stimmt es nicht. Aber bei hinreichend großer Walzenanzahl wird ein Buchstabe irgendwann wieder auf sich selbst abgebildet.

Zu Deiner Frage: ich weiß nicht ganz, was Du mit Anfangsbuchstabe meinst (sorry, wahrscheinlich mein Fehler). Aber prinzipiell musst Du bei der Enigma alles rückwärts machen, oder? Wenn ich einen kodierten Buchstaben noch einmal durch die gleiche Anordnung schicke, bekomme ich nicht den dekodierten Buchstaben zurück. Oder habe ich falsch verstanden, wie Du dekodieren willst?

MfG,
Peter

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 05.11.02 08:50 
Mal generell: du hättest auch das alte Thema weiter benutzen können. Hättest ihm halt nur einen anderen Titel gegeben, und dann wär´s z.B. nach "ObjektPascal" verschoben worden. Jetzt fangen wir wieder von vorn an ... Also, für alle Neueinsteiger -> hier ist der Beitrag, auf dem dieser hier basiert.

D0P3 F!$H hat folgendes geschrieben:
Wo ... Wo ... Wo find ich die (nur wichtig, wenn es Originaleinstellungen sind)

Nun, ob sie original sind, weiß ich nicht so genau. Ich werde erst mal weiter versuchen, den Code nach Delphi umzusetzen, und dann gebe ich´s frei. Aber auch erst, wenn deine Hausaufgabe benotet wurde. :twisted:
ausblenden Quelltext
1:
A -> E -> L -> T -> P ...					

Zitat:
Also da steige ich nicht mehr durch!

Kurz gesagt: du tippst das A ein und erhältst das kodierte E. Also suchst du in der oberen Reihe das E und erhältst das L, usw.
Zitat:
Wäre unlogisch, da du die Walzendrehung nach jeden Buchstaben vergessen hättest, nicht wahr?

Ja, es geht aber nur um die Wegverfolgung der einzelnen Buchstaben.
Zitat:
Aber ich habe es dann ziemlich schnell geknackt, weil du es mir doch einfach gemacht hast (viele Wörter konnte ich schon vorher erraten - VSMRKSZTGNRHTA1 - also das war echt schwer :wink: )

Und was habe ich nun gepostet? Den Klartext bitte! :wink:

Zitat:
Also meine Enigma kann jetzt mit einer Walze und beliebiger Startposition verschlüsseln.

Wie gesagt, ich bin dabei die Vorlage, die ich habe, nach Delphi umzusetzen. Darum kann ich mich um solche Feinheiten immer erst bei Gelegenheit kümmern. Aber die Ausgangsposition usw. ist das geringste Problem. Im Moment verschlüsselt mein Programm bereits mit 3 Walzen. Und da wir ja hier nicht mechanisch arbeiten, wäre es kein Problem 5, 6 oder noch mehr Walzen zu nutzen:
ausblenden Quelltext
1:
2:
var
  rotor : array[0..9]of TEnigmaRotor;

Es gibt acht verschiedene Rotortypen. Und die Auswahl der Startposition ist natürlich von A bis Z möglich. Dazu kommt noch der Reflektor, und außerdem werden die Signale auf dem Rückweg nochmals durch die Rotoren geschickt ...

Zitat:
Aber eine Frage habe ich dann doch noch! (...)

Welches Programm meinst du? Dein eigenes? Hm, dann müsstest du die Antwort doch eigentlich wissen, wenn du mein kodiertes Geschenk korrekt entschlüsseln konntest. Aber es sollte so funktionieren, wie du es beschrieben hast.

Peter hat folgendes geschrieben:
ich weiß nicht ganz, was Du mit Anfangsbuchstabe meinst (sorry, wahrscheinlich mein Fehler).

Der Anfangsbuchstabe legt bei ihm fest, welcher Buchstabe seiner Walze für die erste Kodierung herangezogen wird. Normalerweise ist die Walzendrehung bei ihm Null, womit aus dem A dann ein Q werden würde. (s. seinen Walzenstring "QWERT...."). Stellst du C ein, erhöht sich die Walzendrehung um 2, so dass aus dem H (normalerweise I in seiner Walze!) das P wird (+2).

Zitat:
Aber prinzipiell musst Du bei der Enigma alles rückwärts machen, oder? ... Wenn ich einen kodierten Buchstaben noch einmal durch die gleiche Anordnung schicke, bekomme ich nicht den dekodierten Buchstaben zurück.

Bei der Umsetzung von D0P3 F!$H benötigt man eine eigene Dekodierfunktion. Wie du sagtest: im Prinzip alles rückwärts machen. Der erste Buchstabe stimmt überein, dann käme die Walzendrehung; nur, dass du den Wert diesmal abziehen und nicht addieren müsstest.

Bei der richtigen ENIGMA brauchst du keine Dekodiereinheit. Du schickst den kodierten Text durch die selbe Anordnung, mit der du den Originaltext geschrieben hast. Daraus entsteht dann wieder eben dieser Klartext.
Und deswegen glaube ich ja auch, dass die Anordnung der Buchstaben bei der ENIGMA nicht ganz so zufällig sein darf.
Tino
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: Di 05.11.02 10:18 
@DOP3 F!$H: Als ich geschrieben habe Du sollst ein neues Topic aufmachen bezog ich mich auf folgenden Kommentar von Dir:
DOP3 F!$H hat folgendes geschrieben:
Doch ich habe schon wieder eine Frage:

Es gibt so ComboBoxen (glaub ich jedenfalls, dass die ComboBox das ist, was ich brauche ). {...}
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 05.11.02 11:12 
Tino: kann man diese Seiten eigentlich an den alten Beitrag anhängen? Schön wär´s. Dann könnte man die Sache wieder zusammenfassen. Oder geht das nicht?
Wenn´s nicht geht, dann posten wir die Beiträge eben noch einmal im alten Thread, und danach könnte der hier dann gelöscht werden.

Wie auch immer - mal zum Ausprobieren: enigma+dopefish.zip (335k). Sind nur die EXEn (:wink:), und weil´s VCL ist, ist´s leider ein bisschen größer geworden. Bei der ENIGMA fehlt noch das Steckbrett. In der "dopefish.exe" (:twisted:) gibt´s einen Button, der sich "work now!" nennt. Wenn man fertigen Text hat, dann kann man den ins Memo kopieren. Dadurch wird aber das "OnKeypress" nicht wirksam. Also klickt man auf besagten Button und der Text wird ver- oder entschlüsselt. Wie´s gewünscht wird.
Sven
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 314


D6 Ent, K3 Pro (patched)
BeitragVerfasst: Di 05.11.02 13:58 
Ich finde die ganze Sache sehr interessant und habe auch beide Programme ausprobiert. Was mir nur aufgefallen ist, daß Schreibkorrekturen leider nicht vorgenommen werden können. Auch wenn es sich um die funktionelle Nachbildung der Enigma handelt, wäre es in Zeiten von HighTech doch sinnvoll, bei der Eingabe #8 und #46 zuzulassen. Außerdem könnte man aus der Anordnung der kodierten Buchstaben auch schon Rückschlüsse auf den Text erkennen. Eine Anordung in 3er oder 4er-Blöcke wäre nicht schlecht.

Sven

_________________
MDK 9.1, Kernel 2.4.21, KDE 3.1 Kylix 3 Pro (patched), nutze aber auch Windows
Tino
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: Di 05.11.02 14:10 
MathiasSimmack hat folgendes geschrieben:
Tino: kann man diese Seiten eigentlich an den alten Beitrag anhängen?

Leider nicht :cry:
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Di 05.11.02 14:18 
Mathias hat folgendes geschrieben:
Der Anfangsbuchstabe legt bei ihm fest, welcher Buchstabe seiner Walze für die erste Kodierung herangezogen wird. Normalerweise ist die Walzendrehung bei ihm Null, womit aus dem A dann ein Q werden würde. (s. seinen Walzenstring "QWERT...."). Stellst du C ein, erhöht sich die Walzendrehung um 2, so dass aus dem H (normalerweise I in seiner Walze!) das P wird (+2).

Hmmm.... irgendwie leuchtet mir das nicht ein. Habe das jetzt mal durchgespielt:

Standardstellung:
ausblenden Quelltext
1:
2:
QWERTZUIOPASDFGHJKLYXCVBNM
abcdefghijklmnopqrstuvwxyz


c soll also der Anfangsbuchstabe sein:
ausblenden Quelltext
1:
2:
QWERTZUIOPASDFGHJKLYXCVBNM
cdefghijklmnopqrstuvwxyzab


ist das gleiche wie:
ausblenden Quelltext
1:
2:
NMQWERTZUIOPASDFGHJKLYXCVB
abcdefghijklmnopqrstuvwxyz

Dann kommt für 'h' aber nicht das P heraus.

Das kommt nur heraus, wenn wir es anders herum machen:
ausblenden Quelltext
1:
2:
ERTZUIOPASDFGHJKLYXCVBNMQW
abcdefghijklmnopqrstuvwxyz


Ist das gleiche wie:
ausblenden Quelltext
1:
2:
QWERTZUIOPASDFGHJKLYXCVBNM
yzabcdefghijklmnopqrstuvwx


Jetzt ist C aber nicht mehr der Anfangsbuchstabe! Wo liegt mein Fehler?

Mathias hat folgendes geschrieben:
Und deswegen glaube ich ja auch, dass die Anordnung der Buchstaben bei der ENIGMA nicht ganz so zufällig sein darf.
Nein, dann bestimmt nicht. Ist wahrscheinlich wie bei den Permutationstabellen beim DES-Algorithmus. Die sehen auch aus wie Kraut und Rüben, sind aber absolut nicht zufällig.

MfG,
Peter

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 05.11.02 15:39 
Sven hat folgendes geschrieben:
Was mir nur aufgefallen ist, daß Schreibkorrekturen leider nicht vorgenommen werden können.

Stimmt. Darum habe ich mich vorerst gedrückt und "pre-alpha" in die Titelleiste geschrieben ... :wink: ... beim nächsten Mal ... Aber was ist
Zitat:
#46

?

Zitat:
Außerdem könnte man aus der Anordnung der kodierten Buchstaben auch schon Rückschlüsse auf den Text erkennen. Eine Anordung in 3er oder 4er-Blöcke wäre nicht schlecht.

4er-Blöcke, das ist gut! Das habe ich schon mal irgendwo gesehen. Das Leerzeichen (#32) war eigentlich schon ein Kompromiss; die Vorlage, die ich habe, erlaubt wirklich nur die Buchstaben von A bis Z.

Peter hat folgendes geschrieben:
c soll also der Anfangsbuchstabe sein

Peter. Ich habe mich dumm ausgedrückt. Also, die Variable "DrehungenWalze1" steht bei D0P3 F!$H anfangs auf Null. Wenn du also z.B. das A kodieren willst, dann müsstest du auf das Q kommen. Und da die Drehung Null ist, muss nichts addiert werden. - Wenn wir jetzt sagen, die Ausgangsposition ist der Buchstabe C, dann ist das so gemeint:
ausblenden Quelltext
1:
DrehungenWalze1 := BYTE(Ausgang) - BYTE('A');					

Bei C also:
ausblenden Quelltext
1:
67 - 65 = 2					

Das heißt, du kodierst das A zum Q, fügst aber noch die "Walzendrehung" hinzu (+2) und kommst so auf das E. Das gleich in Grün für´s H: das H ist mit der Position des I in der "Walze" identisch, +2 ergibt dann das P.
Die Lösung für dieses "Drehproblem" liegt in der Verschlüsselungsfunktion von D0P3 F!$H. War also doch ganz gut, dass ich schon mal die Dekodierung programmiert habe. :twisted:
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Di 05.11.02 18:51 
Hi!

Mathias hat folgendes geschrieben:
Peter.

Wer? Ich?

Mathias hat folgendes geschrieben:
Das heißt, du kodierst das A zum Q, fügst aber noch die "Walzendrehung" hinzu (+2) und kommst so auf das E. Das gleich in Grün für´s H: das H ist mit der Position des I in der "Walze" identisch, +2 ergibt dann das P.
Okay, jetzt habe ich es kapiert. Aber die Formulierung mit dem Anfangsbuchstaben ist wirklich unpassend. Und das überhaupt in Buchstabenform anzugeben ist auch - entschuldige - blöd.

Bei Deinem Programm ist mir noch etwas aufgefallen: ein Buchstabe wird, egal wie oft man ihn hintereinander eingibt, nie auf sich selbst abgebildet! (Okay, ein Mathematiker würde jetzt sagen, dass ich das nicht wissen kann, weil ich nicht unendlich viele Zeichen eingegeben habe, aber wer hört schon auf Mathematiker?) Leider kenne ich Deinen Quelltext nicht, es würde mich wirklich interessieren, weshalb das so ist. Oder stand das in einer der Internetseiten über die Enigma?

MfG,
Peter

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Di 05.11.02 18:55 
Vergiss meine letzte Frage / Bemerkung. Hab's gefunden. Der Reflektor. Der auch erklärt, warum die richtige Enigma eine symmetrische Verschlüsselung produziert.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 05.11.02 19:06 
@Peter: schon vergessen.

Also, ich habe jetzt mitterweile mal die 4er-Blöcke eingebaut -aber diese neue Version ist noch nicht hochgeladen! Sieht sehr lustig aus. :)
Aber ich denke, auf Backspace und Co. werde ich wohl auch weiterhin verzichten. Man könnte es ja später so machen, dass man -auf Knopfdruck- einen fertigen Text verschlüsseln lässt. Also nicht mehr diese Echtzeit-Kodierung während man tippt.
Für´s erste werde ich also eine Variante am historischen Original machen. Der Zeilenumbruch ist das einzige Zugeständnis. :)

Zitat:
Und das überhaupt in Buchstabenform anzugeben ist auch - entschuldige - blöd.

Na ja, letzten Endes ist es meine Schuld. Die "dopefish.exe" basiert ja nur auf der Methode, die sich D0P3 F!$H hier ausgedacht hat. Ich habe nur ein bisschen vorgegriffen und schon mal alles zusammengebaut.
Deswegen gebe ich ja den Code noch nicht raus, sonst kriegt der Bursche ´ne 1+. :mrgreen: :wink:
Ich werde die Sache aber auch so ändern wie bei der Pre-Alpha der ENIGMA; mit einer Combobox zur Auswahl der Startposition.

Zitat:
Oder stand das in einer der Internetseiten über die Enigma?

Also, ich richte mich da nach den Vorgaben, die ich habe:
ausblenden volle Höhe Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
const
  IPEG     = 24;   // Y
  I        : array[0..ROTORSIZE-1]of byte =
    (4,10,12,5,11,6,3,16,21,25,13,19,14,22,24,7,23,20,18,15,0,8,1,17,2,9);

  IIPEG    = 12;   // M
  II       : array[0..ROTORSIZE-1]of byte =
    (0,9,3,10,18,8,17,20,23,1,11,7,22,19,12,2,16,6,25,13,15,24,5,21,14,4);

  IIIPEG   = 3;    // D
  III      : array[0..ROTORSIZE-1]of byte =
    (1,3,5,7,9,11,2,15,17,19,23,21,25,13,24,4,8,22,6,0,10,12,20,18,16,14);

  IVPEG    = 17;   // R
  IV       : array[0..ROTORSIZE-1]of byte =
    (4,18,14,21,15,25,9,0,24,16,20,8,17,7,23,11,13,5,19,6,10,3,2,12,22,1);

  VPEG     = 7;    // H
  V        : array[0..ROTORSIZE-1]of byte =
    (21,25,1,17,6,8,19,24,20,15,18,3,13,7,11,23,0,22,12,9,16,14,5,4,2,10);

  VIPEG1   = 7;    // H
  VIPEG2   = 20;   // U
  VI       : array[0..ROTORSIZE-1]of byte =
    (9,15,6,21,14,20,12,5,24,16,1,4,13,7,25,17,3,10,0,18,23,11,8,2,19,22);

  VIIPEG1  = 7;    // H
  VIIPEG2  = 20;   // U
  VII      :array[0..ROTORSIZE-1]of byte =
    (13,25,9,7,6,17,2,23,12,24,18,22,1,14,20,5,0,8,21,11,15,4,10,16,3,19);

  VIIIPEG1 = 7;    // H
  VIIIPEG2 = 20;   // U
  VIII     : array[0..ROTORSIZE-1]of byte =
    (5,10,16,7,19,11,23,14,2,1,9,18,15,3,25,17,0,12,4,22,13,8,20,24,6,21);

und
ausblenden Quelltext
1:
2:
3:
4:
5:
const
  I  : array[0..REFLECTSIZE-1]of byte =
    (24,17,20,7,16,18,11,3,15,23,13,6,14,10,12,8,4,1,5,25,2,22,21,9,0,19);
  II : array[0..REFLECTSIZE-1]of byte =
    (5,21,15,9,8,0,14,24,4,3,17,25,23,22,6,2,19,10,20,16,18,1,13,12,7,11);


Die ???PEG-Angaben sind die "Merker", damit der jeweils letzte Rotor weiß, wann er seinen Vorgänger ggf. mitzudrehen hat. Die werden beim Initialisieren des Rotors an "rotateup1" und "rotateup2" übergeben (bzw. letzterer wird auf -1 gesetzt, wenn es keinen zweiten Wert gibt:


ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
{ ... }
  case whichOne of
    1: begin
         Move(I,rotor,ROTORSIZE);
         rotateUp1 := IPEG;
         rotateUp2 := -1;
       end;

{ ... }

procedure TEnigmaRotor.rotate(up: boolean);
begin
  if(up) then currentRotation := (currentRotation + 1) mod ROTORSIZE
    else begin
      dec(currentRotation); if(currentRotation < 0) then
                              currentRotation := ROTORSIZE - 1;
    end;

  if(up) and (nextRotor <> nil) and
    ((currentRotation = rotateUp1) or (currentRotation = rotateUp2)) then
  nextRotor.rotate(true);
end;
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Di 05.11.02 20:45 
Hi!

Mathias hat folgendes geschrieben:

Man könnte es ja später so machen, dass man -auf Knopfdruck- einen fertigen Text verschlüsseln lässt.

Jepp, gute Idee. Würde ich aber nur als Option machen, man sollte den Text auch noch selbst eingeben dürfen.

Mathias hat folgendes geschrieben:
Deswegen gebe ich ja den Code noch nicht raus, sonst kriegt der Bursche ´ne 1+.
Dann hoffe ich mal, dass er das Programm bald seinem Lehrer vorzeigt, damit ich mir Deinen Quellcode mal komplett anschauen kann.

Da Du den Reflektor auch eingebaut hast, ist es klar, dass nie ein Buchstabe auf sich selbst abgebildet wird und Du ein symmetrisches Verfahren hast.

MfG,
Peter

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
D0P3 F!$H
Gast
Erhaltene Danke: 1



BeitragVerfasst: Mi 06.11.02 17:23 
Hi!

MathiasSammck hat folgendes geschrieben:
Mal generell: du hättest auch das alte Thema weiter benutzen können. Hättest ihm halt nur einen anderen Titel gegeben, und dann wär´s z.B. nach "ObjektPascal" verschoben worden. Jetzt fangen wir wieder von vorn an

Tino hat folgendes geschrieben:
@DOP3 F!$H: Als ich geschrieben habe Du sollst ein neues Topic aufmachen bezog ich mich auf folgenden Kommentar von Dir:

:oops: Woher soll denn ich das wissen? Ich bin hier ein Nooby und habe davon doch keine Ahnung. :nixweiss:


Was heisst bitteschön IMHO?


Irgendwie steige ich seit einiger Zeit nicht mehr ganz durch! :wink:
Lasst mich mal meine Sicht der Dinge zusammentragen (Bitte antworten, ob es richtig oder falsch ist!):

1. Mathias Sammack, du baust deine eigene Enigma (momentan 3 Walzen) und hast davon auch was in den letzten Thread gepostest. Über deine Enigma habt ihr euch (du und Peter) unterhalten (Falls dies so sein sollte, vielleicht in Zukunft kenntlich machen, weil ich da immer durcheinandergekomme, um welche Enigma es denn nun geht).

2. Meine Enigma verschlüsselt korrekt (korrekt im Sinne vom Enigmaprinzip).
Beispiel mit Standardeinstellung:
ausblenden Quelltext
1:
2:
3:
4:
ABCDEFGHIJKLMNOPQRSTUVWXYZ { Tastaturanschluss an die Walze (Wer wird mit wem kodiert) }
QWERTZUIOPASDFGHJKLYXCVBNM { Walzenverschlüsselung }
Hallo ihr da draussen { Klartext }
IWFGL FFN SP FEDIUIXT { Kodierter Text }

Beispiel mit verändertem Anfangsbuchstaben:
ausblenden Quelltext
1:
2:
3:
4:
DEFGHIJKLMNOPQRSTUVWXYZABC { Tastaturanschluss an die Walze (Wer wird mit wem kodiert) }
QWERTZUIOPASDFGHJKLYXCVBNM { Walzenverschlüsselung }
Hallo ihr da draussen { Klartext }
ATJKC JJW GD JZHAPABI { Kodierter Text }


3. Es ist wahrscheinlich möglich, dass man Images in ein Array packen kann. Ihr hattet aber keine genaue Ahnung wie das nun geht. Wie man Komponenten in ein Array packt wurde aber schon oft im Forum besprochen.
Ich wollte vielleicht jede Taste, wie bei der Enigma, durch ein Bild oder Icon darstellen. Drücke ich nun auf ein Bild oder Icon so wird der gedrückte Buchstabe verschlüsselt. Drücke ich nun Taste im Array, so wird ein Befehl ausgeführt, um die Position des Bildes im Array zu finden.
Dies (Tasten durch Bilder oder Icon) werde ich aber nur machen, wenn man die Bilder in ein Array o.ä. packen kann, da ich ja ansonsten für jede Taste eine 'OnClick'-Prozedur schreiben müsste, wodurch der Quellcode zu lang würde.
Ich habe das hier dazu gefunden: www.auq.de/viewtopic.php?t=511 (Vielleicht hilft das ja)

4. Eine 'GroupBox' kann durch den Befehl 'SendToBack' hinter das Memofeld gebracht werden. Oder ich plaziere zuerst die 'GroupBox' und dann das Memofeld. :wink:

5. Ob es einen Befehl gibt mit dem man das Programm neustarten kann, wisst ihr nicht.
Dieses Problem könnte ich auch durch einen Befehl gelöst werden, mit dem man an eine bestimmte Stelle im Quellcode springen könne.
Oder das Einfachste wäre natürlich in der Procedure 'TForm1.Button2Click' die Prozedur 'TForm1.Button1Click' aufzurufen (bekannt aus Pascal!). Dies habe ich ausprobiert, doch nicht hinbekommen, weil ich in den Klammern hinten dem Prozedurnamen etwas eingeben musste und ich nicht wusste was.



Jetzt kommen ein paar Fragen (Bitte auch antworten!):

1.
MathiasSammack hat folgendes geschrieben:
Nun, ob sie original sind, weiß ich nicht so genau. Ich werde erst mal weiter versuchen, den Code nach Delphi umzusetzen, und dann gebe ich´s frei. Aber auch erst, wenn deine Hausaufgabe benotet wurde.

Ich möchte doch nicht den Quellcode deiner Enigma (was natürlich auch nicht schlecht wäre), sondern ich möchte doch nur die Walzeneinstellungen, wie z.B. : 'QWERTZUIOPASDFGHJKLYXCVBNM'! Und die kannst du mir doch wohl geben, oder? :wink:

2. A -> E -> L -> T -> P ...das Prinzip verstehe ich jetzt ja, aber was hat das mit der (deiner / meiner) Enigma zu tun?

3.
MathiasSammack hat folgendes geschrieben:
Und was habe ich nun gepostet? Den Klartext bitte!
Willst du das wirklich? Dann könnte jeder, der den Klartext wissen will, einfach meinen Quellcodce kopieren! Aber ich habe einen Kompromiss: Ich poste meine Lösung kodiert! :P :P :P
Tipp1 : Der Schlüssel kam schon mal im vorherigen Thread auf Seite 2 vor!
Tipp2 : Ich habe den Anfangsbuchstaben - wenn überhaupt - , dann nur um maximal +2 oder -2 geändert.

Wieso sollst nur du es einfach haben? :wink:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
EKHELBII TBGQHKYK(JP: IAIG): PXPN;
KYM
 UFVPTY: VRXN;
ZJKPX
 DPQBAN := ((BBJ(SF, QXNET1) - 1) - TAZJDAIMSBJXMQ1 + 26) RTY 26;
 NXMOZL := (CBP(OZHSND + HBFK('J')));
 OTQSUTEXZPSHXV := (VQBUEQMJWGUSJP1 + 1) CVA 26;
WGS;


4.
MathiasSammack hat folgendes geschrieben:
Welches Programm meinst du? Dein eigenes? Hm, dann müsstest du die Antwort doch eigentlich wissen, wenn du mein kodiertes Geschenk korrekt entschlüsseln konntest. Aber es sollte so funktionieren, wie du es beschrieben hast.
Ich habe mal in der Schule die Kodierung und die Dekodierung ausprobiert.
Kodierung
D0P3F!$H hat folgendes geschrieben:
{Ich habe es als Zitat gemacht, weil es als Code nicht deutlich ist!}
Eingabe: Morgen

Tastaturrrrrrrrrrrrrrrrr: abcdefghijklmnopqrstuvwxyz

Walze + 0 Drehungen: qwertzuiopasdfghjklyxcvbnm
Walze + 1 Drehungen: wertzuiopasdfghjklyxcvbnmq
Walze + 2 Drehungen: ertzuiopasdfghjklyxcvbnmqw
Walze + 3 Drehungen: rtzuiopasdfghjklyxcvbnmqwe
Walze + 4 Drehungen: tzuiopasdfghjklyxcvbnmqwer
Walze + 5 Drehungen: zuiopasdfghjklyxcvbnmqwert

Ausgabe: DHYPOL (Hört sich doch nett an, oder?)

Dekodierung 1
Hierbei dreht die Walze sich nach jeden Buchstaben eine Stelle weiter. Doch man zieht die Walzendrehung ab. 'H' - 2. Buchstabe in der Eingabe - hat an paraller Walzenstelle eigentlich 'Q', doch -2*Drehungen (hier gleich -2) ergibt 'O'.
Eingabe: DHYPOL

Tastaturrrrrrrrrrrrrrrrr: qwertzuiopasffghjklyxcvbnm

Walze + 0 Drehungen: abcdefghijklmnopqrstuvwxyz
Walze + 1 Drehungen: bcdefghijklmnopQrstuvwxyza
Walze + 2 Drehungen: cdefghijklmnopqrstuVwxyzab
Walze + 3 Drehungen: defghijklMnopqrstuvwxyzabc
Walze + 4 Drehungen: efghijklMnopqrstuvwxyzabcd
Walze + 5 Drehungen: fghijklmnopqrstuvwXyzabcde

Ausgabe: Morgen

Dekodierung 2
Eingabe: DHYPOL

Tastaturrrrrrrrrrrrrrrrr: qwertzuiopasffghjklyxcvbnm

Walze + 0 Drehungen: abcdefghijklmnopqrstuvwxyz
Walze + 1 Drehungen: zabcdefghijklmnopqrstuvwxy
Walze + 2 Drehungen: yzabcdefghijklmnopqrstuvwx
Walze + 3 Drehungen: xyzabcdefghijklmnopqrstuvw
Walze + 4 Drehungen: awxyzbcdefghijklmnopqrstuv
Walze + 5 Drehungen: vwxyzabcdefghijklmnopqrstu

Ausgabe: Morgen

Dekodierung 1 hat den Vorteil, dass nur die Systeme (Tastatur und Walze) ausgetauscht werden müssen. D. h. bei der Kodierung ist 'abcde...' die Tastatur und 'qwert' die Walze, während es bei der Dekodierung andersherum ist.
Dekodierung 2 hat den Vorteil, dass man nicht so "kompliziert" rechenn muss wie in Dekodierung 1.
Also ist es doch egal welche Dekodierung ich nehme (wenn ich die denn in mein Programm einbaue)? Oder ist eine der Dekodierungsmöglichkeiten besser, weil einfacher?

5.
MathiasSammack hat folgendes geschrieben:
die Vorlage, die ich habe, erlaubt wirklich nur die Buchstaben von A bis Z.

Was meinst du mit Vorlage? Die Hompage über die Enigma, die ich gepostet habe oder eine andere Seite (bitte mal URL posten!)? Oder etwas ganz anderes?

6.
MathiasSammack hat folgendes geschrieben:
Im Moment verschlüsselt mein Programm bereits mit 3 Walzen.

:shock: Wie hast du das so schnell geschafft? Woher weisst du, wie das Programm aufgebaut sein muss? Bist du ein Genie oder sitzt du den ganzen Tag am Rechner?

Meine Enigma hat immer noch nur eine Walze. :cry:
Ich denke nämlich, dass eine zweiwalzige Enigma viel komplizierter (jdenfalls, wenn ich sie programmieren sollte) und länger werden würde, weil ich ja doppelte Verschlüsselung und Rüchkoppplung (Umdrehung der vorderen Walze bei eigener Umdrehung: ... 18 -> 19 -> 20 -> 21 ...) und vielleicht noch mehr.
Aber dafür kann ich den Anfangsbuchstaben auswählen und habe verschiedene Walzen zur Auswahl. 8)
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mi 06.11.02 19:45 
Und auf zu einer neuen Folge von "Gute Schlüssel, schlecht Schlüssel" !!!!!!!


DOP3 F!$H hat folgendes geschrieben:
Über deine Enigma habt ihr euch (du und Peter) unterhalten
Am Ende, ja!


DOP3 F!$H hat folgendes geschrieben:
Meine Enigma verschlüsselt korrekt
Ja. Soweit ich das überblicken kann, tut sie das. Natürlich nur mit einer Walze und Deinem "Walzentext".

DOP3 F!$H hat folgendes geschrieben:
Es ist wahrscheinlich möglich, dass man Images in ein Array packen kann.
Ich bin sogar ziemlich sicher, dass das geht. Habe die von dir angegebene Seite mal überflogen, und sie scheint Dir schon mal einen guten Einstieg zu verschaffen.


DOP3 F!$H hat folgendes geschrieben:
4. Eine 'GroupBox' kann durch den Befehl 'SendToBack' hinter das Memofeld gebracht werden. Oder ich plaziere zuerst die 'GroupBox' und dann das Memofeld.
Jepp!

So, denn Rest überlasse ich Mathias.

MfG,
Peter

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Sven
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 314


D6 Ent, K3 Pro (patched)
BeitragVerfasst: Do 07.11.02 10:27 
@MathiasSimmack
#46 ist die Entfernen-Taste. Das Du Backspace und Co. weglasen willst ist eigentlich bedauerlich. Es ist nämlich ziemlich nervig jedesmal den Text neu einzugeben, wenn man sich mal vertippt hat.
Vorschlag: Mach es doch so, daß Du die Augenblicklich-Verschlüsselung sausen läßt, und den User erst den Text schreiben, bzw. von einer Datei, oder aus der Zwischenablage einlesen läßt. Dies wäre auch bedeutend Benutzerfreundlicher.

Nachtrag: :autsch: ERST LESEN, DANN DENKEN und DANN ERST SCHREIBEN. Ich hätte besser aufpassen sollen, dann hätte ich Dich nicht wiederholt. :oops:

Sven

_________________
MDK 9.1, Kernel 2.4.21, KDE 3.1 Kylix 3 Pro (patched), nutze aber auch Windows


Zuletzt bearbeitet von Sven am Do 07.11.02 12:04, insgesamt 1-mal bearbeitet
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 07.11.02 12:01 
D0P3 F!$H hat folgendes geschrieben:
Woher soll denn ich das wissen? Ich bin hier ein Nooby und habe davon doch keine Ahnung.

Damit wäre wohl bewiesen, dass du dir die Regeln nicht angeschaut hast. Da steht´s drin.

Zitat:
sondern ich möchte doch nur die Walzeneinstellungen

Habe ich doch gepostet. Siehe weiter oben.
ausblenden Quelltext
1:
2:
3:
const
  I        : array[0..ROTORSIZE-1]of byte =
    (4,10,12,5,11,6,3,16,21,25,13,19,14,22,24,7,23,20,18,15,0,8,1,17,2,9);

usw. Die Einstellung des Reflektors findest du dort auch. Es sind halt nur die Zahlen anstelle der Buchstaben (A = 1, B = 2, usw.)

Zitat:
Wieso sollst nur du es einfach haben?

Nur macht´s keinen Sinn, da die Funktion zum Dekodierern ja ursprünglich von mir ist. :wink: Du hast ja im alten Thread oft genug betont, dass du nur eine Verschlüsselung schreiben sollst, und dass du die Dekodierung wohl auch gar nicht machen willst. Das war also nur ein Bonus meinerseits, damit du vom Lehrer ein Bienchen kriegst. :twisted:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
function Encoding(ch: char): char;
var
  offset : byte;
begin
  offset          := ((BYTE(ch) - BYTE('A')) + DrehungenWalze1) mod 26;
  Result          := Walze1[offset];
  DrehungenWalze1 := (DrehungenWalze1 + 1) mod 26;
end;

function Decoding(ch: char): char;
var
  offset : byte;
begin
  offset          := ((pos(ch,Walze1) - 1) - DrehungenWalze1 + 26) mod 26;
  Result          := (CHR(offset + BYTE('A')));
  DrehungenWalze1 := (DrehungenWalze1 + 1) mod 26;
end;


Zitat:
Wie hast du das so schnell geschafft? Woher weisst du, wie das Programm aufgebaut sein muss? Bist du ein Genie oder sitzt du den ganzen Tag am Rechner?

Das war recht einfach. Weiß ich ja gar nicht. Nein, und nein. :wink: Jetzt noch mal die ausführlicher. Ich habe die Walze (= Rotor) als Objekt gestaltet und im Programm im Array angeordnet:
ausblenden Quelltext
1:
2:
var
  rotors    : array[0..2]of TEnigmaRotor;

Diese Rotoren werden nun einfach initialisiert, wobei du die Wahl zwischen 8 Typen und 26 Ausgangspositionen hast:
ausblenden Quelltext
1:
2:
3:
rotors[2] := TEnigmaRotor.Create; rotors[2].Init(3 {<- Typ},3 {<- Startposition},nil);
rotors[1] := TEnigmaRotor.Create; rotors[1].Init(4,7,rotors[2]);
rotors[0] := TEnigmaRotor.Create; rotors[0].Init(1,6,rotors[1]);

Tja, und dann nimmst du eine simple for-Schleife:
ausblenden Quelltext
1:
2:
for i := 0 to 2 do
  offset := rotors[i].send(offset,true);

Auf die gleiche Weise ließen sich nun 10, 20, 100, ... Rotoren einbauen. :) Das hat mit Genialität nichts zu tun. Ich habe einfach nur aus dem Sourcecode eines Java-Applets abgeschrieben. :wink: Und hier ist es:
www.ugrad.cs.jhu.edu...sell/classes/enigma/ (Java erforderlich!)

Sven hat folgendes geschrieben:
Es ist nämlich ziemlich nervig jedesmal den Text neu einzugeben, wenn man sich mal vertippt hat.
Vorschlag: Mach es doch so, daß Du die Augenblicklich-Verschlüsselung sausen läßt, und den User erst den Text schreiben, bzw. von einer Datei, oder aus der Zwischenablage einlesen läßt. Dies wäre auch bedeutend Benutzerfreundlicher.

Wenn ich die Zeit dazu finde, dann soll´s nicht daran scheitern. Im Moment wird sich Peter wohl die Geschichte mit dem Steckbrett ansehen. Die Umsetzung nach Delphi ist auch nicht das Problem, allerdings habe ich a) im Moment wenig Zeit und b) tue ich mich mit Grafik etwas schwer.
D0P3 F!$H
Gast
Erhaltene Danke: 1



BeitragVerfasst: Fr 08.11.02 19:30 
Hi!

MathiasSammack hat folgendes geschrieben:
Damit wäre wohl bewiesen, dass du dir die Regeln nicht angeschaut hast. Da steht´s drin.

:schmoll: Das stimmt nicht! Ich habe sie mir angeguckt, doch ich habe Tino's Anweisung befolgt.
Tino hat folgendes geschrieben:
Stelle bitte neue Fragen die nicht zum Thema passen in ein neues Topic in der richtigen Sparte!


Mathias' Idee mit einer function hat mir gefallen. Also habe ich sie (angepasst) eingebaut. Sie liefert als Ergebnis den verschlüsselten Buchstaben zurück. Ich arbeite noch mit einer Walze, um besser sehen zu können, ob die function richtig arbeitet.
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
function Verschluesselung(Buchstabe: Char): Char; 
begin 
 PositionWalze1 := ((Ord(Buchstabe) - Ord('A')) + DrehungenWalze1) mod 26; 
 Buchstabe := Walze1[PositionWalze1]; 
 DrehungenWalze1 := (DrehungenWalze1 + 1) mod 26; 
end;

Doch wie muss ich die function mit KodierterText := KodierterText + X; {X ist die Verknüpfung mit der function} verknüpfen? So wie ich es mache (X = Verschluesselung(GedrueckteTaste) oder X = Buchstabe) klappt es nicht. Entweder wird nichts angezeigt oder 'É', egal was ich drücke. Was mache ich falsch? :cry:

P.S. @ Mathias: Stell mal bitte deine Enigma mit drei Walzen auf folgende Einstellung:
1. Walze 1: 'QWERTZUIOPASDFGHJKLYXCVBNM'
2. Walze 1-Beginn: 'D'
3. Walze 2: 'EKMFLGDQVZNTOWYHXUSPAIBRCJ'
4. Walze 1-Beginn: 'E'
5. Walze 3: 'SLVGBTFXJQOHEWIRZYAMKPCNDU'
6. Walze 1-Beginn: 'S'
7. Reflektor: Aus
8. Eingabe: "Hallo ihr da"
Bitte poste mal deine Verschlüsselung, damit ich überprüfen kann, ob meine Enigma - wenn ich die function verwenden kann - "richtig" verschlüsselt. Danke!

Zu "Array of TImage". Ich habe mir den Link mehrmals angeschaut und auch (nur) teilweise verstanden. Meine Fragen:
Geht es auch einfacher ein Array of TImage zu erstellen?
Ich möchte ja jede Taste 'A'..'Z' als Image des Arrays darstellen. Wenn ich nun auf eine Taste, also ein Image klicke, soll die "normale" Verschlüsselung des Buchstabens stattfinden. Heisst das, ich muss für jedes Image im Array eine eine OnClick-Prozedur erstellen? Dann bringt mir das "Array of TImage" nämlich nichts (Quellcode zu lang). Geht es auch mit nur einer gemeinsamen Prozedur für alle Images?
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Fr 08.11.02 20:47 
Hi!

Den Rest überlasse ich Mathias, ich gehe jetzt mal nur auf das Array of TImage ein:

Also, nehmen wir mal an, Du erstellst Dein Array. Dann kannst Du (während der Erstellung) ja jedem dieser Images eine OnClick-Ereignis-Behandlung mit Parameter "Sender" (wie bei jedem anderen OnClick-Ereignis auch) zuweisen. Jedes OnClick-Ereignis, welches von einem der Images ausgeht, wird dann von ein und derselben Prozedur behandelt.
Jetzt musst Du herausfinden, von welchem dieser Images der Aufruf kam. Das ist nicht schwer. Der Parameter Sender enthält die Informationen, die Du brauchst: den Namen des Objektes, auf dem der Mausklick ausgeführt wurde. Um an den heranzukommen, musst Du aber erzwingen, dass "Sender" als TImage behandelt wird. Das produziert bei Dir keine Probleme, weil Du ja genau weißt, das Sender ein TImage ist. An den Namen kommst Du so:
ausblenden Quelltext
1:
TImage(Sender).Name					


Und wenn Du deinen Images bei der Erstellung sinnvolle Namen gegeben hast, kannst Du aus diesen Namen den Buchstaben herauslesen, für den das Image steht. Also, wenn die Namen bespielsweise sind:

    image_a
    image_b
    image_c
    ...

Dann ist es ja nicht schwer, den Buchstaben, der gemeint ist, herauszufinden.

MfG,
Peter

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 08.11.02 22:20 
Zitat:
Doch wie muss ich die function mit Code verknüpfen?

Ich hab´s mir einfach gemacht: um eine if-Anweisung beim Kodieren/Dekodieren zu sparen, habe ich folgenden Typ und folgende Variable deklariert:
ausblenden Quelltext
1:
2:
3:
4:
type
  EncodeDecodeFunc = function(ch: char): char;
var
  ECFunc           : EncodeDecodeFunc;

Diese Funktion verknüpfe ich im "OnCreate" der Form mit der Verschlüsselungsfunktion "Encoding" (s. mein letztes Posting):
ausblenden Quelltext
1:
ECFunc := @Encoding;					

Jetzt habe ich ´ne Checkbox, in deren "OnClick"-Ereignis ich die Zuordnung wechsle:
ausblenden Quelltext
1:
2:
3:
4:
5:
procedure TForm1.encoderClick(Sender: TObject);
begin
  if(encoder.Checked) then ECFunc := @Encoding
    else ECFunc := @Decoding;
end;

Demzufolge brauche ich im "OnKeyPress" des Memos nur noch diese Abfrage:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
{ ... }
  case Key of
    'A'..'Z':
      KodierterText := KodierterText + ECFunc(Key);

{ ... }

Wohlgemerkt! Das gilt nur für dein Programm. Bei der Enigma brauche ich keine Dekodierfunktion!

Zitat:
Stell mal bitte deine Enigma mit drei Walzen auf folgende Einstellung ...

STOP!

Wir müssen uns -glaube ich!- erst mal darüber einig werden, was wir hier als ENIGMA bezeichnen. Wenn du damit dein Programm meinst, dann ist das zwar dein gutes Recht. Aber ich würde dir da widersprechen wollen. Als ENIGMA würde ich das Java-Applet bezeichnen, das als Grundlage für mein Delphi-Programm diente.
:oops: Und da muss ich doch leider einen kleinen Bug gestehen. Ich habe vergessen, die Rotoren zurückzusetzen, wenn die Startposition geändert wurde. Die neue Version habe ich hochgeladen (Link, s. 5.11.), damit du folgenden Test mal ausprobieren kannst.

Stelle die Walzen in meinem Programm bitte mal von links nach rechts auf 1, 2 und 3. Die Ausgangspositionen stellst du bitte auf 25, 24 und 23. Der Reflektortyp bleibt auf 1. Dann gibst du mal bitte
ausblenden Quelltext
1:
DOPEFISH					

ein. Okay? Das Ergebnis musst du jetzt hier nicht posten. Stattdessen startest du mal das Java-Applet (s. Link) und stellst es auch so ein wie eben mein Programm. Und nun tippst du den kodierten Text aus meinem Programm ein, und du solltest wieder "DOPEFISH" lesen können ... :) Das ist die ENIGMA.

Dein Programm würde ich deshalb mal als DOPEFISH.EXE bezeichnen wollen. Und wenn ich die Walzen so einstelle, wie du mir das befohlen hast :wink:, dann bekomme ich nacheinander folgende Angaben:
ausblenden Quelltext
1:
2:
3:
YFMQT MMA BC
QKWYS WWC TZ
XLWIA WWD HQ

Wolltest du das wissen?
Ist die Frage beantwortet? Das Problem gelöst?

Dann klicke hier, um das Thema entsprechend zu markieren!