Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Programm für eine ENIGMA-Maschine
Anonymous - Mo 04.11.02 22:07
Titel: Programm für eine ENIGMA-Maschine
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: |
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
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. - Mo 04.11.02 23:06
Hi!
Ich weiß natürlich nicht, wie sicher diese Quelle ist, aber
hier [
http://home.egge.net/~savory/chiffred.htm] 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
Delete - Di 05.11.02 08:50
Titel: Re: Programm für eine ENIGMA-Maschine
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 [
http://www.auq.de/viewtopic.php?t=3665] 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:
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:
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 - 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 ). {...} |
Delete - 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 [
http://www.reihe5.de/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 - 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
Tino - 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. - 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:
Quelltext
1: 2:
| QWERTZUIOPASDFGHJKLYXCVBNM abcdefghijklmnopqrstuvwxyz |
c soll also der Anfangsbuchstabe sein:
Quelltext
1: 2:
| QWERTZUIOPASDFGHJKLYXCVBNM cdefghijklmnopqrstuvwxyzab |
ist das gleiche wie:
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:
Quelltext
1: 2:
| ERTZUIOPASDFGHJKLYXCVBNMQW abcdefghijklmnopqrstuvwxyz |
Ist das gleiche wie:
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
Delete - 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: |
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:
Quelltext
1:
| DrehungenWalze1 := BYTE(Ausgang) - BYTE('A'); |
Bei C also:
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. - 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
Christian S. - 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.
Delete - 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:
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
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:
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. - 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
Anonymous - 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:
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:
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:
http://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:
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. - 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
Sven - 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
Delete - 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.
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:
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:
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:
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:
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:
http://www.ugrad.cs.jhu.edu/~russell/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.
Anonymous - 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.
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. - 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:
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
Delete - 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:
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):
Jetzt habe ich ´ne Checkbox, in deren "OnClick"-Ereignis ich die Zuordnung wechsle:
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:
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
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:
Quelltext
1: 2: 3:
| YFMQT MMA BC QKWYS WWC TZ XLWIA WWD HQ |
Wolltest du das wissen?
Sven - Sa 09.11.02 10:27
@MathiasSimmack
Das mit der 4er-Blöcken sieht schon gut aus. Vielleicht kannst Du aber noch hinzufügen, wenn der letzte Block nicht 4 Buchstaben lang ist, daß dieser dann aufgefüllt wird. Zum Beispiel mit der entsprechenden Anzahl von "X"en.
Anonymous - Sa 09.11.02 19:11
So ... habe mal fleissig weitergebastelt!
Verbesserungen an meinem Programm und Fragen dazu:
1.
MathiasSammack hat folgendes geschrieben: |
Ich hab´s mir einfach gemacht: um eine if-Anweisung beim Kodieren/Dekodieren zu sparen, habe ich folgenden Typ und folgende Variable deklariert: usw... |
Einfacher hattest du das nicht? :wink: ... Naja ist ja auch nur halb so schlimm ... Denn ich habe es so gemacht und es funktioniert prima (bisher): :D
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| implementation {$R *.dfm}
function Verschluesselung(Buchstabe: Char): Char; begin PositionWalze1 := (Ord(Buchstabe) - 64) + DrehungenWalze1; if (PositionWalze1 >= 27) then Dec(PositionWalze1, 26); Result := Walze1[PositionWalze1]; if (DrehungenWalze1 >= 26) then DrehungenWalze1 := 1 else Inc(DrehungenWalze1); end; ... {in der Prozedur TForm1.Memo1KeyPress wird der kodierte Text um den kodierten Buchstaben aus der function erweitert} KodierterText := KodierterText + Verschluesselung(GedrueckteTaste, Walze1); |
Ich habe den Fehler, weshalb die Funktion gestern nicht funktionieren wollte gefunden. Ich brauche den Befehl
Result in der Funktion, da dieser das Ergebnis der Funktion liefert, richtig? 8)
2. Ich habe weitere Fehler im Programm behoben, die bei der Verschlüsselung und beim Löschen einzelner Buchstaben auftraten.
3. Wird das Programm gestartet, so sind alle Komponenten sichtbar und editierbar. Aber sobald man einen Buchstaben ins Eingabfeld getippt hat, werden die ComboBoxen auf "ComboBoxX.Enabled := False;" gesetzt.
@ Peter:
THX 4 HELP! (s. letztes Topic, S. 2)
4. Mathias du hast bei deinem Programm ja einen "Reset"-Button. Steckt dahinter eine Prozedur, die die Memos leert und die restlichen Komponenten auf "Enabled:= True;" und "Enabled:= False;" setzt, oder steckt dahinter ein Befehl der das Programm (irgendwie) neustartet? Sollte es letzteres sein, poste mal bitte diesen Befehl und eine Erklärung zur Funktionsweise. Danke!
Zum "Neustarten" habe ich in der Delphi-Hilfe folgendes gefunden:
a) Befehl "Reset": Habe ich ausprobiert, aber nicht hinbekommen, da zu schwierig :cry:
b) Befehle "Label" und "GoTo": Habe ich ausprobiert und auch verstanden, funktionieren aber nicht; Klingt aber vielversprechend (BITTE mal anschauen, ob ihr das hinbekommt! :wink: )
5.
MathiasSammack hat folgendes geschrieben: |
STOP!
Wir müssen uns -glaube ich!- erst mal darüber einig werden, was wir hier als ENIGMA bezeichnen. |
:bawling: Heisst das, meine "Enigma" funktioniert falsch - wenn "richtig" das Prinzip der echten Enigma bzw. des Java-Applets ist?
Also in Bezug auf die Verschlüsselung glaube ich, liegts du falsch (siehe Punkt 6). :P
Wenn du die Dekodierung meinst, so muss ich dir leider zustimmen. Denn da versagt mein Programm auf voller Linie - wenn meine folgende Erklärung denn zutrifft!
Wenn ich einen Text verschlüsseln will, nehme ich z.B. WalzeX und PositionY. Beim Dekodieren
stelle ich die Enigma wieder so ein, wie bei der Verschlüsselung (WalzeX und PositionY). Dann tippe ich die kodierte Nachricht ein und erhalte den Klartext, richtig?
Sollte das stimmen, müsste mein Programm irgendetwas
falsch machen. Oder sehe ich das "falsch"? :wink:
6.
MathiasSammack hat folgendes geschrieben: |
Wolltest du das wissen? |
Eigentlich nicht. Ich meinte: du stellst dein Programm (es hat doch 3 Walzen, oder) auf meine gepostete Einstellung ein. Dann tippst du den Klartext ein und postest die kodierte Nachricht, damit ich überprüfen kann, ob meine Enigma (wenn ich 3 Walzen eingabaut habe) auch richtig funktioniert (Dein Programm funktioniert doch wie die echte Enigma bzw. das Java-Applet, oder?).
:D Aber zu deiner Rettung, da hast mir geholfen. Denn mein Programm bekommt dasselbe raus wie deines.
P.S. @ Mathias: Wenn du mir deine E-Mail-Adresse gibst, kann ich dir die neuste Version meines Programms schicken. Die kannst dann in den Download "enigma+dopefish.exe" stellen.
Delete - Sa 09.11.02 21:25
D0P3 F!$H hat folgendes geschrieben: |
Einfacher hattest du das nicht? |
Einfacher wäre es mit if-then, aber so ist´s effizienter, weil sich das Programm die Prüfung sparen kann. Die Variable "ECFunc" zeigt ja auf die richtige Funktion. :)
Zitat: |
Ich brauche den Befehl Result in der Funktion, da dieser das Ergebnis der Funktion liefert, richtig? |
Yupp.
Zitat: |
Steckt dahinter eine Prozedur, die die Memos leert und die restlichen Komponenten auf "Enabled:= True;" und "Enabled:= False;" setzt? |
Ja. Ein Reset-Kommando ist mir auch nicht bekannt. Ich schreibe in solchen Fällen eine eigene Funktion (wie z.B. einen Button-Klick), in der alles zurückgestellt wird.
Zitat: |
Heisst das, meine "Enigma" funktioniert falsch - wenn "richtig" das Prinzip der echten Enigma bzw. des Java-Applets ist? |
Ich denke mal, dass das Applet die richtige Grundlage ist. Du simulierst das Prinzip nur.
Zitat: |
Also in Bezug auf die Verschlüsselung glaube ich, liegts du falsch (siehe Punkt 6). |
Das glaube ich nicht. Sonst würde mein Programm andere Ergebnisse liefern als das Java-Applet mit gleicher Einstellung.
Zitat: |
Wenn ich einen Text verschlüsseln will, nehme ich z.B. WalzeX und PositionY. Beim Dekodieren stelle ich die Enigma wieder so ein, wie bei der Verschlüsselung (WalzeX und PositionY). |
Genau! So funktioniert die Enigma!
Zitat: |
Sollte das stimmen, müsste mein Programm irgendetwas falsch machen. |
Wahrscheinlich liegt es an deiner Walzeneinstellung und evtl. auch am fehlenden Reflektor ->
Zitat: |
du stellst dein Programm (es hat doch 3 Walzen, oder) auf meine gepostete Einstellung ein. |
Das kann ich aber nicht, weil die erste und dritte Walzeneinstellung, die du mir vorschlägst, nicht existieren. Ich denke, die hast du dir selbst ausgedacht, bzw. falsch aus den numerischen Werten meines Postings umgesetzt.
Das ist dir wahrscheinlich in den ganzen Postings entgangen: ich habe die Vermutung geäußert, dass die Anordnung der Buchstaben keineswegs so zufällig ist, wie es den Anschein hat.
Die erste Buchstabenfolge von dir entspricht der Einstellung deines Programms und ist einfach nur die Tastatur, bei Q beginnend und dann zeilenweise nach rechts durch bis zum M.
Die zweite Buchstabenfolge entspricht einer Walze der Enigma. Die dritte allerdings nicht mehr.
Die Änderung der Walzen wird also das Ergebnis verfälschen; es sei denn, du benutzt in deinem Programm die Einstellungen, die du aus meinen Postings bzw. aus dem Sourcecode des Applets entnehmen kannst. Dann können wir das Experiment gern noch einmal wiederholen. :)
Anonymous - So 10.11.02 18:18
MathiasSimmack hat folgendes geschrieben: |
Ich denke mal, dass das Applet die richtige Grundlage ist. Du simulierst das Prinzip nur. |
Was heisst da
simulieren? Meinst da damit, mein Programm verschlüsselt falsch (geht ja eigentlich nicht, da ich denselben Code rauskriege wie du :roll: ) oder die Funktinonsweise der Verschlüsselung ist nicht richtig. Heisst: Mein Programm verschlüsselt bei einer Walze "aus Versehen" oder durch Zufall richtig, aber bei zwei oder mehreren Walzen würde mein Programm falsch verschlüsseln. Meinst du das?
MathiasSimmack hat folgendes geschrieben: |
Das glaube ich nicht. Sonst würde mein Programm andere Ergebnisse liefern als das Java-Applet mit gleicher Einstellung. |
... Also irgendetwas läuft hier falsch ... und ich glaube, dass ich das bin :wink: ! Zusammenfassung:
1. Ich hatte dich gebeten dein Programm (auf siehe letzte Seite) einzustellen und den Code zu posten.
2. Du hast aber in
meinem Programm den Text eingegeben und eben
jenen Code gepostet. Richtig?
-> Falls ja, dann ist es ein Fehler meinerseits, denn ich hatte verstanden, du hättest dein Programm auf eine Walze reduziert und dann den Text eingegeben. Dann kannst du auch den voherigen Absatz vergessen! :oops:
-> Falls nein, dann hast du dein Programm auf eine Walze reduziert, den Text eingegeben und den Code gepostet.
Doch dann muss mein Programm richtig verschlüsseln!
MathiasSimmack hat folgendes geschrieben: |
Genau! So funktioniert die Enigma! |
Okay, solltest du den letzten Abschnitt mit JA beantwortet habe, dann schau dir mal meinen Quellcode an und hilf mir
bitte bei der Fehlersuche!
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: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103:
| var Form1 : TForm1; DrehungenWalze1 : Integer = 0; i, j : Integer; PositionWalze1 : Integer = 1; Walze1Auswahl : String = 'QWERTZUIOPASDFGHJKLYXCVBNM EKMFLGDQVZNTOWYHXUSPAIBRCJ AJDKSIRUXBLHWTMCQGZNPYFVOE BDFHJLCPRTXVZNYEIWGAKMUSQO ESOVPZJAYQUIRHXLNFTGKDCMWB VZBRGITYUPSDNHLXAWMJQOFECK JPGVOUMFYQBENHZRDKASXLICTW NZJHGRCXMYSWBOUFAIVLPEKQDT FKQHTLXOCBJSPDZRAMEWNIUYGV'; KodierterText : String = ''; Walze1 : String = 'QWERTZUIOPASDFGHJKLYXCVBNM';
implementation {$R *.dfm}
function Verschluesselung(Buchstabe: Char; WalzeX: String): Char; begin PositionWalze1 := (Ord(Buchstabe) - 64) + DrehungenWalze1; { Der 'oberste' Buchstabe der Walze ergibt sich aus der Buchstabenposition im Alphabet + der Anzahl der Walzendrehnungen } if (PositionWalze1 >= 27) then Dec(PositionWalze1, 26); { Ist die Walzenposition des verschlüsselnden Buchstaben größer als die Walze, wird die Position um eine Walzenlänge gekürzt } Result := WalzeX[PositionWalze1]; if (DrehungenWalze1 >= 26) then DrehungenWalze1 := 1 else Inc(DrehungenWalze1); { Ist die Walze in der letzten Position, fängt sie in der 1. Position an; ansonsten dreht sie sich eine Position weiter } end;
procedure TForm1.KlartextKeyPress(Sender : TObject; var GedrueckteTaste : Char); begin if (GedrueckteTaste in ['a'..'z', 'A'..'Z', #8, #13, #32]) then begin if (KodierterText = '') then begin AuswahlWalze1.Enabled := false; BeginnWalze1.Enabled := false; end; GedrueckteTaste := UpCase(GedrueckteTaste); { Ist die gedrückte Taste 'a'..'z', wird sie zum entsprechenden Großbuchstaben } case GedrueckteTaste of 'A'..'Z' : begin KodierterText := KodierterText + Verschluesselung(GedrueckteTaste, Walze1); { Der kodierte Text wird um den verschlüsselten Buchstaben erweitert } end; #8 : if not (KodierterText = '') then begin case KodierterText[Length(KodierterText)] of 'A'..'Z' : begin Delete(KodierterText, Length(KodierterText), 1); { Ist das letzte Zeichen im kodierten Text 'A'..'Z', wird im kodierten Text das letzte Zeichen gelöscht } if (DrehungenWalze1 <= 0) then DrehungenWalze1 := 26 else Dec(DrehungenWalze1); { Ist die Walze in der 1. Position, fängt sie in der letzten Position an; ansonsten dreht sie sich eine Position zurück } end; #10 : Delete(KodierterText, Length(KodierterText) - 1, 2); { Ist das letzte Zeichen im kodierten Text 'Zeilenanfang', werden im kodierten Text die letzten beiden Zeichen (#13 und #10) gelöscht } #32 : Delete(KodierterText, Length(KodierterText), 1); { Ist das letzte Zeichen im kodierten Text 'Leertaste', wird im kodierten Text das letzte Zeichen gelöscht } end; end; #13 : KodierterText := KodierterText + #13#10; { Ist die gedrückte Taste 'Enter', wird der kodierte Text mit #13 (Beginn der nächsten Zeile) und #10 (Zeilenanfang) erweitert } #32 : KodierterText := KodierterText + ' '; { Ist die gedrückte Taste 'Leertaste', wird der kodierte Text mit einer Leerstelle erweitert } end;
Kodierung.Text := KodierterText; { Der kodierte Text wird im Ausgabefeld ausgegeben }
with Kodierung do begin SelStart := Length(Kodierung.Text); { Der markierte Textteil im Ausgabefeld wird ans Ende des kodierten Textes gesetzt } SendMessage(Kodierung.Handle, EM_Scrollcaret, 0, 0); { Das Ausgabefeld bekommt den Befehl, soweit zu scrollen, bis der Cursor mit dem markierten Textteil im Bild ist } end;
end else GedrueckteTaste := #0; { Ist die gedrückte Taste nicht 'a'..'z', 'A'..'Z', 'Löschen', 'Enter' oder 'Leerstaste', wird sie nicht angezeigt } end;
procedure TForm1.BeginnWalze1Change(Sender: TObject); begin Insert(Copy(Walze1, 1, BeginnWalze1.ItemIndex), Walze1, Length(Walze1) + 1); { Der Walzenteil, der vor dem Anfangsbuchstaben liegt, wird ans Ende der Walze kopiert } Delete(Walze1, 1, BeginnWalze1.ItemIndex); { Der Walzenteil, der vor dem Anfangsbuchstaben liegt, wird gelöscht } end;
procedure TForm1.AuswahlWalze1Change(Sender: TObject); begin for i := 1 to 26 do Walze1[i] := Walze1Auswahl[i + 26 * AuswahlWalze1.ItemIndex]; { Aus allen verfügbaren Walzen wird die Ausgewählte in den String Walze1 kopiert } end;
procedure TForm1.FormCreate(Sender: TObject); begin Klartext.Text := ''; Kodierung.Text := ''; end;
end. |
MathiasSimmack hat folgendes geschrieben: |
Wahrscheinlich liegt es an deiner Walzeneinstellung und evtl. auch am fehlenden Reflektor -> |
Wenn du mit "Walzeneinstellung" 'qwertz...' meinst, dann ist das insofern falsch, als das es doch egal ist, welche Walzeneinstellung ich nehme, wenn nur das Prinzip der Enigma dahinter steht (Ausser, du möchtest eine historisch korrekte Enigma programmieren). Sollte allerdings das Enigmaprinzip bei meinem Programm nicht vorhanden sein, so hast du natürlich recht, denn dann arbeitet mein Programm nicht richtig.
Und am fehlenden Reflektor kann es auch nicht liegen (auch wieder nur, wenn nur das Prinzip der Enigma dahinter steht), denn es gab auch Enigmas
ohne Reflektor.
Oder meinst das anders? :wink:
MathiasSimmack hat folgendes geschrieben: |
Das ist dir wahrscheinlich in den ganzen Postings entgangen: ich habe die Vermutung geäußert, dass die Anordnung der Buchstaben keineswegs so zufällig ist, wie es den Anschein hat. |
Ich meine, dass die Anordnung der Buchstaben
egal ist, solange
nur das Verschlüsselungsprinzip der Enigma dahinter steckt.
MathiasSimmack hat folgendes geschrieben: |
Die Änderung der Walzen wird also das Ergebnis verfälschen |
Ich denke nicht, weil siehe oben. Aber du kannst gerne probieren mich umzustimmen! :P
MathiasSimmack hat folgendes geschrieben: |
es sei denn, du benutzt in deinem Programm die Einstellungen, die du aus ... dem Sourcecode des Applets entnehmen kannst. |
Das Applet habe ich mir schon heruntergeladen, aber wie kann ich den Code angucken? Dazu brauche ich Java, oder nicht? Woher kriege ich das?
Peter Lustig hat folgendes geschrieben: |
Den Rest überlasse ich Mathias, ich gehe jetzt mal nur auf das Array of TImage ein: |
Ich würde das ja gerne ausprobieren und vom Link, wo das Array of TImage erklärt ist, habe ich den Quellcode auch ausprobiert und er funktioniert.
Aber ich weiss nicht, wie ich Images ins Programm bekomme. Muss ich ein Image auf die Form machen? und wie lade ich die Images in das Array? ICH HABE KEINE AHNUNG! :oops:
... So, dass wars erstmal!
Aber ich muss ja auf eure Antworten warten und reagieren! :P
P.S. @ Mathias: Ich glaube aber, du könntest recht haben. Sieh mal
hier [
http://frode.home.cern.ch/frode/crypto/Turing/turchap1.pdf] die Skizze (auf Seite 9, siehe links unten in der Statuszeile). Dort fängt die Enigma aber rechts an (UKW = Umkehrwalze = Reflektor). Aber wenn ich die Skizze richtig lese, dann muss meine einwalzige Enigma richtig verschlüsseln, oder? :wink:
Delete - So 10.11.02 20:38
Zitat: |
Ich meine, dass die Anordnung der Buchstaben egal ist, solange nur das Verschlüsselungsprinzip der Enigma dahinter steckt. ... Aber du kannst gerne probieren mich umzustimmen! |
Nein, warum sollte ich? Halte dir einfach noch einmal das inzwischen schon mehr als einmal erwähnte Prinzip vor Augen: gibst du den Klartext ein, verschlüsselt die ENIGMA anhand der Walzenstellung. Gibst du den verschlüsselten Text ein, entschlüsselt die ENIGMA den Text anhand der selben Walzen- und Ausgangsstellung.
Also sollte dein Programm ebenso funktionieren,
dann ist es eine ENIGMA.
Zitat: |
wie kann ich den Code angucken? |
Wenn du die ".java"-Dateien aus der
source.tar.gz meinst, dazu reicht ein simpler Texteditor. Mit einem Editor wie Proton, [url]
http://www.meybohm.de/proton.html[/url], siehst du den Sourcecode auch mit Syntax-Highlighting.
Christian S. - So 10.11.02 22:02
MathiasSimmack hat folgendes geschrieben: |
gibst du den Klartext ein, verschlüsselt die ENIGMA anhand der Walzenstellung. Gibst du den verschlüsselten Text ein, entschlüsselt die ENIGMA den Text anhand der selben Walzen- und Ausgangsstellung. |
Das ist zwar richtig, jedoch ungenau. Zu einem symmetrischen Verschlüsselungsverfahren wird die Enigma erst durch den Reflektor. Es ist möglich, dass die Symmetrie auch noch von der Anordnung der Buchstaben abhängt, aber ich bin mir inzwischen nicht mehr so sicher.
Zu den Images: wenn Du einmal das Array erstellst hast, kannst Du die Bilder über TImage.picture.loadfromfile einlesen.
MfG,
Peter
Delete - Mo 11.11.02 15:04
Peter Lustig hat folgendes geschrieben: |
Das ist zwar richtig, jedoch ungenau. |
Es ging nur um´s grundlegende Prinzip, Peter.
Zitat: |
Es ist möglich, dass die Symmetrie auch noch von der Anordnung der Buchstaben abhängt, aber ich bin mir inzwischen nicht mehr so sicher. |
Ist es auch nicht. Ich habe spaßeshalber mal eine Walzeneinstellung verändert -nach meinem Gutdünken. ´s ging auch. :)
Anonymous - Mi 13.11.02 13:48
Die Erleuchtung - Teil 2
:autsch: :oops: :autsch: :oops: :autsch:
Jetzt habe ich (endlich, wurde ja auch mal langsam Zeit :wink: ) das Enigmaprinzip der Verschlüsselung verstanden!
Mein Fehler war, dass ich die ganze Zeit keinen Reflektor eingebaut hatte, weil ich verstanden hatte, es hätte auch Enigmas ohne Reflektor gegeben. Das mag ja auch vielleicht richtig sein, aber dann bräuchte man zwei verschiedene Enigmamaschienen - eine zur Ver-, eine zur Entschlüsselung.
Also bastel ich gerade an einer Enigma (erstmal nur eine Walze) mit Reflektor. Doch das ist schwieriger als gedacht! :wink:
Und ich habe die (ALLE?) Originalrotoreinstellungen der Enigma gefunden:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| { Verschlüsselung | Walze | Notch | Turnover } { ABCDEFGHIJKLMNOPQRSTUVWXYZ | Eintrittswalze | | } { EKMFLGDQVZNTOWYHXUSPAIBRCJ | Walze I | Y | Q } { AJDKSIRUXBLHWTMCQGZNPYFVOE | Walze II | M | E } { BDFHJLCPRTXVZNYEIWGAKMUSQO | Walze III | D | V } { ESOVPZJAYQUIRHXLNFTGKDCMWB | Walze IV | R | J } { VZBRGITYUPSDNHLXAWMJQOFECK | Walze V | H | Z } { JPGVOUMFYQBENHZRDKASXLICTW | Walze VI | H, U | Z, M } { NZJHGRCXMYSWBOUFAIVLPEKQDT | Walze VII | H, U | Z, M } { FKQHTLXOCBJSPDZRAMEWNIUYGV | Walze VIII | H, U | Z, M } { LEYJVCNIXWPBQMDRTAKZGFUHOS | Walze Beta | M4 | M4 } { FSOKANUERHMBTIYCWLQPZXVGJD | Walze Gamma | M4 | M4 } { YRUHQSLDPXNGOKMIEBFZCWVJAT | Reflektor B | | } { FVPJIAOYEDRZXWGCTKUQSBNMHL | Reflektor C | | } { ENKQAUYWJICOPBLMDXZVFTHRGS | Reflektor 'dünn' B | M4 | M4 } { RDOBJNTKVEHMLFCWZAXGYIPSUQ | Reflektor 'dünn' C | M4 | M4 }
{ QWERTZUIOPASDFGHJKLYXCVBNM = Tastaturlayout Computer} { QWERTZUIOASDFGHJKPYXCVBNML = Tastaturlayout ENIGMA} |
Ich melde mich wieder, wenn ich die Enigma mit Reflektor gebastelt habe.
P.S. @ Mathias: Meine Facharbeit muss ich am 25.11.2002 abgeben, also kannst du Anfang Dezember deinen Quellcode posten (damit Peter was zu lesen hat :twisted: ).
Delete - Mi 13.11.02 20:48
Peter kennt meinen Quellcode bereits. Er muss ja keine Facharbeit abgeben ...
Anonymous - Do 14.11.02 09:41
Moin!
@ Mathias: Hast du dir mal die
Skizze [
http://frode.home.cern.ch/frode/crypto/Turing/turchap1.pdf] angeguckt (Die Enigma beginnt
rechts) ?
War die Enigma mit ihrem Tastaturlayout oder als Alphabet an die 1. Walze angeschlossen? Sprich ...
... war es:
Quelltext
1: 2:
| A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 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 |
... oder:
Quelltext
1: 2:
| Q W E R T Z U I O A S D F G H J K P Y X C V B N M L 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 |
Ist zwar nicht so schlimm, wenn ich das Falsche nehme, aber dann ist es nicht die Originalenigma. :roll:
@ Peter: THX! Das mit dem Array of TImage klappt (wen auch bei einem Freund :wink: ). Also dürfte ich das bei mir auch hinkriegen!
Anonymous - Do 14.11.02 16:50
Noch ein paar Fragen:
Wie ist die Verknüpfung im Reflektor?
Ist es 1. Buchstabe -> 2. Buchstabe, 3. Buchstabe -> 4. Buchstabe, 5. Buchstabe -> 6. Buchstabe, ...
Oder 1. Buchstabe -> 26. Buchstabe, 2. Buchstabe -> 25. Buchstabe, 3. Buchstabe -> 24. Buchstabe, ...
Oder anders ?
Wie ist die Verknüpfung der Buchstaben in der Walze selbst?
Ist es 1. Buchstabe -> 6. Buchstabe, 6. Buchstabe -> 1. Buchstabe, 2. Buchstabe -> 17. Buchstabe, 17. Buchstabe -> 2. Buchstabe, ...
Oder willkürlich 1. Buchstabe -> 9. Buchstabe, 9. Buchstabe -> 5. Buchstabe, 2. Buchstabe -> 23. Buchstabe, 23. Buchstabe -> 25. Buchstabe, ...
Oder anders ?
Anonymous - Do 14.11.02 19:38
Auch wenn Eigenlob stinkt:
8) 8) 8) 8) 8)
!!!!! ICH HABE ES HINGEKRIEGT !!!!!
8) 8) 8) 8) 8)
Meine Enigma hat jetzt drei Walzen und verschlüsselt (hoffentlich :wink: ) richtig!
Allerdings
ohne Reflektor, weil ich erst ausprobieren wollte, ob die Enigma denn auch funktioniert.
Überprüft das mal bitte:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| 1. Walze: ABCDEFGHIJKLMNOPQRSTUVWXYZ |||||||||||||||||||||||||| EKMFLGDQVZNTOWYHXUSPAIBRCJEKMFLGDQVZNTOWYHXUSPAIBRCJ Nach jedem eingegebenen Buchstaben den Ersten löschen (also 'E', dann 'K', dann 'M' ...)
2. Walze: ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ |||||||||||||||||||||||||| AJDKSIRUXBLHWTMCQGZNPYFVOE
3. Walze: ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ |||||||||||||||||||||||||| BDFHJLCPRTXVZNYEIWGAKMUSQO
E-P I-J N-K B-P I-Z S-C S-H C-J H-K E-L N-C F-M R-R I-S E-O D-O E-B N-P
Klartext: Ein bisschen Frieden Code: PJKPZCHJKLCMRSOOBP |
BITTE sagt, dass meine Enigma richtig verschlüsselt!
Anonymous - Sa 16.11.02 13:04
:oops: :oops: :oops:
Muss gestehen, dass mein letztes Posting falsch war, weil das dortige Programm falsch verschlüsselt hat.
Aber jetzt habe ich es (hoffentlich *ganzdollehoff*) richtig hingekriegt.
Zwar wieder nur mit drei Walzen ... aber immerhin.
Und mal wieder eine Frage:
Wenn ich als 1. Walze die Walze Nr. V verwende, dann kann ich diese doch nicht mehr als 2. oder 3. Walze verwenden, richtig?
Christian S. - Sa 16.11.02 13:34
Kannst Du schon, aber das ist dann ganz bestimmt nicht mehr die Originalenigma.
Anonymous - Sa 16.11.02 17:47
Das stimmt natürlich.
Wie kann ich einfach eine Zeile in einer ComboBox löschen?
Wenn nämlich als 1. Walze die Walze Nr. VI angeklickt wurde, so soll der Stringteil von Walze Nr. VI im String gelöscht werden und nicht mehr als mögliche Walze bei der 2. und 3. Walze vorhanden sein. Ich habe alle Walzeneinstellungen ein einem String gespeichert.
Geht das in ein paar Befehlen oder ist das komplizierter?
Christian S. - Sa 16.11.02 18:29
Items aus einer Combobox löschen:
Quelltext
1:
| Combobox1.Items.Delete(index) |
Das hättest Du mit ein wenig Suchen aber auch selbst in der Hilfe finden können. :mahn:
MfG,
Peter
Anonymous - Sa 16.11.02 19:16
Ich habe über eine halbe Stunde lang da drin gesucht, aber nichts gescheites gefunden. Und mit ausprobieren, hat es eine Stunde gedauert.
Das soll keine Kritik sein :twisted:
Anonymous - Sa 16.11.02 20:16
Kann ich als Ereignis auch eine eigene Prozedur aufrufen? Sähe dann etwa so aus:
Bei AuswahlWalze1Change (ist eine ComboBox):
Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| procedure AuswahlWalzen(WalzeX: String); begin case Chr(Length(WalzeX)) of '1' : ... '2' : ... '3' : ... end; end; |
Geht das?
Christian S. - Sa 16.11.02 20:30
Ich verstehe nicht, was Du meinst! :nixweiss:
Anonymous - So 17.11.02 11:17
Ich meine folgendes:
Ich kann ja sagen, was passieren soll, wenn ich als 1. Walze eine andere als die Standardwalze nehme, z.B. Walze Nr. V.
Die Walzenauswahl habe ich ja mit einer ComboBox gemacht. Im Moment sieht das so aus:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| var Walze1Auswahl : String = 'EKMFLGDQVZNTOWYHXUSPAIBRCJ AJDKSIRUXBLHWTMCQGZNPYFVOE BDFHJLCPRTXVZNYEIWGAKMUSQO ESOVPZJAYQUIRHXLNFTGKDCMWB VZBRGITYUPSDNHLXAWMJQOFECK JPGVOUMFYQBENHZRDKASXLICTW NZJHGRCXMYSWBOUFAIVLPEKQDT FKQHTLXOCBJSPDZRAMEWNIUYGV'; ... procedure TForm1.AuswahlWalze1Change(Sender: TObject); var i : Integer; begin for i := 1 to 26 do Walze1[i] := Walze1Auswahl[i + 26 * AuswahlWalze1.ItemIndex]; { Aus allen verfügbaren Walzen wird die Ausgewählte in den String Walze1 kopiert } end; |
Da ich ja drei verschiedene Walzen bei der Enigma habe, brauche ich auch drei verschiedene ComboBoxen.
Aber ich will es so machen, dass ich
jede zur Verfügunng stehende Walze nur einmal benutzen kann. Deshalb muss ich die Prozedur
TForm1.AuswahlWalze1Change(Sender: TObject); mit Abfragen und Delete erweitern, um die als 1. Walze ausgewählte Walze in den Strings Walze2Auswahl und Walze3Auswahl zu löschen und auch die ausgewählte Walze in den anderen beiden ComboBoxen zu löschen.
Weil ich dann ja eine fast identische Prozedur dreimal hätte, wollte ich das mit eigenen Prozeduren machen. Das lernen wir gerade in der Schule mit Parameterübergabe und so.
Also will ich folgendes machen:
Wenn ich nun als 1. Walze Walze Nr. V nehme, so will ich nicht die Prozedur
TForm1.AuswahlWalze1Change(Sender: TObject); aufrufen, sondern eine eigene mit der Parameterübergabe, um welche Walze es sich handelt. Und das wollte ich dann so aussehen lassen:
Walzenauswahl(WalzeX: String); Wähle ich bei der 1. Walze nun eine Walze aus, so wird dann der String Walze1 übergeben. Ich frage dann in der Prozedur ab, um welche Walze es sich handelt:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| procedure Walzenauswahl(WalzeX: String); begin case Chr(Length(WalzeX)) of '1' : ... '2' : ... '3' : ... end; end; |
Das ist meiner Meinung nach einfacher als für jede Walze die "OnChange"-Prozedur zu erweitern.
Meine Frage war nun, ob ich auch eigene Prozeduren im Objektinspektor einbauen kann.
In der Schule haben wir das nämlich eine "ButtonOnClick"-Prozedur und
erst darin die eigene Prozedur aufgerufen.
Jetzt klar? :wink:
Christian S. - So 17.11.02 12:47
Okay, nur damit wir über das Gleiche sprechen:
Du hast drei Comboboxen, in denen der Nutzer für jede der drei Walzen eine Konfiguration laden kann. Wenn eine Konfiguration geladen wurde, soll sie für die anderen Walzen nicht mehr zur Verfügung stehen. Dafür möchtest Du eine einheitliche Prozedur schreiben.
Prinzipiell gilt: jede Ereignisbehandlungsroutine (wow, was für ein Wort!) besitzt eine fest definierte Form, d.h. jede Prozedur, die deise Aufgabe übernehmen, soll, muss dieser Form entsprechen. Hier wäre das also die Tatsache, dass sie einen Parameter vom Typ TObject haben muss.
Aber das ist eigentlich kein Hindernis. Entweder, Du machst es so, wie Ihr es für TButton gelernt habt (es sollte ja wirklich kein Problem sein, dass auf die Combobox zu übertragen), oder aber Du schreibst eine Prozedur, die den Anforderungen genügt, und weist sie allen Comboxes als OnChange-Prozedur zu. (Geht im Objekt Inspektor. Bei der Auswahl für das OnChange-Ereignis einfach die entsprechende Prozedur auswählen.) Dabei musst Du darauf achten, dass Deine eigene Prozedur zu TForm gehören muss!
MfG,
Peter
Anonymous - So 17.11.02 14:20
Zitat: |
Okay, nur damit wir über das Gleiche sprechen: |
Du hast den Durchblick! :mrgreen:
Zitat: |
Hier wäre das also die Tatsache, dass sie einen Parameter vom Typ TObject haben muss. |
Meinst du damit, dass im Prozedurkopf
procedure WalzenAuswahl(Sender: TObject; WalzeX: String); stehen muss, oder etwas anderes?
Weil da weiss ich dann nicht, wie ich ein TObject geschweige denn eine Variable ins OnChange-Ereignis bringen kann! :cry:
Und hier stecke ich im Moment fest, da mir die Delphi-Hilfe nichts Vernünftiges anbietet. Also bin ich auf deine Genialität angewiesen 8) *superganzganzdolleschleim*
Ich habe auch schon probiert ohne Variable und über den ComboBox-Namen die aufgerufene ComboBox herauszufinden, aber auch habe ich nichts gefunden. Und weil ich den ComboBox-Namen ja nicht "weiss", kann ich auch nicht mit
if ComboBox.Name = AuswahlWalze1.Name then ... arbeiten, weil die ComboBoxen ja AuswahlWalze1, 2, 3 heissen.
Zitat: |
Du machst es so, wie Ihr es für TButton gelernt habt |
Netter Versuch, habe ich mir auch schon überlegt. :roll:
Aber dann muss ich ja für jede ComboBox
erst die Standard-OnChange-Ereignis-Prozedur einbauen und
dann meine eigene Prozedur für alle ComboBoxen, richtig? :wink:
Und das wäre dann wahrscheinlich länger, als alle Änderungen in den verschiedenen Standard-OnChange-Ereignis-Prozeduren einzubauen.
Zitat: |
Dabei musst Du darauf achten, dass Deine eigene Prozedur zu TForm gehören muss! |
Meinst du damit, dass die eigene Prozedur TForm1.Irgendwas heissen muss?
Ich schätze das (ich da richtig liege und :wink: ) das sein muss, weil ich die Prozedur ja als OnChange-Ereignis aufrufe und nicht aus einem OnChange-Ereignis oder einem anderem Ereignis heraus, richtig?
Christian S. - So 17.11.02 14:57
Prozedurkopf: nein, so darf er nicht aussehen. Er darf
nur den Parameter "Sender : TObject" enthalten. Wenn Du also eine eigene Ereignisbehandlung schreibst, darf sie auch nur den Parameter haben. Wenn Du also eine Behandlungsroutine hast
Quelltext
1: 2: 3: 4:
| procedure TForm1.auswahlchange(Sender : TObject); begin .... end; |
kannst Du diese jeder ComboBox als OnChange-Ereignis zuweisen. Sender enthält die Information, von welcher Combobox das Ereignis augewählt wurde. Abfragen kannst Du das so:
Quelltext
1:
| if TComboBox(sender).name = 'AuswahlWalze1' then ... |
(Kleiner Wink mit dem Zaunpfahl: das hatte ich schonmal für TImage geschrieben.)
Zitat: |
Ich schätze das (ich da richtig liege und ) das sein muss, weil ich die Prozedur ja als OnChange-Ereignis aufrufe und nicht aus einem OnChange-Ereignis oder einem anderem Ereignis heraus, richtig? |
Du hast den Durchblick! :mrgreen:
MfG,
Peter
Anonymous - Di 19.11.02 14:32
Danke! :)
Jetzt klappt das Aufrufen der Prozedur!
... Nur der Inhalt fehlt leider noch! :wink:
Anonymous - Di 19.11.02 19:33
Ich will ja die (z.B.) als 1. Walze verwendete Walze als 2. und 3. Walze "sperren". Dies mache ich im Moment mit ComboBox.Items.Delete und ComboBox.Items.Insert. Schließlich soll ja die verwendete Walze wieder "freigegeben" werden, wenn ich als 1. Walze eine andere nehme.
Gibt es da auch eine andere Möglochkeit, beispielesweise "richtiges Sperren"? Sprich: Die als 1. Walze verwendete Walze ist noch in der Auswahl der 2. und 3. Walze vorhanden, aber man sie nicht anklicken (in etwa wie beim Memofeld, das ich Enabled := False gesetzt habe).
Kann ich verhindern, dass man im Memofeld den eingegebenen Text markieren kann (mit VirtualKey vielleicht?).
Und dasselbe auch bei den ComboBoxen. Dort kann ich ja nicht nur auf den Pfeil zum Auswählen, sondern auch das Combofeld klicken. Das möchte ich auch irgendwie "sperren"?
Christian S. - Di 19.11.02 20:02
Zu Deiner letzten Frage: ändere den Style von csDropDown auf csDropDownList.
Zu Deinen anderen beiden Fragen: da weiß ich jetzt auch nichts zu. Vielleicht einfach mal im Forum suchen und wenn Du nichts findest, in einem separaten Thread posten. Das sind beides Sachen, die sicherlich auch andere interessieren dürfte.
MfG,
Peter
Anonymous - Mi 20.11.02 18:20
Mir ist gerade zufällig in den Examples von Delphi 6 ein MainMenu ins Auge gesprungen (hat richtig wehgetan 8) )!
Gibt es etwas ähnliches mit dem Unterschied, dass man es irgendwo auf die form packen kann? Dann könnte ich nämlich die ComboBoxen durch so etwas ersetzen! :D
Mit csDropDownList kann ich zwar keine eigenen Sachen mehr in die ComboBox schreiben, allerdings habe ich auch kein ausgewähltes Standarditem mehr, oder kann man das einbauen?
Christian S. - Mi 20.11.02 21:52
Mainmenu: hm, Du könntest es irgendwie über ein Popup-Menu machen. Ein hübsches Bildchen für die Walzen und wenn man rechts draufklickt, kann man sie ändern. Oder so ....
ComboBox: Stichwort "ItemIndex"
MfG,
Peter
Anonymous - Do 21.11.02 13:06
Ist das bei dem Memofeld so, dass die VirtualKeys nicht zu den normalen Zeichen zählen? Denn anders kann ich mir eigentlich nicht erklären, warum bei dieser Abfrage
Quelltext
1: 2: 3: 4:
| procedure TForm1.KlartextKeyPress(Sender: TObject; var GedrueckteTaste : Char); begin if (GedrueckteTaste in ['a'..'z', 'A'..'Z', #8, #13]) then begin ... |
die Shifttaste und damit das Markieren noch klappt. Allerdings gehört auch Enter zu den VirtualKeys und hat eine normale Zeichennummer (13).
Kann man Shift irgendwie sperren?
Ich habe deswegen einen neuen Thread gemacht, aber da will keiner posten! :bawling:
P.S.: Ich habe das mit ItemIndex und csDropDownList ausprobiert. Aber ich habe es nicht hingekriegt. Wahrscheinlich meinst du da irgendetwas mit Active ode so, richtig? Das habe ich zwar in der Hilfe gefunden, funktioniert bei mir aber nicht, weil er cmActive nicht kennt. MAche ich was falsch?
Christian S. - Do 21.11.02 16:45
Manchmal habe ich den Eindruck, Du beschäftigst Dich gar nicht richtig mit den Sachen.
1. Es ist keine große Sache, herauszufinden, dass Shift im Memofeld gar kein OnKeyPress auslöst. Darüber kannst Du Shift also nicht sperren.
2. Wenn ich ItemIndex schreibe kann es ebenfalls keine große Sache sein, im Object Inspector auf ItemIndex zu klicken und F1 zu drücken!
MfG,
Peter
Anonymous - Do 21.11.02 19:11
Zitat: |
Manchmal habe ich den Eindruck, Du beschäftigst Dich gar nicht richtig mit den Sachen. |
Das stimmt nicht. Ich probiere eine Menge Sachen aus, aber weil ich ja nur über ein beschränktes Wissen verfüge, weiss ich nur in wenigen Dingen, wie man das Problem auf andere Art lösen könnte.
Zitat: |
Es ist keine große Sache, herauszufinden, dass Shift im Memofeld gar kein OnKeyPress auslöst. |
Gut das hätte ich herausfinden könne, wenn ich gewusst hätte, dass nicht alle Tasten ein OnKeyPress-Ereignis auslösen. Aber hier ist es dennoch mein Fehler, das gebe ich zu!
Kann man Shift dennoch irgendwie sperren?
Zitat: |
Wenn ich ItemIndex schreibe kann es ebenfalls keine große Sache sein ... |
Das ist mir ehrlich gesagt neu (mit F1). Das hatten wir in der Schule nicht und wenn ich etwas über z.B. ItemIndex erfahren will, so gucke ich in die Hilfe. Aber dort finde ich meistens nichts Nützliches!
Christian S. - Do 21.11.02 19:40
Zitat: |
Das stimmt nicht. Ich probiere eine Menge Sachen aus, aber weil ich ja nur über ein beschränktes Wissen verfüge, weiss ich nur in wenigen Dingen, wie man das Problem auf andere Art lösen könnte. |
Sorry, ich bin in letzter Zeit etwas genervt.
Zitat: |
Das ist mir ehrlich gesagt neu (mit F1). Das hatten wir in der Schule nicht |
Gruß an Deinen Lehrer, er soll euch auch beibringen, wie man sich selbst Sachen beibringt! Und da gehört F1 ganz bestimmt zur Standardmethode!
Zitat: |
und wenn ich etwas über z.B. ItemIndex erfahren will, so gucke ich in die Hilfe. |
Guter Ansatz. Wenn ich im Hilfeindex "ItemIndex" eingebe, bekomme ich 'ne Menge nützlicher Hinweise.
Zitat: |
Kann man Shift dennoch irgendwie sperren? |
Da muss ich auch passen. Aber wenn Mathias hier mal wieder vorbeischaut, hat er wahrscheinlich eine Idee dazu. Wenn es dringend ist, kannste ihm ja mal 'ne PM schreiben.
MfG,
Peter
Anonymous - Fr 22.11.02 18:58
Zitat: |
Sorry, ich bin in letzter Zeit etwas genervt. |
Ist Okay! Geht schließlich jedem mal so! 8)
Zitat: |
Gruß an Deinen Lehrer, er soll euch auch beibringen, wie man sich selbst Sachen beibringt! |
Ich werde es ihm ausrichten! :twisted:
Zitat: |
Aber wenn Mathias hier mal wieder vorbeischaut, hat er wahrscheinlich eine Idee dazu. |
Ich kanns nur hoffen! :D
Aber es ist nicht
so wichtig, nur es nervt halt ein bisschen dieser
Makel im Programm! :twisted:
Christian S. - Fr 22.11.02 19:15
Zitat: |
nur es nervt halt ein bisschen dieser Makel im Programm! |
Das kenn' ich. Das geht mir auch so!
Anonymous - Fr 22.11.02 19:29
Ich habe mir mal deinen Tipp mit "Shift" ist ein OnKeyDown-Ereignis mal angeguckt.
Bei OnKeyDown wird folgende Prozedur erzeugt: procedure TForm1.KlartextKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); Ich kann zwar nun über if Key=vk_Shift abfragen, ob "Shift" gedrückt wurde, aber ich kann dann ja Key nicht auf #0 setzen, weil es eine Word-Variabel ist und bei Shift gehen nur die Werte ssShift, ssAlt, ssCtrl, ssLeft, ssRight, ssMiddle und ssDouble.
Ich könnte ja Shift auf z.B. ssLeft stellen, damit ich kein "Shift" mehr drücken kann, aber ich weiss nicht, wie ich das mache. Mache ich es so if Key=vk_shift then Shift := TShiftState(ssLeft); dann kommt "Invalid typecast" und bei all meinen anderen Lösungen kommen Meldungen wie "Invalid typecast" oder "Incompatible types: 'TShiftState' and 'String'". Wie kann ich Shift einen Wert zuweisen?
Christian S. - Fr 22.11.02 20:01
Hi!
Mir ist es gerade wie Schuppen von den Augen gefallen:
Quelltext
1:
| if (key IN [vk_left,vk_right,vk_down,vk_up])and (ssShift IN Shift) then key:=0; |
Das ins OnKeyDown-Ereignis und es klappt! *jubel*
MfG,
Peter
Anonymous - Fr 22.11.02 20:55
Zitat: |
Das ins OnKeyDown-Ereignis und es klappt! *jubel* |
Ich gehe wohl recht in der Annahme, dass ein Teil dieses *jubel* auf mein Konto geht, oder? 8)
Ich habe es ausprobiert und es klappt auch bei mir! :D
Und das mit ItemIndex und csDropDownList funktioniert nun auch! *jubel* (Danke! :P )
Christian S. - Fr 22.11.02 21:05
Zitat: |
Ich gehe wohl recht in der Annahme, dass ein Teil dieses *jubel* auf mein Konto geht, oder? |
Sicher, durch Dein Posting bin ich ja auf die Idee gekommen, wie es funktioniert.
Anonymous - Sa 23.11.02 18:40
Zitat: |
Sicher, durch Dein Posting bin ich ja auf die Idee gekommen, wie es funktioniert. |
Auch wenn Eigenlob stinkt: Ich habs verdient! 8)
Kann ich eine nicht standardmäßig in Windows integrierte Schriftart in das Programm einbauen? Ich meine damit nicht einfach eine beliebige Schriftart im ObjectInspector auswählen, sondern ich möchte wiseen, ob diese Schriftart in der Anwendung, die Delphi beim Ausführen erstellt, mit drin ist. Oder kann ich z.B. eine Schriftartdatei in ein bestimmtes Verzeichnis packen und die Anwendung darauf verweisen, sollte diese Schriftart nicht in Windows dabei sein?
Christian S. - Sa 23.11.02 20:34
Zitat: |
Auch wenn Eigenlob stinkt: Ich habs verdient! |
Naja, einmal auf sechs Seiten kannste ja auch mal 'ne Idee haben. :evil:
Was die Schriftart angeht, da muss ich mal drüber nachdenken und mich auch ein bisschen damit beschäftigen. Du möchest praktisch so wie bei PDF-Dateien bestimmt Schriftarten einbetten, oder?
MfG,
Peter
Anonymous - So 24.11.02 11:21
Zitat: |
Naja, einmal auf sechs Seiten kannste ja auch mal 'ne Idee haben. :evil: |
:schmoll:
Zitat: |
Du möchest praktisch so wie bei PDF-Dateien bestimmt Schriftarten einbetten, oder? |
Ich weiss jetzt nicht genau was du meinst, aber ich wills nochmal erkären (mein letztes Posting war ein bisschen undeutlich :oops: ):
Ich kann dem Memofeld eine Schriftart zuweisen z.B. Verdana. Auch wenn ich nicht Standard-Windows-Fonts dem Memofeld zuweise, klappt das Programm dann noch, weil es ja auf meinem PC die Schriftart findet.
Wie sieht das dann auf einem anderem Rechner aus? Dort wird die Nicht-Standard-Schriftart wohl nicht vorhanden sein. Nimmt das Programm dann automatisch eine Standard-Schriftart, oder läuft es gar nicht?
Kann ich bei einer Nicht-Standard-Schriftart dem Programm einen Pfad angeben, unter dem es die Schriftart findet, oder wird die Nicht-Standard-Schriftart mit in die Exe-Datei konvertiert?
So hatte ich das gemeint! :lol:
Christian S. - So 24.11.02 12:51
Okay, ich habe das, was Du möchtest richtig verstanden:
Wenn ich mich richtig erinnere, nimmt das Programm eine Standardschriftart, wenn eine andere Schriftart nicht verfügbar ist. Das man Schriftarten in die EXE-Datei einbinden kann, wäre mir neu. Es gibt jedoch eine Möglichkeit:
es gibt einen API-Befehl "AddFontResource" den ich selbst noch nie verwendet habe und auf den ich eben erst in der Hilfe gestoßen bin. Der fügt eine Schriftart dem System hinzu. Ich würde allerdings davon abraten, denn wenn jeder Programmierer seine eigene Schriftart installiert, dürfte der Benutzer das nicht so lustig finden.
MfG,
Peter
Anonymous - So 24.11.02 14:40
Zitat: |
Okay, ich habe das, was Du möchtest richtig verstanden: |
Congratulations! 8) (Bei meinen Problembeschreibungen ist das manchmal nicht so einfach! :oops: )
Zitat: |
Das man Schriftarten in die EXE-Datei einbinden kann, wäre mir neu. |
Kann ich ja mal ein neuen Thread aufmachen!
Zitat: |
Der [API-Befehl "AddFontResource"] fügt eine Schriftart dem System hinzu. |
Nee, das lass ich mal lieber. Außerdem haben wir in der Schule Win2k und nur mit Adminrechten kann man Dateien woanders als in "Eigenen Dateien" ablegen. Also fällt das flach.
Anonymous - Di 26.11.02 18:25
Wo ist eigentlich Mathias abgeblieben ?
Ist der verreist oder so ?
Ich hatte ja mal die Frage wie ich es hinkriege, dass das Memofeld beim Aufrufen des Programms leer ist. (Ich glaube jedenfalls, dass wir das mal hatten :wink: )
Mir ist da in der Schule noch was eingefallen: Einfach bei Memo1.Lines im Objektinspektor die TStrings alle löschen, sodass keine Zeilen mehr da sind! Geht auch :D
Christian S. - Di 26.11.02 18:36
Zitat: |
Wo ist eigentlich Mathias abgeblieben ?
Ist der verreist oder so ? |
Wahrscheinlich hat er nur keine Lust mehr an dem Thema. Es zieht sich ja schon eine Weile hin und er hat seine Enigma fertig. Die wirklich interessanten Fragen sind ja auch geklärt.
Zitat: |
Ich hatte ja mal die Frage wie ich es hinkriege, dass das Memofeld beim Aufrufen des Programms leer ist. |
Echt? :?:
Zitat: |
Einfach bei Memo1.Lines im Objektinspektor die TStrings alle löschen, sodass keine Zeilen mehr da sind! |
Ich hoffe, Du verstehst, dass dafür keine Beifallsstürme losbrechen.
MfG,
Peter
Anonymous - Di 26.11.02 18:56
Ich glaub schon! Und ihr habt gesagt, dass ich das mit FormCreate machen soll und dort dann Memo1.Text:=''. Glaub ich jedenfalls! :roll:
Aber auch wenn nicht, so finde ich ist es eine tolle Leistung, weil wir sowas in der Schule nicht hatten und ich ganz alleine drauf gekommen bin!
Zitat: |
Ich hoffe, Du verstehst, dass dafür keine Beifallsstürme losbrechen. |
Genau das meine ich. Ich habe in der Schule noch kein Memofeld besprochen. Für die Facharbeit habe ich das erste Mal ein Memofeld benutzt. Und solange das was ich will funktioniert, beschäftige ich mich nicht weiter mit dem Memofeld. Woher soll ich denn wissen, dass Memo1.Lines einen Inhalt hat, wenn man es auf die Form setzt? Vor allem, wenn ich zum "Füllen" des Memofeldes Memo1.Text benutze?
Diese Antworten meinte ich, als ich gesagt habe, dass ich wegen meines "simplen" Quellcodes angemacht worden bin!
Christian S. - Di 26.11.02 22:06
Zitat: |
Aber auch wenn nicht, so finde ich ist es eine tolle Leistung, weil wir sowas in der Schule nicht hatten und ich ganz alleine drauf gekommen bin! |
Ehrlich gesagt, wenn jemand diese Leistung nicht erbringen kann, sollte er gar nicht erst versuchen, zu programmieren. Du kannst nicht erwarten, dass Du in der Schule oder in Büchern alles bis ins letzte Detail beigebracht bekommst. Es ist selbstverständlich, dass die Schule nur die Grundlage bildet und Du Dir alles weitere selbst beibringst.
Zitat: |
Und solange das was ich will funktioniert, beschäftige ich mich nicht weiter mit dem Memofeld. |
Du musst Dich nicht wirklich damit beschäftigen. Wenn ich mit einer Komponente etwas machen will und nicht weiß wie es geht, ist doch wohl klar, dass ich zuerst einmal die Eigenschaften im Objektinspektor runterscrolle. Und schon da stößt man auf die Eigenschaft Lines. Und wenn es einem der Name nicht sagt, schaut man in der Hilfe nach, was sie bedeutet und stellt erfreut fest, dass es ja genau das ist, was man sucht.
Zitat: |
Diese Antworten meinte ich, als ich gesagt habe, dass ich wegen meines "simplen" Quellcodes angemacht worden bin! |
Diese Antwort hat absolut nichts mit Deinem Quellcode zu tun. Ich finde es einfach nur unangebracht, dass Du anscheinend der Meinung bist, da etwas aussergwöhnliches vollbracht zu haben. Dem ist nicht so. Es ist absolut selbstverständlich, selbst herauszufinden, wie eine Komponente funktioniert.
Im übrigen kann es wohl nicht Dein Ernst sein, nach inzwischen sieben Seiten Thread und andauernder Hilfestellung, anzudeuten, ich wäre "anfängerfeindlich".
patmann2001 - Mi 27.11.02 06:15
Hi
D0P3 F!$H
Ich wollte nur mal schnell meinen Senf zu Memo's hinzufügen, nicht das ich was neues Erzähle, da ja alles in der Hilfe steht, aber ich dachte so eine ganz kurze Einweisung hilft Dir weiter. :lol:
Wenn Du in dem Ereigniss von OnFormCreate die Zeile
einfügst, wird der gesamte Inhalt des Memos gelöscht.
Memo1.Text enthält immer den gesamten Text des Memo's, mit
Memo1.Lines[zahl:Integer] erhälst du immer nur den Inhalt einer Zeile, beginnent mit Null.
Memo1.Lines.Count gibt Dir die Anzahl der Zeilen im einem Memo zurück.
Jetzt nehmen wir mal an du möchtest den Inhalt von
VAR s:STRING; in deinem Memo hinzufügen, dann kannst Du das so machen:
Quelltext
1:
| memo1.text := memo1.text + s; |
oder damit er auf jeden Fall in einer neuen Zeile steht
Quelltext
1:
| memo1.text := memo1.text + #13 + #10 + s; |
oder auch schneller, besser, kürzer etc.
Wenn bei Dir die Programmierhilfe an ist, so wie bei mir, dann geht das ratz fatz, weil man nach memo1. Nur noch
l. und
a( drücken muss und schon steht der Code da.
cu Patmann
Anonymous - Mi 27.11.02 09:15
Auch wenn das jetzt abgedroschen klingen mag:
Ich habe die letzten beiden Postings nicht geschrieben!
Das war mein nerviger Bruder! (er hat schon seinen Teil abbekommen! :twisted: )
:oops: Ich entschuldige mich hier für ihn und das was er angerichtet hat! :(
:oops: Ich entschuldige mich hier für ihn und das was er angerichtet hat! :(
@ patmann2001: Obwohl ich viele Befehle schon kannte, waren doch einige Neue dabei!
Christian S. - Mi 27.11.02 17:32
Zitat: |
Ich habe die letzten beiden Postings nicht geschrieben! Das war mein nerviger Bruder! |
Wie alt ist der, dass er sich so etwas noch leistet?
Zitat: |
er hat schon seinen Teil abbekommen! |
Sollte im Radio über Brudermord in Dortmund berichtet werden, muss ich petzen.
Zitat: |
Ich entschuldige mich hier für ihn und das was er angerichtet hat! |
So schlimm war es ja auch nicht. Die Beziehungen sind nicht vergiftet. Lass ihn leben. (Nur foltern ist erlaubt.)
MfG,
Peter
Anonymous - Mi 27.11.02 18:05
Zitat: |
Wie alt ist der, dass er sich so etwas noch leistet? |
15! :oops: (Ich habe mir den nicht ausgesucht! :wink: )
Zitat: |
Lass ihn leben. (Nur foltern ist erlaubt.) |
Hätteste das nicht früher sagen können !!! Jetzt ist es zu spät! :twisted:
Aber nun zurück zum Thema.
Ich habe da noch ein Problem und zwar den Reflektor:
Wie funktioniert da die Verschlüsselung?
Quelltext
1: 2: 3:
| 1. Buchstabe wird zum 2. Buchstabe 3. Buchstabe wird zum 4. Buchstabe ... |
Quelltext
1: 2: 3:
| 1. Buchstabe wird zum 26. Buchstabe 2. Buchstabe wird zum 25. Buchstabe ... |
Quelltext
1: 2: 3:
| 1. Buchstabe wird zum 14. Buchstabe 2. Buchstabe wird zum 15. Buchstabe ... |
Christian S. - Mi 27.11.02 18:38
Die Kombinationen sind eigentlich nicht so wichtig. Wichtig ist folgendes (und das ist wirklich wichtig!):
1. Der Reflektor ist fest!
2. Der Reflektor ist symmetrisch. D.h.: wenn A-->B muss auch gelten B-->A. Wenn C-->H muss gelten H-->C
Das ist eigentlich schon alles. Der Reflektor ist wirklich sehr einfach, wenn man einnmal die Kombination ausgetüftelt hat.
MfG,
Peter
Anonymous - Mi 27.11.02 19:10
Zitat: |
Wichtig ist folgendes |
Das wusste ich schon vorher! :D
Nur weil ich ja schon die Originaleinstellungen der Rotoren habe, wollte ich auch die Originaleinstellungen der Reflektoren haben.
Die habe ich zwar auch, aber ich weiss halt nicht, wie die untereinander verbunden sind!
@ Mathias: Falss du mal vorbei schauen solltest, gib mal bitte Antwort!
Christian S. - Mi 27.11.02 19:28
Achso!
Die Originaleinstellungen befinden sich ebenfalls in dem Javaapplet. Öffne mal die Datei reflector.java. Ganz unten siehst Du zwei Zahlengruppen, die jeweils durch geschwungene Klammern zusammengefasst sind.
Das sind die Einstellungen, die Du brauchst. (Jeweils die Nummern der Buchstaben beginnend bei Null.)
MfG,
Peter
Anonymous - Mi 27.11.02 20:34
Mhhh ...
Das sind doch die beiden Reflektoreinstellungen, oder?
1.) YRUHQSLDPXNGOKMIEBFZCWVJAT
2.) FVPJIAOYEDRZXWGCTKUQSBNMHL
Die hatte ich doch schon vorher. Habe ich aber auch gepostet
Zitat: |
wollte ich auch die Originaleinstellungen der Reflektoren haben. Die habe ich zwar auch, aber ich weiss halt nicht, wie die untereinander verbunden sind! |
!
Oder heisst dass, wenn ich Reflektor 1 nehme, dann wird das "Y" (1. Buchstabe) mit dem 1. Buchstaben des 2. Reflektors "F" verschlüsselt ?
Das ginge aber nicht, weil ja A -> N und N -> A werden muss!
Also: wie meintest du das ? Bitte um Aufklärung! :wink:
Christian S. - Mi 27.11.02 21:29
Nein, die beiden Reflektoreinstellungen haben nichts miteinander zu tun. Du kannst immer nur eine von beiden verwenden. Es funktioniert so:
(Nummerierung der Felder und Buchstaben von 0..25)
Y steht an Platz 0 und ist der Buchstabe mit der Nummer 24. Also wird der Buchstabe Y mit dem Buchstaben am Platz 24 kodiert, das ist bei Dir das A.
Andersherum funktioniert es auch. Das A hat die Nummer 0, wird als mit dem Buchstaben am Platz 0 kodiert, das ist Y.
Zitat: |
Habe ich aber auch gepostet |
Sorry, ich verliere bei all den geposteten Buchstabenfolgen ein wenig den Überblick.
MfG,
Peter
Anonymous - Do 28.11.02 08:39
Ahhh, Danke!
Jetzt habe auch ich es kapiert! :D
Zitat: |
Sorry, ich verliere bei all den geposteten Buchstabenfolgen ein wenig den Überblick. |
Macht doch nichts, dass passiert wenn man älter wird! :twisted: (Geht mir irgendwann genauso!)
Christian S. - Do 28.11.02 14:24
Zitat: |
Macht doch nichts, dass passiert wenn man älter wird! |
Das ist ja wohl die Höhe! Diese jungen Leute! Kein Respekt vor dem Alter! Eine Frechheit ist das! Damals, als ich noch jung war, wäre das nie passiert! :mahn:
Anonymous - Do 28.11.02 18:39
Zitat: |
Damals, als ich noch jung war, wäre das nie passiert! |
Ist ja auch schon sehr, sehr, sehr lange her! :twisted:
Wie mir gerade beim Einbauen des Reflektors festgestellt, dass mein Programm nicht nach den Methoden der Enigma arbeitet!
So verschlüsselt mein Programm gerade:
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:
| ABCDEFGHIJKLMNOPQRSTUVWXYZ |||||||||||||||||||||||||| XVZNYEIWGAKMUSQOBDFHJLCPRTXVZNYEIWGAKMUSQOBDFHJLCPRT {Die Tastatur ist als abc... an die 1. Walze angeschlossen; Die Walzenanordnung dreht sich nach jedem Char um 1 weiter: also gleich vzn...}
ABCDEFGHIJKLMNOPQRSTUVWXYZ |||||||||||||||||||||||||| FAIVLPEKQDTNZJHGRCXMYSWBOU {Beim 1. Char kommt nach der 1. Walze das X raus; es wird das X im Alphabet gesucht und sein Partner auf der 2. Walze}
ABCDEFGHIJKLMNOPQRSTUVWXYZ |||||||||||||||||||||||||| PAIBRCJEKMFLGDQVZNTOWYHXUS {Beim 1. Char kommt nach der 2. Walze das B raus; es wird das B im Alphabet gesucht und sein Partner auf der 3. Walze}
ABCDEFGHIJKLMNOPQRSTUVWXYZ |||||||||||||||||||||||||| FVPJIAOYEDRZXWGCTKUQSBNMHL |||||||||||||||||||||||||| ABCDEFGHIJKLMNOPQRSTUVWXYZ {Beim 1. Char kommt nach der 3. Walze das A raus; es wird das A im Alphabet gesucht und sein Partner auf dem Reflektor gesucht; dessen Position im Alphabet wird ermittelt und dessen Partner ausgegeben; hier: A} Klar: Arschkriecher Code: AVBLSEJEUSYEM III XI; VII XVI; I XX; I |
Hier muss was falsch laufen! Denn es ist egal welchen Reflektor ich nehme, es kommt immer derselbe Text raus! Natürlich nur beim identischen Eingabetext (hier: Arschkriecher) !
Wie läuft die eigentliche Verschlüsselung ab ?
Jetzt muss mir der "alte Knacker" mal helfen! :twisted:
Christian S. - Do 28.11.02 19:32
Zitat: |
Ist ja auch schon sehr, sehr, sehr lange her! |
Hach ja, die guten alten Zeiten!
Das Missverständnis ist schnell geklärt:
Von den drei Zeilen, die Du für den Reflektor aufgeschrieben hast, brauchst Du nur eine, nämlich die mittlere. Wenn Du die mittlere Zeile hast, funktioniert es folgendermaßen:
Die 3.Walze liefert Dir das A. Dieses hat im Alphabet die Position 1 (oder 0, je nachdem, wie Du zählst). Also wird das A mit dem Buchstaben auf der 1. (0.) Position kodiert --> F.
Die Symmetrie ist auch hier gegeben. F hat im Alphabet die Position 6 (oder 5), wird also mit dem Buchstaben auf Position 6. (5.) Position kodiert --> A.
Na, wie hat der Greis das gemacht?
MfG,
Peter
Anonymous - Do 28.11.02 20:21
Jo, jetzt ist es besser!
Kannst du mal gucken, ob du auch auf dasselbe Ergebnis wie ich?
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| ABCDEFGHIJKLMNOPQRSTUVWXYZ |||||||||||||||||||||||||| XVZNYEIWGAKMUSQOBDFHJLCPRTXVZNYEIWGAKMUSQOBDFHJLCPRT
ABCDEFGHIJKLMNOPQRSTUVWXYZ |||||||||||||||||||||||||| FAIVLPEKQDTNZJHGRCXMYSWBOU
ABCDEFGHIJKLMNOPQRSTUVWXYZ |||||||||||||||||||||||||| PAIBRCJEKMFLGDQVZNTOWYHXUS
ABCDEFGHIJKLMNOPQRSTUVWXYZ |||||||||||||||||||||||||| FVPJIAOYEDRZXWGCTKUQSBNMHL
Klar: Arschkriecher Code: FBVZUIDISUHIX |
Ich habe vor jeder Walze das Alphabet gelassen, weil der Code nur eine Hilfe ist, um herauszfinden, ob das Programm so verschlüsselt wie ich es will. Und weil es dann einfacher ist, die richtige Position im Alphabet zu finden.
Zitat: |
Na, wie hat der Greis das gemacht? |
Was sagt man da! Noch nicht verkalkt und senil! :twisted:
Aber das alter hat auch seine Vorteile: Man muss nicht mehr arbeiten, darf soviel Unsinn labern wie man will ... :twisted:
Christian S. - Do 28.11.02 20:43
Der erste Buchstabe ist richtig. Beim zweiten weiß ich es nicht. Wie drehst Du Deine Walzen nochmal?
Zitat: |
Man muss nicht mehr arbeiten, darf soviel Unsinn labern wie man will ... |
Für wie alt hälst Du mich?
MfG,
Peter
Anonymous - Do 28.11.02 20:49
Ich habe folgende Buchstabenanordnung auf der 1. Walze vor dem 1. eingegebenen Buchstaben:
XVZNYEIWGAKMUSQOBDFHJLCPRT
Nach dem 1. eingegebenen Buchstaben dreht die 1. Walze sich um eine Stelle weiter:
VZNYEIWGAKMUSQOBDFHJLCPRTX
Dies wiederholt sich nach jedem weiteren eingegebenen Buchstaben.
Zitat: |
Für wie alt hälst Du mich? |
:oops: 25 - 30 !? *schleim* (Nein, mein ich ernst mit 25 - 30!)
Christian S. - Fr 29.11.02 15:03
Hmmm, irgendwie habe ich momentan ein Brett vor'm Kopf: Könntest Du vielleicht noch den "Pfad" für den zweiten Buchstaben aufschreiben?
Zitat: |
25 - 30 !? *schleim* (Nein, mein ich ernst mit 25 - 30!) |
Nö! Ich werde im April 21. Ätsch! Ver**scht!
MfG,
Peter
Anonymous - Fr 29.11.02 17:46
Zitat: |
Könntest Du vielleicht noch den "Pfad" für den zweiten Buchstaben aufschreiben? |
Ich weiss zwar nicht genau, was du meinst, aber ich mach dei Verschlüsselung mal ausführlich!
Der eingegebene Klartext ist: Arschkriecher
Die 1. Walze ist: XVZNYEIWGAKMUSQOBDFHJLCPRT (Walze III, Char XI)
Die 2. Walze ist: FAIVLPEKQDTNZJHGRCXMYSWBOU (Walze VII, Char XVI)
Die 3. Walze ist: PAIBRCJEKMFLGDQVZNTOWYHXUS (Walze III, Char XI)
Die Reflektor ist: FVPJIAOYEDRZXWGCTKUQSBNMHL (Reflektor I)
Nach jedem eingegebenen Buchstaben dreht sich die 1. Walze um einen Buchstaben weiter.
Nach dem 1. eingegebenen Buchstaben sieht die 1. Walze dann so aus:
Quelltext
1:
| VZNYEIWGAKMUSQOBDFHJLCPX |
Nach dem 2. eingegebenen Buchstaben sieht die 1. Walze dann so aus:
Quelltext
1:
| ZNYEIWGAKMUSQOBDFHJLCPXV |
Nach dem 3. eingegebenen Buchstaben sieht die 1. Walze dann so aus:
Quelltext
1:
| NYEIWGAKMUSQOBDFHJLCPXVZ |
Und so weiter und so fort!
Das folgende Schema benutze ich, um "vorherzusagen" welcher Buchstabe nun rauskommt. Nach jedem "eingegebenen" Buchstaben musst du die Reihe "XVZNYEIWGAKMUSQOBDFHJLCPRTXVZNYEIWGAKMUSQOBDFHJLCPRT" um den vordersten Buchstaben verkürzen.
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| ABCDEFGHIJKLMNOPQRSTUVWXYZ |||||||||||||||||||||||||| XVZNYEIWGAKMUSQOBDFHJLCPRTXVZNYEIWGAKMUSQOBDFHJLCPRT
ABCDEFGHIJKLMNOPQRSTUVWXYZ |||||||||||||||||||||||||| FAIVLPEKQDTNZJHGRCXMYSWBOU
ABCDEFGHIJKLMNOPQRSTUVWXYZ |||||||||||||||||||||||||| PAIBRCJEKMFLGDQVZNTOWYHXUS
ABCDEFGHIJKLMNOPQRSTUVWXYZ |||||||||||||||||||||||||| FVPJIAOYEDRZXWGCTKUQSBNMHL |
Bei mir kommt dann sowohl in der "Vorhersage" als auch im Programm selbst "FBVZUIDISUHIX" raus.
Für die ersten 3 eingegebenen Buchstaben mach ich mal auf reiner Höflichkeit den Weg nach:
Quelltext
1: 2: 3:
| A->X X->B B->A A->F R->F F->P P->V V->B S->J J->D D->B B->V |
Zitat: |
Hmmm, irgendwie habe ich momentan ein Brett vor'm Kopf: |
Habe ich nun den Nebel gelüftet?
Zitat: |
Nö! Ich werde im April 21. Ätsch! Ver**scht! |
Ich würde schwören, du bist 25 - 30. Denn deine perfekte Artikulation und deine überquellende Weisheit lassen auf ein höheres Alter schließen als 21.
Aber eins noch: Am 4.12 werd ich 17!
Christian S. - Fr 29.11.02 18:07
Zitat: |
Habe ich nun den Nebel gelüftet? |
Oh ja! Und er war sehr viel dichter, als ich dachte. Irgendwie war ich davon ausgegangen, dass sich
jede Walze immer um einen Buchstaben weiter dreht, aber das stimmt natürlich nicht.
Zitat: |
Denn deine perfekte Artikulation und deine überquellende Weisheit lassen auf ein höheres Alter schließen als 21. |
Danke! :oops: :oops: :oops: (In 25 Jahren oder so werde ich wohl nicht mehr Danke sagen, wenn jemand mein Alter zu hoch schätzt! :wink: )
Zitat: |
Aber eins noch: Am 4.12 werd ich 17! |
Witzig: ich habe am 12.4. Geburtstag.
MfG,
Peter
Anonymous - Fr 29.11.02 18:14
Zitat: |
Oh ja! Und er war sehr viel dichter, als ich dachte. Irgendwie war ich davon ausgegangen, dass sich jede Walze immer um einen Buchstaben weiter dreht, aber das stimmt natürlich nicht. |
Freut mich , dass ich helfen konnte. Und du hast das richtig erkannt mit dem Weiterdrehen! :D
Zitat: |
Danke! :oops: :oops: :oops: (In 25 Jahren oder so werde ich wohl nicht mehr Danke sagen, wenn jemand mein Alter zu hoch schätzt! :wink: ) |
Gern geschehen!
Wäre eine interessante Frage, ob du dich in 25 Jahren geschmeichelt fühlen würdest, wenn man dich jünger einschätzt als du bist! 8)
Zitat: |
Witzig: ich habe am 12.4. Geburtstag. |
LOL!
Aber du hast mir immer noch nicht gesagt, ob mein Programm nun richtig funktioniert oder nicht! :evil:
Ich muss vielleicht als Erläuterung noch dazu sagen, dass mein Programm bisher noch keinen Ring und kein Steckbrett hat. Wird wahrscheinlich auch nicht mehr kommen!
Christian S. - Fr 29.11.02 20:58
Hi!
Wäre in der Tat 'ne tolle Leistung von mir gewesen, wenn ich auf die eigentliche Frage geantwortet hätte....
Also: ich weiß nicht, wann Du die anderen Walzen weiterdrehst (im Moment fällt mir auch nicht ein, wann dass bei der echten Enigma passierte), aber davon mal abgesehen, kann ich keinen Fehler entdecken. Auf den ersten Blick zumindest nicht.
MfG,
Peter
Anonymous - Fr 29.11.02 21:08
Zitat: |
Wäre in der Tat 'ne tolle Leistung von mir gewesen, wenn ich auf die eigentliche Frage geantwortet hätte.... |
Du hast voll den Durchblick :mrgreen:
Zitat: |
Also: ich weiß nicht, wann Du die anderen Walzen weiterdrehst |
Das ging doch so.
NORMAL:
Die 1. Walze dreht sich nach jedem Buchstaben um eine Stelle weiter
Die 2. Walze dreht sich um eine Stelle weiter, wenn die 1. Walze eine volle Umdrehung gemacht hat (alle 26 Buchstaben)
Die 3. Walze dreht sich um eine Stelle weiter, wenn die 2. Walze eine volle Umdrehung gemacht hat (alle 26*26 Buchstaben!?)
SPEZIELL:
Es gibt dann ja noch den Ring. Dadurch wurde das Ganze doch verschoben. Dann war die "Umdrehung" schon bei z.B. 17 Buchstaben.
Und es gibt dann ja auch die Möglichkeit, dass wenn eine Walze eine volle Umdrehung gemacht hat, wird die vordere Walze nicht nur um eine Stelle weitergedreht, sondern um z.B. 8.
Zitat: |
Auf den ersten Blick zumindest nicht. |
8) Ohhh, yeahhh, baby! :twisted:
Anonymous - Sa 30.11.02 11:02
Mhhh ...
Mein Programm muss irgendwo falsch laufen!
Ich habe jetzt 3 Walzen hin + Reflektor + 3 Walzen zurück.
Es kommt auch das raus was ich "vorhergesagt" habe, aber wenn ich den Code wieder eingebe, kommt nicht der Klartext raus.
so funktioniert mein Programm:
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:
| ABCDEFGHIJKLMNOPQRSTUVWXYZ |||||||||||||||||||||||||| XVZNYEIWGAKMUSQOBDFHJLCPRTXVZNYEIWGAKMUSQOBDFHJLCPRT {1. Walze: immer den 1. Buchstaben nach Eingabe löschen} ABCDEFGHIJKLMNOPQRSTUVWXYZ |||||||||||||||||||||||||| FAIVLPEKQDTNZJHGRCXMYSWBOU {2. Walze}
ABCDEFGHIJKLMNOPQRSTUVWXYZ |||||||||||||||||||||||||| PAIBRCJEKMFLGDQVZNTOWYHXUS {3. Walze}
ABCDEFGHIJKLMNOPQRSTUVWXYZ |||||||||||||||||||||||||| FVPJIAOYEDRZXWGCTKUQSBNMHL {Reflektor}
ABCDEFGHIJKLMNOPQRSTUVWXYZ |||||||||||||||||||||||||| PAIBRCJEKMFLGDQVZNTOWYHXUS {3. Walze}
ABCDEFGHIJKLMNOPQRSTUVWXYZ |||||||||||||||||||||||||| FAIVLPEKQDTNZJHGRCXMYSWBOU {2. Walze}
ABCDEFGHIJKLMNOPQRSTUVWXYZ |||||||||||||||||||||||||| XVZNYEIWGAKMUSQOBDFHJLCPRTXVZNYEIWGAKMUSQOBDFHJLCPRT {1. Walze: immer den 1. Buchstaben nach Eingabe löschen} |
Klartext ist 'Arschkriecher' und als Code kommt 'GIBXXRIXJELYS' raus. Wenn ich aber als Klartext 'GIBXXRIXJELYS' eingebe, kommt 'SHNMRQBQHSANH' aus Code raus.
Daraus folgere ich, dass der Reflektor nichr richtig funkionieren muss. Denn bei der Eingabe des 'A' von 'Arschkriecher' wird im Reflektor das 'A' (Ausgabe der 3. Walze) zum 'F' (Ausgabe des Reflektors).
Gebe ich aber das "G" von 'GIBXXRIXJELYS' ein, so wird im Reflektor das 'Z' (Ausgabe der 3. Walze) zum 'L' (Ausgabe des Reflektors).
Eigentlich müsste aber wenn das 'A' beim Klartext zum 'F' wird, beim Code das 'F' zum wieder zum 'A' werden, weil ja sonst der verschlüsselte Buchstabe nie zum Klartextbuchstaben werden kann.
Im Programm selbst sieht die Verschlüsselung so aus:
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:
| PositionWalze1 := Ord(GedrueckteTaste) - 64 + DrehungenWalze1; if (PositionWalze1 >= 27) then Dec(PositionWalze1, 26); KodierterChar := Walze1[PositionWalze1];
PositionWalze2 := Ord(KodierterChar) - 64 + DrehungenWalze2; if (PositionWalze2 >= 27) then Dec(PositionWalze2, 26); KodierterChar := Walze2[PositionWalze2];
PositionWalze3 := Ord(KodierterChar) - 64 + DrehungenWalze3; if (PositionWalze3 >= 27) then Dec(PositionWalze3, 26); KodierterChar := Walze3[PositionWalze3];
PositionReflektor := Ord(KodierterChar) - 64; KodierterChar := Reflektor[PositionReflektor];
PositionWalze3 := Ord(KodierterChar) - 64 + DrehungenWalze3; if (PositionWalze3 >= 27) then Dec(PositionWalze3, 26); KodierterChar := Walze3[PositionWalze3];
PositionWalze2 := Ord(KodierterChar) - 64 + DrehungenWalze2; if (PositionWalze2 >= 27) then Dec(PositionWalze2, 26); KodierterChar := Walze2[PositionWalze2];
PositionWalze1 := Ord(KodierterChar) - 64 + DrehungenWalze1; if (PositionWalze1 >= 27) then Dec(PositionWalze1, 26); KodierterChar := Walze1[PositionWalze1];
KodierterText := KodierterText + KodierterChar; |
Wo liegt der Fehler ???
Christian S. - Sa 30.11.02 13:14
Oh! Ich habe noch etwas vergessen! So einfach ist das mit dem Reflektor doch nicht!
1. Die Walzen werden erst gedreht, nachdem das Zeichen das zweite Mal durchgegangen ist, nachdem es "reflektiert" wurde.
2. Du brauchst "inverse Walzen". Durch die schickst Du das Zeichen nämlich, nachdem es durch den Reflektor gegangen ist. Eine inverse Walze sieht (für Zahlen) so aus:
Original: 5 7 9 3 1 0 4 2 6 8
invertiert: 5 4 7 3 6 0 8 1 9 2
und so erhälst Du eine inverse Walze (die Positionen sind von 0 bis 9 durchnummeriert):
Original[0]=5. Also wird Invers[5]:=0
Original[1]=7. Also wird Invers[7]:=1;
Original[2]=9. Also wird Invers[9]:=2;
...
Für jede Walze brauchst eine invertierte Walze. Ist das Zeichen durch die drei Walzen und den Reflektor, schickst Du es jetzt nicht durch die Walzen, sondern durch die invertierten Walzen. Und zwar in der folgenden Reihenfolge:
1. Walze
2. Walze
3. Walze
Reflektor
3. invertierte Walze
2. invertierte Walze
1. invertierte Walze
So, ich glaube jetzt funktioniert es. Die invertierten Walzen werden mit den nicht invertierten Walzen mitgedreht.
MfG,
Peter
Anonymous - Sa 30.11.02 15:04
Zitat: |
Die Walzen werden erst gedreht, nachdem das Zeichen das zweite Mal durchgegangen ist, nachdem es "reflektiert" wurde. |
Das habe ich zwar nicht genau gewusst, aber mir mal gedacht, dass es so sein müsste.
Zitat: |
Du brauchst "inverse Walzen". Durch die schickst Du das Zeichen nämlich, nachdem es durch den Reflektor gegangen ist. |
Ist ja auch logisch, jetzt wo du es sagst. :)
Du meinst das so:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| ABCDEFGHIJKLMNOPQRSTUVWXYZ |||||||||||||||||||||||||| XVZNYEIWGAKMUSQOBDFHJLCPRT {1. Walze 'normal', also oben das Alphabet; linker Walzeneingang ist alphabetisch}
JQWRFSITGUKVLDPXOYNZMBHAEC |||||||||||||||||||||||||| ABCDEFGHIJKLMNOPQRSTUVWXYZ {1. Walze 'invers', also unten das Alphabet; rechter Walzeneingang ist alphabetisch} |
Zu kompliziert ? :wink:
Zitat: |
Die invertierten Walzen werden mit den nicht invertierten Walzen mitgedreht. |
Ist klar, weil sie ja identisch sind. Sprich: 3. Walze "normal" und "inversiv" ist dasselbe, nur von der anderen Walzenseite.
Christian S. - Sa 30.11.02 19:09
Ist nicht zu kompliziert. Scheint so richtig zu sein. Bis wann musst Du das Zeug abgeben?
Anonymous - So 01.12.02 14:16
8)
Es funktioniert !!! 8)
Danke!
Mein Programm verschlüsselt jetzt mit drei Walzen (hin und zurück) und Reflektor.
Wenn ich den Klartext verschlüssel und dann den Code bei selbiger Ausgangsstellung eingebe, kommt wieder der Klartext raus.
Das heisst doch wohl, mein Programm funktioniert richtig im Sinne der echten Enigma, oder?
Ich poste mal zur Vorsicht meinen Quellcode:
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:
| PositionWalze1 := Ord(GedrueckteTaste) - 64 + DrehungenWalze1; if (PositionWalze1 >= 27) then Dec(PositionWalze1, 26); KodierterChar :=Walze1[PositionWalze1];
PositionWalze2 := Ord(KodierterChar) - 64 + DrehungenWalze2; if (PositionWalze2 >= 27) then Dec(PositionWalze2, 26); KodierterChar :=Walze2[PositionWalze2];
PositionWalze3 := Ord(KodierterChar) - 64 + DrehungenWalze3; if (PositionWalze3 >= 27) then Dec(PositionWalze3, 26); KodierterChar := Walze3[PositionWalze3];
PositionReflektor := Ord(KodierterChar) - 64; KodierterChar := Reflektor[PositionReflektor];
PositionWalze3 := Pos(KodierterChar, Walze3) + (26 - DrehungenWalze3); if (PositionWalze3 >= 27) then Dec(PositionWalze3, 26); KodierterChar := Chr(PositionWalze3 + 64);
PositionWalze2 := Pos(KodierterChar, Walze2) + (26 - DrehungenWalze2); if (PositionWalze2 >= 27) then Dec(PositionWalze2, 26); KodierterChar := Chr(PositionWalze2 + 64);
PositionWalze1 := Pos(KodierterChar, Walze1) + (26 - DrehungenWalze1); if (PositionWalze1 >= 27) then Dec(PositionWalze1, 26); KodierterChar := Chr(PositionWalze1 + 64);
KodierterText := KodierterText + KodierterChar; |
Den ersten Teil bis zum Reflektor kennst du ja schon.
Dann kommt der Rückweg.
Dort wird vom kodierten Char, der aus dem Reflektor kommt, die Position desselben in der 3. Walze ermittelt. Und der aus der 3. Walze herauskommende Char ist der, der im Alphabet an der zuvor ermittelten Position steht.
Der restliche Verschlüsselungsrückweg erfolgt ähnlich.
Ein Beispiel:
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:
| ABCDEFGHIJKLMNOPQRSTUVWXYZ |||||||||||||||||||||||||| XVZNYEIWGAKMUSQOBDFHJLCPRTXVZNYEIWGAKMUSQOBDFHJLCPRT {1. Walze}
ABCDEFGHIJKLMNOPQRSTUVWXYZ |||||||||||||||||||||||||| FAIVLPEKQDTNZJHGRCXMYSWBOU {2. Walze}
ABCDEFGHIJKLMNOPQRSTUVWXYZ |||||||||||||||||||||||||| PAIBRCJEKMFLGDQVZNTOWYHXUS {3. Walze}
ABCDEFGHIJKLMNOPQRSTUVWXYZ |||||||||||||||||||||||||| FVPJIAOYEDRZXWGCTKUQSBNMHL {Reflektor}
PAIBRCJEKMFLGDQVZNTOWYHXUS |||||||||||||||||||||||||| ABCDEFGHIJKLMNOPQRSTUVWXYZ {3. Walze}
FAIVLPEKQDTNZJHGRCXMYSWBOU |||||||||||||||||||||||||| ABCDEFGHIJKLMNOPQRSTUVWXYZ {2. Walze}
XVZNYEIWGAKMUSQOBDFHJLCPRTXVZNYEIWGAKMUSQOBDFHJLCPRT |||||||||||||||||||||||||| ABCDEFGHIJKLMNOPQRSTUVWXYZ {1. Walze} |
Gebe ich nun ein "A" ein, so wird es in der 1. Walze zum "X", in der 2. Walze zum "B" und in der 3. Walze zum "A". Im Reflektor wird es zum "F". Auf dem Rückweg wird es zum "K", zum "H" und die Ausgabe ist ein "T".
Gebe ich nun das "T" ein, um die Verschlüsselung rückgängig zu machen, so wird es in der 1. Walze zum "H", in der 2. Walze zum "K" und in der 3. Walze zum "F". Im Reflektor wird es zum "A". Auf dem Rückweg wird es zum "B", zum "X" und die Ausgabe ist ein "A".
Einfacher sieht es so aus:
A -> X; X -> B; B -> A; A -> F; F -> K; K -> H; H -> T
T -> H; H -> K; K -> F; F -> A; A -> B; B -> X; X -> A
Man sieht das die Verschlüsselung von links nach rechts die Entschlüsselung von rechts nach links ist und umgekehrt.
Zitat: |
Bis wann musst Du das Zeug abgeben? |
Am 3.2.2003. Warum interessiert dich das? Du hast doch den Quellcode schon.
Christian S. - So 01.12.02 18:54
Prima, dass es jetzt klappt. Der Quellcode sieht auch ganz gut aus, obwohl der Praxistest natürlich sehr viel verlässlicher ist, als das bloße drüber gucken.
Zitat: |
Warum interessiert dich das? Du hast doch den Quellcode schon. |
Ich habe mich nur gefragt, ob Du noch Zeit hast, ein Steckbrett einzubauen.
MfG,
Peter
Anonymous - So 01.12.02 20:12
Also der Praxistest ist zwar nur kurz gewesen (20 verschiedene Ausgangsstellungen), aber wenn bei der Entschlüsselung immer der zuvor eingegebene Klartext rauskommt, so wird es wohl funktionieren, oder? :wink:
Wegen Steckbrett, Ring und Co ... die wollte ich eigentlich weglassen.
Erstens ist mir das im Moment ein bisschen zu schwierig, aber damit habe ich mich auch noch nicht beschäftigt, also sollte ich eigentlich keine voreiligen Schlüsse ziehen.
Ich habe nämlich erstmal vor, eine Tastatur und das Leuchbrett einzubauen, damit das Programm echter aussieht. Und das dürfte ja nicht soi schwierg sein (Hoffe ich jedenfalls). Habe mich ja schon mal wegen Array of TImage umgeschaut.
Christian S. - So 01.12.02 21:03
Hmmm, mit grafischer Umsetzung habe ich mich nie so sehr auseinander gesetzt. Meine Programme verwenden eigentlich immer nur die Standardkomponenten. In den Sachen kann ich Dir dann nicht so helfen, obwohl ich es versuchen werde.
Anonymous - So 01.12.02 21:11
Also ein Array of TImage hab ich schon mal zur Probe programmiert. Das ist ja auch einfach.
Ob das aber auch mit dem Programm zusammen klappt, muss ich aber noch ausprobieren. :wink:
Anonymous - Di 03.12.02 18:10
Wie funktionniert nochmal das Steckbrett?
Ich weiss gerade nur, dass dort dann irgendwelche Buchstaben vertauscht wurden. :wink:
Christian S. - Di 03.12.02 18:48
Viel mehr ist auch nicht dahinter. Man konnte jeweils zwei Buchstaben miteinander verbinden, so dass diese dann vertauscht wurden.
Wenn man A mit G verbunden hat, so wird G in die Verschlüsselung geschickt, wenn man A drückt und andersrum. Kommt ein G aus der Verschlüsselung, so erscheint ein A und andersum.
Tja, das wär's eigentlich auch schon.
MfG,
Peter
Anonymous - Di 03.12.02 19:22
Na dann habe ich das ja doch noch gewusst! 8)
Wie funktioniert den der Ring?
Hier sind meine Originaleinstellungen, da sind nämlich zwei Daten noch dabei!
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| Verschlüsselung | Walze | Notch | Turnover ABCDEFGHIJKLMNOPQRSTUVWXYZ | Eintrittswalze | | EKMFLGDQVZNTOWYHXUSPAIBRCJ | Walze I | Y | Q AJDKSIRUXBLHWTMCQGZNPYFVOE | Walze II | M | E BDFHJLCPRTXVZNYEIWGAKMUSQO | Walze III | D | V ESOVPZJAYQUIRHXLNFTGKDCMWB | Walze IV | R | J VZBRGITYUPSDNHLXAWMJQOFECK | Walze V | H | Z JPGVOUMFYQBENHZRDKASXLICTW | Walze VI | H, U | Z, M NZJHGRCXMYSWBOUFAIVLPEKQDT | Walze VII | H, U | Z, M FKQHTLXOCBJSPDZRAMEWNIUYGV | Walze VIII | H, U | Z, M LEYJVCNIXWPBQMDRTAKZGFUHOS | Walze Beta | M4 | M4 FSOKANUERHMBTIYCWLQPZXVGJD | Walze Gamma | M4 | M4 YRUHQSLDPXNGOKMIEBFZCWVJAT | Reflektor B | | FVPJIAOYEDRZXWGCTKUQSBNMHL | Reflektor C | | ENKQAUYWJICOPBLMDXZVFTHRGS | Reflektor 'dünn' B | M4 | M4 RDOBJNTKVEHMLFCWZAXGYIPSUQ | Reflektor 'dünn' C | M4 | M4 |
"Notch" heisst "Kerbe" oder "Engpass" und wird wohl der Punkt bzw. der Buchstabe auf der Walze sein, an dem die Walze umspringt und so die Vordere Walze mitdreht. Aber passiert das Umspringen
vor oder nach dem Buchstaben.
"Turnover" heisst "Umsatz" und wir wohl der Punkt bzw. der Buchstabe auf der Walze sein, zu dem die Walze nach einer Umdrehung springt.
Aber spruingt die Walze
vor oder hinter den Buchstaben?
Anonymous - Di 03.12.02 19:22
Na dann habe ich das ja doch noch gewusst! 8)
Wie funktioniert den der Ring?
Hier sind meine Originaleinstellungen, da sind nämlich zwei Daten noch dabei!
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| Verschlüsselung | Walze | Notch | Turnover ABCDEFGHIJKLMNOPQRSTUVWXYZ | Eintrittswalze | | EKMFLGDQVZNTOWYHXUSPAIBRCJ | Walze I | Y | Q AJDKSIRUXBLHWTMCQGZNPYFVOE | Walze II | M | E BDFHJLCPRTXVZNYEIWGAKMUSQO | Walze III | D | V ESOVPZJAYQUIRHXLNFTGKDCMWB | Walze IV | R | J VZBRGITYUPSDNHLXAWMJQOFECK | Walze V | H | Z JPGVOUMFYQBENHZRDKASXLICTW | Walze VI | H, U | Z, M NZJHGRCXMYSWBOUFAIVLPEKQDT | Walze VII | H, U | Z, M FKQHTLXOCBJSPDZRAMEWNIUYGV | Walze VIII | H, U | Z, M LEYJVCNIXWPBQMDRTAKZGFUHOS | Walze Beta | M4 | M4 FSOKANUERHMBTIYCWLQPZXVGJD | Walze Gamma | M4 | M4 YRUHQSLDPXNGOKMIEBFZCWVJAT | Reflektor B | | FVPJIAOYEDRZXWGCTKUQSBNMHL | Reflektor C | | ENKQAUYWJICOPBLMDXZVFTHRGS | Reflektor 'dünn' B | M4 | M4 RDOBJNTKVEHMLFCWZAXGYIPSUQ | Reflektor 'dünn' C | M4 | M4 |
"Notch" heisst "Kerbe" oder "Engpass" und wird wohl der Punkt bzw. der Buchstabe auf der Walze sein, an dem die Walze umspringt und so die Vordere Walze mitdreht. Aber passiert das Umspringen
vor oder nach dem Buchstaben.
"Turnover" heisst "Umsatz" und wir wohl der Punkt bzw. der Buchstabe auf der Walze sein, zu dem die Walze nach einer Umdrehung springt.
Aber spruingt die Walze
vor oder hinter den Buchstaben?
Anonymous - Di 03.12.02 19:24
Na dann habe ich das ja doch noch gewusst! 8)
Wie funktioniert den der Ring?
Hier sind meine Originaleinstellungen, da sind nämlich zwei Daten noch dabei!
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| Verschlüsselung | Walze | Notch | Turnover ABCDEFGHIJKLMNOPQRSTUVWXYZ | Eintrittswalze | | EKMFLGDQVZNTOWYHXUSPAIBRCJ | Walze I | Y | Q AJDKSIRUXBLHWTMCQGZNPYFVOE | Walze II | M | E BDFHJLCPRTXVZNYEIWGAKMUSQO | Walze III | D | V ESOVPZJAYQUIRHXLNFTGKDCMWB | Walze IV | R | J VZBRGITYUPSDNHLXAWMJQOFECK | Walze V | H | Z JPGVOUMFYQBENHZRDKASXLICTW | Walze VI | H, U | Z, M NZJHGRCXMYSWBOUFAIVLPEKQDT | Walze VII | H, U | Z, M FKQHTLXOCBJSPDZRAMEWNIUYGV | Walze VIII | H, U | Z, M LEYJVCNIXWPBQMDRTAKZGFUHOS | Walze Beta | M4 | M4 FSOKANUERHMBTIYCWLQPZXVGJD | Walze Gamma | M4 | M4 YRUHQSLDPXNGOKMIEBFZCWVJAT | Reflektor B | | FVPJIAOYEDRZXWGCTKUQSBNMHL | Reflektor C | | ENKQAUYWJICOPBLMDXZVFTHRGS | Reflektor 'dünn' B | M4 | M4 RDOBJNTKVEHMLFCWZAXGYIPSUQ | Reflektor 'dünn' C | M4 | M4 |
"Notch" heisst "Kerbe" oder "Engpass" und wird wohl der Punkt bzw. der Buchstabe auf der Walze sein, an dem die Walze umspringt und so die Vordere Walze mitdreht. Aber passiert das Umspringen
vor oder nach dem Buchstaben.
"Turnover" heisst "Umsatz" und wir wohl der Punkt bzw. der Buchstabe auf der Walze sein, zu dem die Walze nach einer Umdrehung springt.
Aber spruingt die Walze
vor oder hinter den Buchstaben?
Sorry 4 DoublePosts, aber da hat mein DSL mal wieder gespinnt! :oops:
@ Admin: Kannst du die beiden oberen Postings bitte mal löschen?
Christian S. - Di 03.12.02 19:30
Da bin ich absolut überfragt. Du hattest irgendwo mal einen Link zu einem PDF-Dokument gepostet, welches ziemlich zuverlässig aussah. Vielleicht steht da was drin.
Anonymous - Di 03.12.02 20:25
das einzige PDF-Dokument das ich als Link gefunden habe ist
Hier [
http://frode.home.cern.ch/frode/crypto/Turing/turchap1.pdf]!
Aber meintest du wirklich das Dokument ???
Um noch mal auf die ComboBoxen zurückzukommen:
Ich muss da ja noch die ausgewählte Walze sperren, da ja ansonsten eine Walze mehrmals benutzt werden könnte.
Gibt es eine Möglichkeit die einzelnen Items zu Sperren, sprich: sie sind noch da, lassen sich aber nicht mehr auswählen? Geht das vielleicht über so etwas wie ComboBox1.Items[2].Enabled = false? Das sollte - wenn es denn klappt - so aussehen wie in einem MainMenu, wo ich bestimmte Items sperren kann (die sind dann grau!).
Hat da wer eine Idee?
minnime - Mo 10.05.04 15:04
Ich will mir in nächster Zeit auch mal eine Enigma zusammenproggen, hab dazu aber eine kleine Frage, wie bekommt ihr das mit der Rotordrehung hin? Meine bisherige Vorstellung lautet, dass ich einen String habe und den mit dem entsprechenden Alphabet eines Rotors fülle und als Index des Strings Buchstaben fungieren, da sind dann die, die in den Rotor reingeschickt werden und das Ergebnis ist dann das was auf der anderen Seite aus ihm wieder herauskommt. Fragt wie ich die Rotation simulieren soll. Einemöglichkeit wäre den String in einen Hilfsstring zu laden und wieder zurückzuladen um gleichzeitig die Sortierung vorzunehmen, was allerdings etwas umständlich anmutet. Die zweite Möglichkeit besteht darin die Indizes des Strings selbst mit Inc() zu erhöhen, wobei die Frage besteht was passiert wenn ich z um eins erhöhe (Fehler oder a), da war ich halt zu faul zum ausprobieren.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!