Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - FEHLER: "Char" und "String" inkompatibel
Anonymous - Fr 01.11.02 14:39
Titel: FEHLER: "Char" und "String" inkompatibel
Hallo!
Ich bin gerade dabei eine ENIGMA-Maschine für die Minifacharbeit in der Stufe 11 zu schreiben.
Ich habe ein Eingabefeld (Memofeld), bei dem der eingegebene Char geprüft - und eventuell geändert bzw. nicht angezeigt - wird.
Der gegebenfalls kodierte Char (sollte) wird im Ausgabefeld (Memofeld) nach der Verschlüsselung ausgegeben.
Dann kommt die Verschlüsselung (und das Problem).
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:
| var Form1:TForm1; Walze1 : Array[1..78] of String = 'Q','N','1' , 'W','T','2' , 'E','B','3' , 'R','H','4' , 'T','P','5' , 'Z','V','6' , 'U','D','7' , 'I','J','8' , 'O','R','9' , 'P','X','10' , 'A','T','11' , 'S','L','12' , 'D','M','13' , 'F','Z','14' , 'G','A','15' , 'H','G','16' , 'J','O','17' , 'K','U','18' , 'L','C','19' , 'Y','I','20' , 'X','O','21' , 'C','W','22' , 'V','E','23' , 'B','K','24' , 'N','S','25' , 'M','Y','26');
implementation
procedure TForm1.KlartextKeyPress(Sender: TObject; var Taste: Char); var EingabeChar: Char; CharPosWalze1 : Integer; KodierterText : String; begin if Taste in ['a'..'z'] then Taste := Upcase(Taste); if not(Taste in ['A'..'Z', ' ', #13, #8]) then Taste := #0; {Überprüfung des Tastendrucks im 1.Memofeld}
EingabeChar := Taste; if EingabeChar in ['A'..'Z'] then begin EingabeChar := Walze1[1]; CharPosWalze1 := CharPosWalze1 + 3; if CharPosWalze1>76 then CharPosWalze1 := 1; end; {Kodierung nach Tastendruck und Überprüfung bei 'A'..'Z'} KodierterText := KodierterText + EingabeChar; Kodierung.Text := KodierterText; {Ausgabe des kodierten Buchstaben oder des nichtkodierten Zeichens} end;
end. |
Wenn EingabeChar als Char definiert wird, kommt
EingabeChar := Walze1[1]; als "Char" und "String" inkompatibel.
Wenn EingabeChar als String definiert wird, kommt
if EingabeChar in ['A'..'Z'] then begin als "String" und "Char" inkompatibel.
Wie kann ich das hinkriegen? :cry:
Plz Help Me!
CenBells - Fr 01.11.02 14:53
probier es doch mit eingabeChar := Char(Walze[1]);
Anonymous - Fr 01.11.02 16:32
Klappt mit beiden Einstellungen (EingabeChar : Char; oder EingabeChar : String) nicht.
Als String kommt bei: if EingabeChar in ['A'..'Z'] then begin "String" und "Char" inkompatibel.
Als Char kommt bei: EingabeChar := Chr(Walze1[1]); inkompatibele Typen.
Trotzdem Danke für deine Hilfe.
Anonymous - Fr 01.11.02 16:50
Habe schnell mal ein bisschen herumgefummelt (AM PROGRAMM NATÜRLICH :D ) und es muss EingabeChar := Chr(StrToInt(Walze1[1])); sein, damit es funktioniert.
Und schon das nächste Problem:
Wie kann ich Varablen vor dem Ausführen einer Prozedur einen Wert zuweisen
bzw.
Wie kann ich einer Variablen einer Wert zuweisen, den sie vor dem ersten Durchlauf der Prozedur hat und der sich danach jedesmal ändert?
Bitte wieder helfen! :oops:
Christian S. - Fr 01.11.02 17:36
Hi!
Ireniceus hat Char geschrieben. Nicht Chr. Das Chr nicht klappt ist logisch. Allerdings bezweifle ich, dass Deine Funktion wirklich den gewünschten Effekt hat. Selbst wenn das erste Zeichen von Walze1 eine Zahl ist (was in Deinem Beispiel nicht ist), ist diese Zahl in ein Char umgewandelt nicht die Zahl als Zeichen.
Zu Deinem Wert: ich würde die Walzenposition (um die es hier geht, oder?) in einer globalen Variable speichern, die Du im OnCreate-Ereignis auf 1 setzt.
MfG,
Peter
P.S.: Wieso ist der kodierte Buchstabe immer gleich Walze1[1]?
Anonymous - Fr 01.11.02 17:52
Hallo!
Ja ist mein Fehler, habe mich einfach verlesen.
ob es mit meiner Lösung klappt, weiss ich nicht, weil ich halt das nächste problem habe (mit OnCreate ist mir auch gerade eingefallen und wollte es gerade reinposten :wink: ).
Zu
Zitat: |
P.S.: Wieso ist der kodierte Buchstabe immer gleich Walze1[1]? |
ist folgendes zu sagen:
1) Ich bin Schüler der Stufe 11 eine Gymnasiums und wir haben zu Beginn des Schuljahres mit Delphi angefangen.
2) Allerdings machen wir Buttons, Images, Canvas etc.
3) Mein Programm ist eine Minifacharbeit und dafür brauche ich VIELE VIELE VIELE VIELE sachen, die wir im Unterricht nich machen.
3.1) Deshalb habe ich erstmal die Walze1[1] gesetzt. Mir ist dann auch aufgefallen, dass da irgendetwas falsch ist und habe es geändert, woraus sich dann das Problem mit OnCreate ergeben hat (das hatten wir natürlich auch nicht im Unterricht).
Danke für die Hilfe Peter und Ireniceus.
Wir werden uns bestimmt bald wiedersehen. :D (Aua, nicht schlagen...aua :wink: )
P.S.: Habe es gerade ausprobiert ... und es klappt auch mit Char nicht (es gibt wieder die oben genannten Fehler).
Mit
Quelltext
1:
| EingabeChar := Chr(StrToInt(Walze1[CharPosWalze1-2])); |
ist es auch nicht richtig, weil
Quelltext
1:
| EingabeChar := Chr(StrToInt(Walze1[1])); { bedeutet EingabeChar := Chr(StrToInt(Walze1['Q'])) } |
und das geht nicht.
Brauche weiterhin Hilfe *seufz
Anonymous - Fr 01.11.02 18:25
Wenn ich schreibe
EingabeChar := Chr(Ord('Q')); dann klappt das Programm. Aber auch nur beim ersten Buchstaben, danach kann ich die Nachricht zwar noch weitertippen, aber es wird nicht mehr weiter verschlüsselt.
Mein Programm sieht momentan so aus (CharPosWalze1 hat im Moment keine Bedeutung und spielt keine Rolle) :
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:
| var Form1:TForm1; CharPosWalze1 : Integer; Walze1 : Array[1..78] of String = ('Q','N','1' , 'W','T','2' , 'E','B','3' , 'R','H','4' , 'T','P','5' , 'Z','V','6' , 'U','D','7' , 'I','J','8' , 'O','R','9' , 'P','X','10' , 'A','T','11' , 'S','L','12' , 'D','M','13' , 'F','Z','14' , 'G','A','15' , 'H','G','16' , 'J','O','17' , 'K','U','18' , 'L','C','19' , 'Y','I','20' , 'X','O','21' , 'C','W','22' , 'V','E','23' , 'B','K','24' , 'N','S','25' , 'M','Y','26');
implementation
{$R *.dfm}
procedure TForm1.KlartextKeyPress(Sender: TObject; var Taste: Char); var EingabeChar : Char; KodierterText : String; begin if Taste in ['a'..'z'] then Taste := Upcase(Taste); {Wenn die Eingabe ein Kleinbuchstabe ist, dann wird sie zum Großbuchstaben} if not(Taste in ['A'..'Z', ' ', #13, #8]) then Taste := #0; {Wenn die Eingabe nicht Großbuchstabe, Leertaste, Enter oder Löschen ist, dann wird sie nicht aufgenommen}
EingabeChar := Taste; if EingabeChar in ['A'..'Z'] then begin EingabeChar := Walze1[1]; {Die Eingabe wird mit dem Buchstaben auf der 1. Walzenposition kodiert} CharPosWalze1 := CharPosWalze1 + 3; {Die Walzen dreht sich um einen Buchstaben weiter} if CharPosWalze1>78 then CharPosWalze1 := 3; {Nach 26 walzendrehungen ist die Walze wieder am Anfang} end; KodierterText := KodierterText + EingabeChar; Kodierung.Text := KodierterText; {Die Ausgabe wird um den verschlüsselten Buchstaben bzw. Leertaste, Enter oder Löschen erweitert} end;
procedure TForm1.FormCreate(Sender: TObject); begin CharPosWalze1 := 3; end;
end. |
Nachher soll das so aussehen:
EingabeChar := Walze1[CharPosWalze1-2];.
Wieso kodiert das Programm nur beim ersten Buchstaben? Wie bekomme ich den String Walze1[1] in den Char EingabeChar ? Was mache ich hier überhaupt? Und Wer bin ich? Argggggh! Hilfe! :D
Bitte helft mir!
Christian S. - Fr 01.11.02 18:42
Hi!
Ich habe mir Deine Verschlüsselungstabelle mal ein wenig genauer angeschaut und sehe zwei Probleme:
1. Wenn Du EingabeChar als Char beläst wirst Du damit nicht viel Freude haben. Spätestens wenn Du die '10' als einen einzigen Buchstaben behandeln willst, wird das nicht mehr funktionieren. Deklariere EingabeChar als String. Dann musst Du Deine dritte IF-Abfrage zwar etwas umschreiben, aber das ist ja kein großes Problem.
2. So wie das Programm jetzt da steht, kodiert es jeden Buchstaben mit Q, weil Walze1[1] nunmal ein Q ist. Ich kenne den Verschlüsselungsalgorithmus nicht genau, aber ich würde es mit Walze1[CharPosWalze1] versuchen. Je nach Algorithmus kann das aber auch falsch sein.
3. Du wirst beim dekodieren Probleme bekommen, wenn Du im kodierten Text die einzelnen Zeichen nicht irgendwie trennst. Wenn bespielsweise der kodierte Text '111' ist, weißt du momentan nicht, ob das '11' und '1' ist oder '1' und '11'. Oder verhindert der Entschlüsselungsalgorithmus das irgendwie?
MfG,
Peter
Anonymous - Fr 01.11.02 19:16
:!: Ohohoh, da gibst aber ein großes Missverständnis (liegt vielleicht an mir)! :!:
1. Der String Walze1 : Array[1..78] of String = ('Q','N','1' , 'W','T','2' , 'E','B','3' , ...); bedeutet folgendes:
Der Buchstabe 'Q' steht ein Position '1' der Walze und ist mit dem Buchstaben 'N' auf derselben Walze verbunden ('N' ist wichtig für Kodierungen bei mehreren Walzen. Aber erstmal mach ich das mit einer Walze)
2. Wegen CharPosWalze1 := CharPosWalze1 + 3; kommen beim Verschlüsseln nur die Zahlen (jeweils 3. "String" im Array) in die Variable CharPosWalze1, die ja eine Integervariable ist (da hast du irgendwie nicht richtig gelesen, oder Peter :wink: ?). Nachher (wenn das Programm fertiger ist) soll die Variable EingabeChar etwa so "gefüllt" werden : EingabeChar := Walze1[CharPosWalze1-2];. Doch da weiss ich noch nicht, wie ich die Strindvariable (Walze1[CharPosWalze1-2]) in die Charvariable (EingabeChar) bekomme. Und CharPosWalze1-2 ist IMMER ein Buchstabe (1. ('Q'), 4. ('W'), 7. ('E') ... "String" im Array), also kann die nichtzweistellig sein Peter.
3. Mir ist klar das ich immer mit 'Q' kodiere(n sollte), aber es ist nur zur ÜBUNG (ich sage es nochmal: ich bin Schüler Stufe 11 und bin nicht so gut wie ihr) und leichter. Ich sage kodieren sollte, denn das Programm kodiert nur den ersten Buchstaben nicht weiter. Ich habe keine Ahnung weshalb.
4. Dekodieren will ich wahrscheinlich überhaupt nicht. Wenn doch, so siehe 2. .(Du hast dich nämlich verlesen oder etwas überlesen, Peter)
Mein Probleme im Moment ist:
1. Wie bekomme ich in die Charvariable EingabeChar die Stringvariable Walze1[1] (Ich nehme erstmal Walze1[1] weil das einfacher ist und nicht si viele Fehler auftreten können wie bei EingabeChar := Walze1[CharPosWalze1-2]).
2. Weshalb kodiert das Programm nur den ersten Buchstaben und alles?
:arrow: Bitte weiterhin helfen und, wenn etws unklar ist, fragen!
Christian S. - Fr 01.11.02 20:29
Hi!
Okay, so langsam dämmert's bei mir! :wink:
Zu der Char-Variable:
Quelltext
1:
| EingabeChar:=Walze[1][1]; |
Damit sollte es klappen, wenn ich Dich nicht wieder falsch verstanden habe.
Zur Kodierung:
"KodierterText" ist eine lokale Variable der Prozedur. Jedes mal, wenn die Prozedur aufgerufen wird, wird sie neu initialisiert. Wenn Du sie global deklarierst und im OnCreate-Ereitnis initialisiert, sollte es funktionieren.
Wie kommt eigentlich später die Verbindung zwischen dem eingegeben Buchstaben und dem kodierten Buchstaben zustande? Im Moment sind die ja noch (gewollt) unabhänig.
MfG,
Peter[/code]
Anonymous - Fr 01.11.02 20:34
MIr ist noch etwas aus meiner Pascalzeit (letztes und vorletztes Schuljahr) eingefallen.
Ich kann doch
Delete- und
Insert-Befehle benutzen, um die Walze weiter zu drehen.
Dann sieht der Quelltext 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: 29: 30: 31: 32: 33: 34: 35:
| var Form1:TForm1; Walze1 : Array[1..52] of Char = ('Q','N' , 'W','T' , 'E','B' , 'R','H' , 'T','P' , 'Z','V' , 'U','D' , 'I','J' , 'O','R' , 'P','X' , 'A','T' , 'S','L' , 'D','M' , 'F','Z' , 'G','A' , 'H','G' , 'J','O' , 'K','U' , 'L','C' , 'Y','I' , 'X','O' , 'C','W' , 'V','E' , 'B','K' , 'N','S' , 'M','Y');
implementation
{$R *.dfm}
procedure TForm1.KlartextKeyPress(Sender: TObject; var Taste: Char); var EingabeChar : Char; KodierterText : String; begin if Taste in ['a'..'z'] then Taste := Upcase(Taste); {Wenn die Eingabe ein Kleinbuchstabe ist, dann wird sie zum Großbuchstaben} if not(Taste in ['A'..'Z', ' ', #13, #8]) then Taste := #0; {Wenn die Eingabe nicht Großbuchstabe, Leertaste, Enter oder Löschen ist, dann wird sie nicht aufgenommen}
EingabeChar := Taste; if EingabeChar in ['A'..'Z'] then begin EingabeChar := Walze1[1]; Insert(,,); Delete(,,); {Die Eingabe wird mit dem Buchstaben auf der 1. Walzenposition kodiert} end; KodierterText := KodierterText + EingabeChar; Kodierung.Text := KodierterText; {Die Ausgabe wird um den verschlüsselten Buchstaben bzw. Leertaste, Enter oder Löschen erweitert} end;
end. |
Das einzige Problem ist, dass ich die
Delete- und
Insert-Befehle in Dephi nicht so benutzen kann, wie ich es aus Pascal gewohnt bin (vielleicht stell ich mich auch zublöd an). Folgendermaßen sollen die Befhele benutzt werden:
1. Insert(die ersten beiden Stellen des Strings Walze1, Walze1, am Ende des Strings Walze1; d.h. Stelle 53 und 54gibt es noch nicht, da der String Walze1 nur 52 Stellen hat);
2. Delete(Walze1, die ersten beiden Stellen des Strings Walze1, 2);
Wie mach ich das? :roll:
Christian S. - Fr 01.11.02 20:57
Hi!
Dafür musst Du Dein Array Of Char in einen String umwandeln. Kannst Du das nicht direkt als String schreiben? Da es jetzt alles einzelne Buchstaben sind, sollte das doch gehen, oder?
Naja, wenn Du dann einen String hast, machst Du das so:
Quelltext
1: 2:
| Insert(Copy(text,1,2),text,Length(text)+1); Delete(text,Length(text)-1,2); |
MfG,
Peter
Anonymous - Fr 01.11.02 21:02
Juhuuuuuu! Es klappt! DANKE (Jetzt gucke ich auch immer deine Sendung :D )
DIESE ANTWORT BEZIEHT SICH AUF
Peter Lustig Fr 01.11.02 19:29
WICHTIG WICHTIG WICHTIG
Peter Lustig hat folgendes geschrieben: |
Zur Kodierung:
"KodierterText" ist eine lokale Variable der Prozedur. Jedes mal, wenn die Prozedur aufgerufen wird, wird sie neu initialisiert. Wenn Du sie global deklarierst und im OnCreate-Ereitnis initialisiert, sollte es funktionieren. |
Doch ich verstehe nicht, warum ich sie initialisieren sollte! Was bringt das? Klappt auch, wenn ich sie nur als globale Variable definiere.
Peter Lustig hat folgendes geschrieben: |
Wie kommt eigentlich später die Verbindung zwischen dem eingegeben Buchstaben und dem kodierten Buchstaben zustande? Im Moment sind die ja noch (gewollt) unabhänig. |
Ja, das ist so:
1. Entweder ich nehme eine Zählstelle in das Array mit auf, dann sieht das so aus:
Quelltext
1: 2: 3:
| Walze1 : Array[1..78] of String = ('Q','N','1' , 'W','T','2' , 'E','B','3' , 'R','H','4' , 'T','P','5' , 'Z','V','6' , 'U','D','7' , 'I','J','8' , 'O','R','9' , 'P','X','10' , 'A','T','11' , 'S','L','12' , 'D','M','13' , 'F','Z','14' , 'G','A','15' , 'H','G','16' , 'J','O','17' , 'K','U','18' , 'L','C','19' , 'Y','I','20' , 'X','O','21' , 'C','W','22' , 'V','E','23' , 'B','K','24' , 'N','S','25' , 'M','Y','26'); . . . EingabeChar := Walze1[1][1]; |
Bei EingabeChar müsste dann irgendwas um 3 erhöht werden (Aber ich verstehe nicht was Walze1[1][1] überhaupt bedeutet). Die Erhöhung sieht so aus:
eingegebener Buchstaben / kodierter Buchstabe / Walze1 (Buchstabe der rauskommt)
A / Q / (Walze1[1])
A / W / (Walze1[4])
A / E / (Walze1[7])
A / usw. / usw.
(verstanden?)
2. Oder ich nehme ins Array nur die Anordnung der Buchstaben auf der Walze und ihre jeweiligen "Partner"buchstaben auf der Walze auf. Das sieht dann so aus:
Quelltext
1: 2: 3: 4: 5:
| Walze1 : Array[1..52] of Char = ('Q','N' , 'W','T' , 'E','B' , 'R','H' , 'T','P' , 'Z','V' , 'U','D' , 'I','J' , 'O','R' , 'P','X' , 'A','T' , 'S','L' , 'D','M' , 'F','Z' , 'G','A' , 'H','G' , 'J','O' , 'K','U' , 'L','C' , 'Y','I' , 'X','O' , 'C','W' , 'V','E' , 'B','K' , 'N','S' , 'M','Y'); . . . EingabeChar := Walze1[1][1]; Delete(Walze1, die ersten beiden Stellen des Strings Walze1, 2); Insert(die ersten beiden Stellen des Strings Walze1, Walze1, am Ende des Strings Walze1; d.h. Stelle 53 und 54 gibt es noch nicht, da der String Walze1 nur 52 Stellen hat); |
Doch da weiss ich nicht, ob dein "Walze1[1][1]" noch geht und wie ich die Befehkle Delete und Insert richtig verwende (so wie in Pascal jedenfalls nicht!).
Das Array Walze1 würde sich dann so ändern:
eingegebener Buchstaben / kodierter Buchstabe / Walze1 (1. und 2. und vorletzte und letzte Stelle)
A / Q (Walze1[1]) / ('Q','N', ... ,'M','Y');
A / W (Walze1[4]) / ('W','T', ... ,'Q','N');
A / E (Walze1[7]) / ('E','B', ... ,'W','T');
A / usw. / usw.
(verstanden?)
:shock: ... :shock: ... :shock: ... :shock:
Ziemlich kompliziert, oder? :wink:
Christian S. - Fr 01.11.02 21:17
Hi!
Initialisieren: stimmt, eigentlich kommst Du ohne aus. Aber irgendwie ist das eine Angewohnheit von mir, da immer auf Nummer sicher zu gehen.
D0P3 F!$H hat folgendes geschrieben: |
Die Erhöhung sieht so aus:
eingegebener Buchstaben / kodierter Buchstabe / Walze1 (Buchstabe der rauskommt)
A / Q / (Walze1[1])
A / W / (Walze1[4])
A / E / (Walze1[7])
A / usw. / usw.
(verstanden?) |
Nicht ganz. Ich bin soweit, dass einBuchstabe nicht immer mit dem selben Buchstaben verschlüsselt werden soll. Das ist gut, da greift keine Häufigkeitsanalyse mehr. Aber was passiert, wenn ich 'B' drücke?
D0P3 F!$H hat folgendes geschrieben: |
Aber ich verstehe nicht was Walze1[1][1] überhaupt bedeutet |
Also: Mit Walze1[1] greifst Du auf den String an Position 1 zu. String ist aber auch ein Array, bestehend aus Chars. Mit Walze1[1][1] greifst Du also auf das erste Zeichen des ersten Strings zu.
D0P3 F!$H hat folgendes geschrieben: |
Doch da weiss ich nicht, ob dein "Walze1[1][1]" |
Da brauch es auch nicht mehr funktionieren. Da gibt die Walze1[1] ja schon einen Char. (Auch, wenn Du Walze1 vielleicht wirklich als String machst)
D0P3 F!$H hat folgendes geschrieben: |
A / Q (Walze1[1]) / ('Q','N', ... ,'M','Y');
A / W (Walze1[4]) / ('W','T', ... ,'Q','N');
A / E (Walze1[7]) / ('E','B', ... ,'W','T');
A / usw. / usw.
(verstanden?) |
Das mit dem rotieren schon. Die Idee gefällt mir, erinnert an das Original. Aber wieder die Frage nach dem 'B'.
MfG,
Peter
Anonymous - Sa 02.11.02 10:58
Hi!
Ich hab mir deine Antworten zu Herzen genommen und etwas ordentliches herausbekommen. 8)
(obwohl du immer etwas neues gepostet hast, wenn ich gerade eine Antwort geschrieben habe. Schäm dich! :) )
Mein Programm sieht jezt 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: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38:
| var Form1 : TForm1; i : Integer; KodierterText, Walze1 : String;
implementation
{$R *.dfm}
procedure TForm1.KlartextKeyPress(Sender : TObject; var Taste : Char); begin if Taste in ['a'..'z'] then Taste := Upcase(Taste); {Wenn die Eingabe ein Kleinbuchstabe ist, dann wird sie zum Großbuchstaben} if not(Taste in ['A'..'Z', ' ', #13, #8]) then Taste := #0; {Wenn die Eingabe nicht Großbuchstabe, Leertaste, Enter oder Löschen ist, dann wird sie nicht aufgenommen}
if Taste in ['A'..'Z'] then begin KodierterText := KodierterText + Walze1[1]; {Die Eingabe wird mit dem Buchstaben auf der 1. Walzenposition kodiert} Insert(Copy(Walze1,1,2), Walze1, Length(Walze1)+1); Delete(Walze1, 1, 2); {Die ersten beiden Buchstaben der Walze werden an das Walzenende versetzt} end; case Taste of ' ', #13 : KodierterText := KodierterText + Taste; #8 : for i := 0 to Length(KodierterText)-1 do KodierterText[i] := KodierterText[i]; end; Kodierung.Text := KodierterText; {Die Ausgabe wird um den verschlüsselten Buchstaben bzw. Leertaste, Enter oder Löschen erweitert} end;
procedure TForm1.FormCreate(Sender : TObject); begin KodierterText := ''; Walze1 := 'QNWTEBRHTPZVUDIJORPXATSLDMFZGAHGJOKULCYIXOCWVEBKNSMY'; end;
end. |
Zu deiner Frage:
Peter Lustig hat folgendes geschrieben: |
D0P3 F!$H hat folgendes geschrieben::
Die Erhöhung sieht so aus:
eingegebener Buchstaben / kodierter Buchstabe / Walze1 (Buchstabe der rauskommt)
A / Q / (Walze1[1])
A / W / (Walze1[4])
A / E / (Walze1[7])
A / usw. / usw.
(verstanden?)
Nicht ganz. Ich bin soweit, dass einBuchstabe nicht immer mit dem selben Buchstaben verschlüsselt werden soll. Das ist gut, da greift keine Häufigkeitsanalyse mehr. Aber was passiert, wenn ich 'B' drücke? |
Also das ist mein Fehler :oops:. Aber ich will es dir erklären, wenn auch für mein jetziges Programm. OK? (Ich kanns dir auch für die ältere Version erklären, wenn du willst)
eingegebener Buchstaben / kodierter Buchstabe / Walze1 (Buchstabe der rauskommt) / Walze1 (1. und 2. und vorletzte und letzte Stelle)
? / Q / Walze1[1] / Walze1 = ('Q','N', ... ,'M','Y')
? / W / Walze1[1] / Walze1 = ('W','T', ... ,'Q','N')
? / E / Walze1[1] / Walze1 = ('E','B', ... ,'W','T')
? / R / Walze[1] / Walze1 = ('R','H', ... ,'E','B');
? / T / Walze[1] / Walze1 = ('T','B', ... ,'R','H');
? / usw. / Walze[1] / usw.
? / usw. / Walze[1] / usw.
? / usw. / Walze[1] / usw.
(verstanden?)
Und was für einen Buchstaben du eintippst (immer 'A' oder 'ABCDEFGHIJ' oder immer 'B'), das ist völlig egal.
Das müsste jetzt klar sein, oder?
Stehe aber für weitere Fragen gerne zur Verfügung. :D
Doch nun zu meiner nächsten Frage:
Das Eingabe- und das Ausgabefeld sind Memofelder. Ich habe ihnen eine vertikale ScrollBar gegeben, doch im Ausgabefeld bleibt der "Bildschrim" immer oben, wie kann ich ihn "mitweandern" lassen, was ja beim Eingabefeld funktioniert (liegt wahrscheinlich am Mauszeiger der ja immer ganz unter ist, oder?)
Ist doch eigentlich eine einfache Frage, oder? :wink:
Christian S. - Sa 02.11.02 12:13
Hi!
D0P3 F!$H hat folgendes geschrieben: |
Schäm dich! |
*schaut beschämt zu Boden*
Wenn es völlig egal ist, welchen Buchstaben ich drücke, wie kann ich den Text dann wieder entschlüsseln (ich weiß, willst Du nicht machen, aber es müsste doch eigentlich möglich sein.)?
Was Dein Problem betrifft:
Quelltext
1: 2: 3: 4: 5:
| with memo2 do begin SelStart := Length(Text); SendMessage(memo2.Handle,EM_Scrollcaret,0,0); end; |
Quelltext
1:
| #8 : for i := 0 to Length(KodierterText)-1 do KodierterText[i] := KodierterText[i]; |
Was hat diese Zeile für einen Sinn? Du ersetzt jeden Buchstaben durch sich selbst? Außerdem: ein String fängt mit dem Index 1 an und endet mit Length(String).
MfG,
Peter
Anonymous - Sa 02.11.02 13:25
Hi!
Zu deiner Frage:
Peter Lustig hat folgendes geschrieben: |
Wenn es völlig egal ist, welchen Buchstaben ich drücke, wie kann ich den Text dann wieder entschlüsseln (ich weiß, willst Du nicht machen, aber es müsste doch eigentlich möglich sein.)? |
Bei der richtigen Enigma der Wehrmacht wurden die Anordnung der Walzen (vorderste Walze war z.B. Walze Nr.5, mittlere Nr.1 und letzte Nr.2) und die Buchstaben auf der jeweiligen Walze die "oben" (Ausgangsstellung) waren übermittelt (hier ein Link wo die gesamte Enigma SUPEr - besser als ich das kann :D - erkärt ist:
http://www-ivs.cs.uni-magdeburg.de/bs/lehre/wise0102/progb/vortraege/steffensauer/enigma_index.html ). Wenn der Entschlüssler nun weiss, wie die Walzen anzuordnen und welche Buchstaben "oben" sind, dann tippt er die kodierte Nachricht ein und erhält den Klartext.
Zu deiner Lösung:
Peter Lustig hat folgendes geschrieben: |
Was Dein Problem betrifft:
Quelltext 1: 2: 3: 4: 5:
| with memo2 do begin SelStart := Length(Text); SendMessage(memo2.Handle,EM_Scrollcaret,0,0); end; |
|
:shock: Ähhh . . . muss ich das verstehen (BITTE erklären, schließlich muss ich das meinem Lehrer erklären können, wenn ich das einbaue)
Zu deiner nächsten Frage:
Peter Lustig hat folgendes geschrieben: |
#8 : for i := 0 to Length(KodierterText)-1 do KodierterText[i] := KodierterText[i];
Was hat diese Zeile für einen Sinn? Du ersetzt jeden Buchstaben durch sich selbst? Außerdem: ein String fängt mit dem Index 1 an und endet mit Length(String). |
Also mal wieder mein Fehler *rotwerdundkopfgegendiewandhämmer* (NICHT nachmachen Kinder, tut weh !!!)
Das ist mein nächstes Problem (hab ich vergessen zu erwähnen *heulundschäm*):
Bei der Verschlüsselung werden
1. ' ' (Leerstelle) erkannt und im Klartext auch als Leerstelle angezeigt und nicht verschlüsselt, sondern auch als Leerstelle ausgegeben (RICHTIG!)
2. #13 (Enter) zwar erkannt und im Klartext kommt auch ein Zeilensprung, aber in der Verschlüsselung als [] (so ein Kästchen ausgegeben) (FALSCH)
3. #8 (Löschen über Enter) zwar erkannt und im Klartext kann gelöscht werden, aber in der kodierten Nachricht passiert nichts. Z.B. wenn ich einen Text kodiere und dann ein Wort lösche und weiterschreibe, dann bleibt die kodierte Nachricht mit "gelöschtem" Wort stehen und es wird - wenn ich die Nachricht weiterschreibe - auch weiter kodiert (FALSCH)
Das
#8 : for i := 0 to Length(KodierterText)-1 do KodierterText[i] := KodierterText[i]; sollte eigentlich bewirken, dass er den kodierten Text durch den kodierten Text MINUS die letzte Stelle ersetzt (er löscht also die letzte Stelle)
Ersezte ich
Quelltext
1: 2:
| ' ', #13 : KodierterText := KodierterText + Taste; #8 : for i := 0 to Length(KodierterText)-1 do KodierterText[i] := KodierterText[i]; |
durch das hier
' ', #13, #8 : KodierterText := KodierterText + Taste; dann wird wie bei "Enter" so ein Kästchen ([]) gemacht. Wenn ich es so lasse wie es ist, dann kommt kein Kästchen, aber er löscht die Stelle auch nicht.
wieder so kompliziert! :wink:
Wie kann ich das mit "Enter" und "Löschen" lösen?
Christian S. - Sa 02.11.02 13:55
Hi!
D0P3 F!$H hat folgendes geschrieben: |
Ähhh . . . muss ich das verstehen |
Nein, nicht wirklich. SendMessage wird verwendet, um Windowsnachrichten an Komponenten zu senden. Diese werden dann von dem Handle dieser Komponente empfangen und verarbeitet. EM_Scrollcaret ist die Nachricht, die wir in unserem Fall an Memo2.Handle senden wollen. Diese Nachricht veranlasst das Memofeld, soweit zu scrollen, dass der Cursor in Sicht ist. Und den haben wir mit SelStart:=Length(text) ans Ende gesetzt. Also scrollt EM_Scrollcaret das Memo bis ans Ende.
D0P3 F!$H hat folgendes geschrieben: |
*rotwerdundkopfgegendiewandhämmer* |
:autsch: So in etwa?
Quelltext
1: 2:
| #13: kodierter_text:=kodierter_text+#13#10; #8: Delete(kodierter_text,Length(kodierter_text),1); |
So könnte es funktionieren. Beim letzten bin ich mir nicht sicher, ob ich das mit den Nummern richtig hinbekommen hab, da verhaue ich mich jedes Mal. Und frag' mich bitte nicht, warum #10 dahinter muss. Ich habe nie rausgefunden, was das bedeutet, aber es funktioniert. Ach ja, muss beim Backspace auch die Walze zurückgedreht werden? Wenn ja, dann sollte das eigentlich wie das Vorspulen gehen.
MfG,
Peter
Delete - Sa 02.11.02 14:13
Peter Lustig hat folgendes geschrieben: |
Quelltext 1:
| #8: Delete(kodierter_text,Length(kodierter_text),1); |
So könnte es funktionieren. |
Hm, aber damit bist du auch aus dem Kodierschema "QWERT..." raus, Peter ... bzw. D0P3 F!$H. Mit jedem getippten Buchstaben verschiebst du die jeweils ersten beiden Buchstaben der Walze an das Ende:
Quelltext
1: 2:
| Insert(Copy(Walze1,1,2), Walze1, Length(Walze1)+1); Delete(Walze1, 1, 2); |
Logischerweise musst du das wieder rückgängig machen, wenn ein Buchstabe entfernt wird:
Quelltext
1: 2: 3: 4: 5: 6: 7:
| #8: if(KodierterText <> '') then begin delete(KodierterText,length(KodierterText),1); Walze1 := copy(Walze1,length(Walze1)-1,2) + Walze1; delete(Walze1,length(Walze1)-1,2); end; |
Allerdings geht die ganze "Kodierung" auch einfacher und schneller. Man benötigt bloß die Positionsvariable, die man entsprechend anpasst, und kann sich das "copy" und "delete" an der Walze sparen:
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:
| const Walze1 : string = 'QNWTEBRHTPZVUDIJORPXATSLDMFZGAHGJOKULCYIXOCWVEBKNSMY'; var cText : string = ''; wPos : integer = 1;
procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char); begin if(Key in['a'..'z','A'..'Z',#13,#10,#32,#8]) then begin Key := UpCase(Key);
case Key of 'A'..'Z': begin cText := cText + Walze1[wPos]; if(wPos = length(Walze1) - 1) then wPos := 1 else inc(wPos,2); end; #13,#10,#32: cText := cText + Key; #8: if(cText <> '') then begin delete(cText,length(cText),1);
if(wPos = 1) then wPos := length(Walze1) - 1 else dec(wPos,2); end; end;
Memo2.Lines.Text := cText; end else Key := #0; end; |
Fertig. 8)
Aber jetzt lese ich mir erst mal die Erklärungen zur echten ENIGMA durch, denn -sorry!- in dem Code von D0P3 F!$H sehe ich keinen Ansatz für eine Dekodierung. Insofern ist das für mich bestenfalls eine "Zeichensalatmaschine". :twisted:
Anonymous - Sa 02.11.02 14:35
@ Peter Lustig:
1.
Peter Lustig hat folgendes geschrieben: |
Und frag' mich bitte nicht, warum #10 dahinter muss |
ICH BIN SCHLAUER WIE DU :lol: hier stehts
http://www.fh-jena.de/~gmueller/Kurs_halle/c_ascii.html :!: (müsste eigentlich stimmen)
2.
Peter Lustig hat folgendes geschrieben: |
Ach ja, muss beim Backspace auch die Walze zurückgedreht werden? Wenn ja, dann sollte das eigentlich wie das Vorspulen gehen. |
Das ist eine gute Frage. Weiss ich auch nicht, schätze aber mal, dass die dann die Nachricht neu tippen mussten (weil Walze "zurückdrehen" geht ja bei richtigen ENIGMA nicht so leicht schätze ich)
3. Ja jetzt klappt erstmal soweit.
@MathiasSimmack:
1. Muss mir mal dein Programm ansehen, ob ich das verstehe uns so.
2.
ICH WIEDERHOLE MICH ZWAR UNGERN, ABER ... ich bin Schüler (Stufe 11) ... und dies ist meine Minifacharbeit in Informatik, dass heisst:
- Ich kann das Programmieren nicht so gut wie "richtige" Programmierer
- Ich fange mit einfaches Sachen an und arbeite mich dann zu Schwierigerem vor (mehr walzen, eventuell Steckbrett, Ring und Reflektor)
- Ich hatte nie vor und habe im Moment auch nicht vor, den Text wieder zu dekodieren (steht auch weiter oben in diesem Topic)
D0P3 F!$H hat folgendes geschrieben: |
4. Dekodieren will ich wahrscheinlich überhaupt nicht. |
- Mein Lehrer hat wahrscheinlich keine Ahnung wie die Enigma programmiert wird, denn er meint, wenn ich die Enigma mit einer Walze hinkriege, wäre er schon erstaunt *g*. Also soll ich auch NICHT dekodieren. (hat er selbst gesagt)
Sorry, wenn ich auf dir rumhacke, aber ioch mache mir hier Mühe mir dem Programm und dann kommst du und machst es schlecht (wahrscheinlich ohne alles hier geschriebene zu lesen, sonst hätte ich dir zu widersprechen brauchen)! :wink:
ALSO nochmals:
!!! SORRY !!! @ MathiasSimmack @ !!! SORRY !!!
aber es war nötig
Christian S. - Sa 02.11.02 14:52
Hi!
MathiasSimmack hat folgendes geschrieben: |
Logischerweise musst du das wieder rückgängig machen, wenn ein Buchstabe entfernt wird: |
Stimmt, habe ich aber auch schon geschrieben:
Peter Lustig hat folgendes geschrieben: |
Ach ja, muss beim Backspace auch die Walze zurückgedreht werden? Wenn ja, dann sollte das eigentlich wie das Vorspulen gehen. |
MathiasSimmack hat folgendes geschrieben: |
Man benötigt bloß die Positionsvariable, die man entsprechend anpasst, und kann sich das "copy" und "delete" an der Walze sparen: |
Ja, stimmt. War auch der erste Ansatz, warum wir den verworfen haben, weiß ich jetzt im nachhinein auch nicht mehr. Aber mit Copy und Paste erinnert so'n bisschen an die Walzendrehung.
DOP3 F!$H @MathiasSimmack hat folgendes geschrieben: |
und dann kommst du und machst es schlecht |
Nein, er macht es nicht schlecht, sondern zeigt Alternativen auf. Die sollten jedem immer willkommen sein. Und "schlecht machen" ist auch nur ein anderer Ausdruck für "Kritik üben" und Kritik sollte auch immer willkommen sein. Durch Kritik lernen wir.
Aber jetzt habe ich nochmal eine Frage: Wenn ich die Walze habe, wie Du sie hier programmierst und ich drücke als ersten Buchstaben 'A' bekomme ich ein 'Q'. Wenn ich als ersten Buchstaben 'B' drücke, bekomme ich auch ein 'Q'. Das ist doch aber nicht richtig, oder? Selbst wenn Du nicht dekodieren willst.
MfG,
Peter[/quote]
Anonymous - Sa 02.11.02 15:22
Hi!
Ich weiss, dass MathiasSimmack mir helfen wollte bzw. hilft. Aber so wie er es geschrieben hat war es nicht gut, denn
1. Ich hatte ja schon vorher (irgendwann) geschrieben, das ich
gar nicht dekodieren will.
2. Und ich fange bei meinen Programmen immer einfach an und baue sie dann aus. Daher ist klar, dass die Enigma mit einer Walze eine "Zeichensalatmaschine" ist, die eine Kette von 26 aneinander gereihten Buchstaben erzeugt.
Zu
Peter Lustig hat folgendes geschrieben: |
Aber jetzt habe ich nochmal eine Frage: Wenn ich die Walze habe, wie Du sie hier programmierst und ich drücke als ersten Buchstaben 'A' bekomme ich ein 'Q'. Wenn ich als ersten Buchstaben 'B' drücke, bekomme ich auch ein 'Q'. Das ist doch aber nicht richtig, oder? |
ist zu sagen
WIEDER MAL MEIN FEHLER,
denn ich habe die neuste Version meines Programms nicht gepostet.
Dort funktioniert die Verschlüsselung einwandfrei (nur "Löschen" klappt nicht). Nimmst du das Programm von MathiasSimmack dann klappt alles (DANKE! Ich werde es ein bisschen umbauen für mich)
Also, wenn ich mit der einwalzigen Enigma zufrieden bin, poste ich sie hier rein:
VERSPROCHEN!
Doch ich habe schon wieder eine Frage:
Es gibt so ComboBoxen (glaub ich jedenfalls, dass die ComboBox das ist, was ich brauche :wink: ). Ich meine ein Kästchen wo etwas steht, z.B. "Hallo". Neben dem Kästchen ist ein Pfeil (das Kästchen sieht so aus wie das "Gehe zu: [Forum]"-Feld ganz unten auf der Seite) und klicke ich da drauf, so kann ich andere Sachen auswählen, wie "Tach" oder "Tschüss".
Nun zu meiner Frage :D :
Wie kann ich so ein Kästchen anlegen (mit mehreren Auswahlmöglichkeiten)?
Das soll nämlich dazu dienen, die Walze vor dem Kodieren manuell zu verstellen (siehe
http://www-ivs.cs.uni-magdeburg.de/bs/lehre/wise0102/progb/vortraege/steffensauer/enigma_bedienung.html ).
Doch bei so einem Kästchen wieder die Frage, was mache ich, wenn der User erst die Walze manuell einstellt, dann beginnt zu kodieren und dann nochmal die Walze manuell einstellt. (Bei der richtigen Enigma würde das niemand machen, weil er dann ja auch übermittlen müsste, an welcher Stelle den Nachricht er die Walzenstellung geändert hat) Das müsste irgendwie verhindert werden (Sperren des Kästchens nach Beginn des Kodierens ... oder so :wink: )
Christian S. - Sa 02.11.02 15:46
Hi!
Das mit der ComboBox ist nicht schwer. Wenn Du die auf der Arbeitsfläche hast, dann hast Du Im Object Inspector die Eigenschaft Items. Dort kannst Du dann in jeder Zeile eine Auswahlmöglichkeit eingeben. Über ComboBox1.Items[i] kannst Du dann während der Laufzeit auf die Einträge zugreifen, ItemIndex gibt Dir die Nummer des Eintrags, der gerade ausgewählt ist.
Um die ComboBox zu sperren, setzt Du ganz einfach ComboBox1.Enabled auf "false", um sie wieder zu aktivieren auf "true".
DOP3 F!$H hat folgendes geschrieben: |
Nimmst du das Programm von MathiasSimmack dann klappt alles |
Auch Mathias' Programm kodiert jeden ersten Buchstaben mit Q, egal um welchen Buchstaben es sich handelt. Oder habe ich mich da jetzt verguckt?
MfG,
Peter
Delete - Sa 02.11.02 18:05
So, jetzt muss ich doch mal einschreiten. Ich möchte nämlich nicht als Buhmann hingestellt werden. Zumindest nicht hier in diesem Thread ...
Peter Lustig hat folgendes geschrieben: |
Nein, er macht es nicht schlecht, sondern zeigt Alternativen auf. |
Peter hat´s klar erkannt. Aber jetzt ausführlich:
Zitat: |
Muss mir mal dein Programm ansehen, ob ich das verstehe uns so. |
Ich habe euren (deinen und Peters) Ansatz mit der Position ja gelesen. Meiner Meinung nach ist das blanke Hochsetzen bzw. Verringern der Position innerhalb der Walze weitaus schneller und effizienter als das Umkopieren der Buchstaben.
Aus dem Grund -und nur aus dem Grund!- habe ich diesen Ansatz mal verfolgt und bin auf meinen Lösungsweg gekommen.
Zitat: |
-Ich kann das Programmieren nicht so gut wie "richtige" Programmierer |
Das verlangt auch keiner. Ich habe auch noch diverse Schwächen. Ich würde mich auch nicht als "richtigen" Programmierer bezeichnen wollen, da ich´s nicht beruflich mache ...
Zitat: |
Ich fange mit einfaches Sachen an und arbeite mich dann zu Schwierigerem vor (mehr walzen, eventuell Steckbrett, Ring und Reflektor) |
Das ist der richtige Weg. Zumindest machst du dir ja selbst einen Kopf. Es gibt auch Leute, die wollen den Code fertig haben, ohne nachdenken zu müssen.
Zitat: |
Ich hatte nie vor und habe im Moment auch nicht vor, den Text wieder zu dekodieren (steht auch weiter oben in diesem Topic) |
Das habe ich gelesen! Ich hab´s auch verstanden!
Zitat: |
... und dann kommst du und machst es schlecht |
Das ist gar nicht wahr!
Zitat: |
(wahrscheinlich ohne alles hier geschriebene zu lesen ...)! |
Ich habe eine lokale Kopie des Threads gemacht und in aller Ruhe gelesen und versucht, das ganze nachzuvollziehen. Erst danach habe ich gepostet! Nur, und da wirst du mir sicher zustimmen: den zum Teil fehlerhaften Quellcode der ersten Postings habe ich gar nicht erst berücksichtigt. Stattdessen habe ich mich gleich auf die letzten Varianten "gestürzt". Aber das betrifft
nicht den Text in den Postings. Das habe ich alles gelesen.
Dass du das für die Schule schreiben musst, dass du viele Themen noch gar nicht behandelt hast, ... das interessiert mich in dem Moment nicht. Es ist mir egal, ob du ein Anfänger oder ein Profi bist. Ich hätte bei
jedem das selbe gesagt, der diesen Ansatz vorgelegt hätte:
Es gibt IMHO keine Möglichkeit zur Dekodierung, weil der Ausgangsstring immer identisch ist, unabhängig von der Eingabe:
Quelltext
1: 2: 3: 4: 5:
| Mathias Simmack QWERTZU IOPASDF
Peter Lustig QWERT ZUIOPA |
Du siehst, dass der kodierte Text immer der selbe ist. Das ist eine ganz sachliche Kritik an der Methode! Nicht an dir als Person! Da ich mir die ENIGMA-Beschreibung durchgelesen habe, stelle ich mir die Sache (vereinfacht!) so vor:
Jeder Buchstabe hat ein eigenes Gegenstück. Ich mach´s mir mal wirklich einfach und sage: A entspricht B, B entspricht C, C entspricht D, usw. Klar soweit? Okay, nach dem Tippen wird die Walze um eine Position gedreht. Das heißt, neben dem eigentlich echten Gegenstück käme noch die Walzenposition dazu. Aus dem A wird so meinetwegen ein C, aus dem B ein D, usw. Überträgt man dieses simple System mal auf die beiden o.g. Namen, dann ergibt sich folgendes:
Quelltext
1: 2: 3: 4: 5:
| Mathias Simmack NCWLNGZ ARWXMPY
Peter Lustig QGWIW RBACSR |
Hier hast du zwei unterschiedlich kodierte Texte als Ausgang, und damit hast du logischerweise auch einen Ansatzpunkt für eine Entschlüsselung. Und du kannst auch die o.g. Behauptung schön nachvollziehen, s. mein Name:
Quelltext
1: 2: 3:
| M = N // (Buchstabe + 1) + 0 (Walzenposition) A = C // (Buchstabe + 1) + 1 (Walzenposition) T = W // (Buchstabe + 1) + 2 (Walzenposition) |
usw.
Die Entschlüsselung ist in dem Fall sogar recht simpel. Wir hatten hier bei AUQ.de schon einmal eine monoalfabetische Verschlüsselung (erinnerst du dich, Peter? :wink:); und die selbe Basis ließe sich am PC auch hierbei nutzen. Die Walze würde in meinem Beispiel ja so aussehen:
Quelltext
1:
| BCDEFGHIJKLMNOPQRSTUVWXYZA |
Du suchst also das N und findest es an Position #13. Ist dir die ASCII-Tabelle ein Begriff? Jedes Zeichen wird durch einen ASCII-Wert repräsentiert. Und das Alfabet ist in dieser Tabelle so geordnet, wie du es kennst: A, B, C, usw. Du nimmst also die Position des gefundenen Buchstaben und addierst 64 hinzu.
Das Beispiel N: wie gesagt, es steht an Position 13. 13 + 64 ist 77. Und 77 ist der ASCII-Code des M:
Quelltext
1:
| ShowMessage(CHR(13 + 64)); |
8)
Jetzt käme das C (kodiertes A). C steht an Position #2, würde also eigentlich dem B entsprechen.
Aber wir müssen ja noch die Walzenposition berücksichtigen. Also, Eins weniger = A, ... usw. Du müsstest also am Ende wieder meinen Namen lesen können.
Nun macht das bei meiner o.g. Walze nicht viel Sinn, da die wirklich sehr simpel ist. Aber du könntest ja zum Verschlüsseln auch diesen String nutzen:
Quelltext
1:
| QAYWSXEDCRFVTGBZHNUJMIKOLP |
(Das wäre der Codeschlüssel von der schon erwähnten monoalfabetischen Verschlüsselung, die wir hier schon mal besprochen hatten.)
Das Ergebnis würde anders aussehen (und evtl. schwerer zu deuten sein), aber das Prinzip ist das selbe. Du könntest also jeden Tag eine neue "Walze" (= einen neuen String) benutzen, müsstest am Code selbst nichts weiter ändern. Und das kommt der Original-ENIGMA schon ziemlich nahe, da dort ja auch Tagescodes usw. benutzt wurden.
Das Problem gegenüber der ENIGMA wäre wohl die Sache mit der Walzendrehung an sich. Wenn ich die Doku richtig verstanden habe, dann gab´s dort auch ein Muster. So ist der Buchstabe A beim ersten Mal C, beim zweiten Mal A, beim dritten Mal F, usw. Und nach 26 Durchläufen wäre man wieder beim Anfang (A = C).
Bei meinem Walzen-String ist es eben so, dass die Walzenposition um Eins erhöht wird und damit die Basis für das nächsten Zeichen bildet:
Quelltext
1: 2: 3: 4:
| A = B A = C A = D ... |
bis man nach 26 Durchläufen ebenfalls wieder am Ausgangspunkt angekommen ist. So ein Muster ist natürlich ebenfalls leichter zu durchschauen als Schleifkontakte auf einer Walze. Ich denke aber, dass das für deine schulischen Zwecke keine große Rolle spielen dürfte. Ansonsten müsste man zu jeder Walze noch eine Liste mit Sprungzielen definieren. Etwa:
Quelltext
1: 2:
| const jumps = array[1..26]of byte = (2,0,5,...); |
usw. Anstelle die Variable mit der Position zur Berechnung des Buchstabens heranzuziehen, benutzt du sie um aus der Liste den jeweils nächsten Sprungpunkt herauszulesen. Und
der dient dann zur Ermittlung des nächsten Buchstabens.
Aber du kannst die Entschlüsslung auch noch anderweitig erschweren. Dazu setzt du die Ausgangsposition der Walze einfach hoch. Normalerweise fängst du ja bei Null an. Machen wir´s doch mal mit Position 10. Dann würde Peters Name -kodiert nach meiner Simpelwalze!- so aussehen:
Quelltext
1: 2:
| Peter Lustig AQGSG BLKMCB |
Lässt sich auch nachvollziehen:
Quelltext
1: 2:
| P = A // (Buchstabe + 1) + 10 (Walzenposition) ... |
Gut, was? :wink:
So, damit hast du jetzt eine recht einfache einwalzige ENIGMA als Grundlage für deine Hausaufgaben.
Anhand dieser Theorie müsstest du die Verschlüsselung problemlos hinbekommen. Und wenn du die hast, kriegst du die Dekodierung auch hin und kannst deinen Lehrer richtig verblüffen.
Bin ich nun ein böser Kerl, oder was?
:)
Delete - Sa 02.11.02 18:06
Peter Lustig hat folgendes geschrieben: |
Auch Mathias' Programm kodiert jeden ersten Buchstaben mit Q, egal um welchen Buchstaben es sich handelt. Oder habe ich mich da jetzt verguckt? |
Stimmt. Aber die neue Variante habe ich ja soeben theoretisch gepostet. :D
Christian S. - Sa 02.11.02 18:31
MathiasSimmack hat folgendes geschrieben: |
Meiner Meinung nach ist das blanke Hochsetzen bzw. Verringern der Position innerhalb der Walze weitaus schneller und effizienter als das Umkopieren der Buchstaben. |
Wo Du recht hast, hast Du recht!
MathiasSimmack hat folgendes geschrieben: |
Wir hatten hier bei AUQ.de schon einmal eine monoalfabetische Verschlüsselung (erinnerst du dich, Peter? |
Ja, ich erinnere mich. Irgendwie scheinen in letzter Zeit 'ne Menge Verschlüsselungsverfahren programmiert zu werden. Monoalphabetisch, Enigma und irgendwo habe ich auch schon einen Beitrag über Public-Key gesehen. (Obwohl der Autor von Private-Key sprach, aber das glaube ich ihm nicht. Besonders weil er sehr große Integers braucht.)
MathiasSimmack hat folgendes geschrieben: |
Jetzt käme das C (kodiertes A). C steht an Position #2, würde also eigentlich dem B entsprechen. Aber wir müssen ja noch die Walzenposition berücksichtigen. Also, Eins weniger = A, ... usw. Du müsstest also am Ende wieder meinen Namen lesen können. |
Die Methode finde ich prima!
MathiasSimmack hat folgendes geschrieben: |
Bin ich nun ein böser Kerl, oder was? |
Der Teufel in Person! :wink:
MfG,
Peter
Anonymous - Sa 02.11.02 22:50
Hallo!
:!: Auch ich muss jetzt erst mal einiges richtig stellen! :!:
1. Ich weiss, dass ich überreagiert habe:
D0P3 F!$H hat folgendes geschrieben: |
Ich weiss, dass MathiasSimmack mir helfen wollte bzw. hilft. |
Hätte ich nicht gemerkt, das du mir helfen willst, hätte ich das hier nicht geschrieben:
D0P3 F!$H hat folgendes geschrieben: |
Muss mir mal dein Programm ansehen, ob ich das verstehe uns so. |
2. Aber so wie das hier steht
Zitat: |
Aber jetzt lese ich mir erst mal die Erklärungen zur echten ENIGMA durch, denn -sorry!- in dem Code von D0P3 F!$H sehe ich keinen Ansatz für eine Dekodierung. Insofern ist das für mich bestenfalls eine "Zeichensalatmaschine". |
, hörte sich das für mich so an, als ob mein Programm für dich nur "Müll" wäre, weil ich keine Dekodierung eingebaut hätte bzw. nicht einbauen könnte.
3. Doch zu
Zitat: |
Ich habe euren (deinen und Peters) Ansatz mit der Position ja gelesen. Meiner Meinung nach ist das blanke Hochsetzen bzw. Verringern der Position innerhalb der Walze weitaus schneller und effizienter als das Umkopieren der Buchstaben. |
kann ich nur sagen, dass ich erstmal mit einem sehr einfach gestrickten Programm anfange und dieses dann "entschlacke" - wenn es denn funktioniert. Danach versuche ich es zu verkürzen, indem ich komplizierte Befehle nehme. Beispielsweise wird
PosWalze := PosWalze +1; durch
Inc(PosWalze); ersetzt.
4. Mir ist es schon öfters in deisem Forum passiert, dass ich angemacht wurde, weil ich so einfach gestrickte Programme verwende. Deshalb habe ich auf deinen Kommentar "Zeichensalatmaschine" mit
D0P3 F!$H hat folgendes geschrieben: |
Ich kann das Programmieren nicht so gut wie "richtige" Programmierer |
reagiert, weil ... siehe 2.Punkt.
5. Zu
Zitat: |
D0P3 F!$H hat folgendes geschrieben: | Ich hatte nie vor und habe im Moment auch nicht vor, den Text wieder zu dekodieren (steht auch weiter oben in diesem Topic) | Das habe ich gelesen! Ich hab´s auch verstanden! |
ist zu sagen, dass du
Zitat: |
Aber jetzt lese ich mir erst mal die Erklärungen zur echten ENIGMA durch, denn -sorry!- in dem Code von D0P3 F!$H sehe ich keinen Ansatz für eine Dekodierung. |
besser hättest schreiben können, müssen oder sollen. Dann wäre das alles nicht geschehen.
Aber zu so etwas gehören nun mal zwei Leute:
Du, weil du dich vielleicht nicht so geschickt bzw. nicht richtig ausgedrückt hast, wie du das wolltest oder solltest, damit ich deinen Kommentar richtig verstehe und ihn nicht ihn falschen Hals bekomme (was ja passiert ist!)
UND
Ich, weil ich deinen Kommentar nur einmal gelesen habe und nicht gründlich genug oder gar nicht "zwischen den Zeilen" gelesen habe, um ihn so zu verstehen, wie du das meintest oder meinen wolltest
6. Ich glaube dir ja!
Zitat: |
D0P3 F!$H hat folgendes geschrieben: | ... und dann kommst du und machst es schlecht | Das ist gar nicht wahr! D0P3 F!$H hat folgendes geschrieben: | (wahrscheinlich ohne alles hier geschriebene zu lesen ...)! | Ich habe eine lokale Kopie des Threads gemacht und in aller Ruhe gelesen und versucht, das ganze nachzuvollziehen. Erst danach habe ich gepostet! |
ICH HABE ES VERSTANDEN UND ENTSCHULDIGE MICH BEI DIR!
!!! SORRY @ MathiasSimmack @ SORRY !!!
7. Aber hier
Zitat: |
Nur, und da wirst du mir sicher zustimmen: den zum Teil fehlerhaften Quellcode der ersten Postings habe ich gar nicht erst berücksichtigt. |
muss ich dir wiedersprechen. OK, Der Quellcode ist fehlerhaft, aber wie soll ich ihn den korrekt hinkriegen, wenn ich die Befehle nicht kenne bzw. nicht weiss, wie ich die Befehle benutzen soll? Die Delphi-Hilfe - auch wenn es die deutsche ist - ist
kaum eine Hilfe! Und alles was wir nicht im Unterricht hatten - der Unterricht hat mir bei der Enigma übrigens
nichts gebracht - oder was ich noch aus Turbo Pascal weiss - da ist schon noch einiges, was mir bei diesem Programm geholfen hat (
Danke, Herr Unger, das war das einzig Gute, was ich bei Ihnen
jemals gelernt habe) - muss ich mir
mühsam selbst beibringen oder in diesem Forum erklärt bekommen (An dieser Stelle in
GROSSES DANKE an euch beide) .
8. Wenn ich noch eines zu deinem Programm anmerken dürfte:
#13,#10,#32: cText := cText + Key; ist falsch, denn dadurch bekommt man keinen Zeilensprung. Den bekommt man so:
#13 : cText := cText + #13#10; und nicht so, wie in deinem Programm (BITTE nicht in falschen Hals bekommen).
@ Peter Lustig: Hast du das mit #10 dir angeguckt und verstanden? Mein Vater hat mir das erklärt. Bei einer Schreibmaschine musste man für ein "Enter" erst an den Anfang der momentanen Zeile gehen (#10 = linefeed) und dann in die nächste Zeile springen (#13 = carriage return). Beim Computer geht das durch die Taste "Enter" in einem Schritt, aber im Programm muss es anscheinend mit zwei sein! Alles klar? Ich denke doch schon, oder? :wink:
Nun das war erstmal genug des Redens.
Oder ist noch etwas nicht ausdiskutiert?
Ich denke nun ist alles geklärt und ich kann mich auf deinen letzten Beitrag "stürzen".
Tja, du hast - meiner Meinung nach - das Verschlüsselungsprinzip der Enigma nicht verstanden, obwohl das Beispiel hier RICHTIG ist (Nicht in den falschen Hals bekommen) ! Aber du hast mir mit deinem Statement
Zitat: |
Quelltext 1: 2: 3: 4: 5:
| Mathias Simmack QWERTZU IOPASDF
Peter Lustig QWERT ZUIOPA | Du siehst, dass der kodierte Text immer der selbe ist. |
einen schweren Fehler in meinem (eigentlich deinem, nur etwas umgeschrieben) Programm gezeigt (DANKE!) , obwohl dein Quellcodeauszug hier RICHTIG ist! Den Fehler habe ich natürlich sofort behoben.
Mein Enigma-Programm hat ja nur eine Walze. Aber eine "echte" Eingma mit nur einer Walze - selbst mit Steckbrett, Ring und Reflektor - bringt
überhaupt nichts, da zu leicht zu knacken. Ich will das verdeutlichen:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| Hallo ihr da draussen {Klartext}
Q W E R T Z U I O P A S D F G H J K L Y X C V B N M {Buchstabenanordnung auf der 1.Walze} QNWTEBRHTPZVUDIJORPXATSLDMFZGAHGJOKULCYIXOCWVEBKNSMY {Gesamter Walzenstring} N T B H P V D J R X T L M Z A G O U C I Q W E K S Y {Verknüpfte Buchstaben, z.B.: 'Q' ist mit 'N', 'W' mit 'T' und 'E' mit 'B' verknüpft}
NTBHP VDJ RX TLMZAGOU {Kodierte Nachricht}
Abcde fgh ij klmnopqr {Klartext}
Q W E R T Z U I O P A S D F G H J K L Y X C V B N M {Buchstabenanordnung auf der 1.Walze} QNWTEBRHTPZVUDIJORPXATSLDMFZGAHGJOKULCYIXOCWVEBKNSMY {Gesamter Walzenstring} N T B H P V D J R X T L M Z A G O U C I Q W E K S Y {Verknüpfte Buchstaben, z.B.: 'Q' ist mit 'N', 'W' mit 'T' und 'E' mit 'B' verknüpft}
NTBHP VDJ RX TLMZAGOU {Kodierte Nachricht} |
Du kannst sehen, dass gleich verschlüsselt wird - egal was man eingibt. Aber so funktioniert die Enigma nun mal (deine "selbstgebaute" Enigma verschlüsselt falsch - jedenfalls wenn man das Enigma-Prinzip als richtig ansieht).
Bei mehreren Walzen funktioniert die Enigma so:
Eingegebener Buchstabe -> "Oberster" Buchstabe der 1.Walze ('Q') und sein verknüpfter Partner der 1.Walze ('N') -> Buchstabe, der 2.Walze der parallel (auf gleicher Walzenposition) steht, wird gesucht -> Z.B.: 'F' und sein verknüpfter Partner der 2.Walze ('R') -> Buchstabe, der 3.Walze der parallel (auf gleicher Walzenposition) steht, wird gesucht -> Z.B.: 'A' und sein verknüpfter Partner der 3.Walze ('M') -> Kodierter Buchstabe 'M' 8)
Nach jedem eingegebenen Buchstaben dreht sich die 1. Walze um einen Buchstaben weiter. Nach 26 Eingaben (eine Umdrehung der 1.Walze) dreht sich die 2.Walze um einen Buchstaben weiter. Nach 260 - müsste stimmen - Eingaben (eine Umdrehung der 2.Walze) dreht sich die 3.Walze um einen Buchstaben weiter.
Zur Dekodierung kann ich nichts sagen, weil ich mich damit nicht beschäftigt habe. Aber es kann gut sein, dass dein Verfahren stimmt, wenn es nicht von deiner "selbstgebauten" Enigma abhängig ist - denn die verschlüsselt falsch, wenn man das Enigma-Prinzip als richtig ansieht.
Von
Zitat: |
Die Entschlüsselung ist in dem Fall sogar recht simpel. Wir hatten hier bei AUQ.de schon einmal eine monoalfabetische Verschlüsselung |
komme ich nicht mehr ganz mit (habe auch ehrlich gesagt keine Lust, weil ich ja nicht dekodieren will)
Zitat: |
Bin ich nun ein böser Kerl, oder was? |
Im Moment nicht! Nein, Scherz geh weg ... Ernst kommt näher ...
Ich kann mich ja nochmal entschuldigen.
ES TUT MIR LEID!
(Auch Erdferkel - das bin ich - haben Rechte, oder?)
Hier kommt noch mein Enigma-Programm mit einer Walze. Es funktioniert eigentlich perfekt - wenn ich mir das erlauben darf - bis auf das Hinabscrollen der kodierten Nachricht. *heul*
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 Walze1 : String = 'QNWTEBRHTPZVUDIJORPXATSLDMFZGAHGJOKULCYIXQCWVEBKNSMY';
var Form1 : TForm1; PosWalze1 : Integer = 2; KodierterText : String = '';
implementation {$R *.dfm}
procedure TForm1.KlartextKeyPress(Sender : TObject; var GedrueckteTaste : Char); begin if (GedrueckteTaste in ['a'..'z', 'A'..'Z', #13, #32, #8]) then begin if (GedrueckteTaste in ['a'..'z']) then GedrueckteTaste := UpCase(GedrueckteTaste); case GedrueckteTaste of #8 : if (KodierterText <> '') then begin Delete(KodierterText, Length(KodierterText), 1); if (PosWalze1 = 2) then PosWalze1 := Length(Walze1) else Dec(PosWalze1, 2); end; #13 : KodierterText := KodierterText + #13#10; #32 : KodierterText := KodierterText + GedrueckteTaste; 'A'..'Z' : begin KodierterText := KodierterText + Walze1[PosWalze1]; if (PosWalze1 = Length(Walze1)) then PosWalze1 := 2 else Inc(PosWalze1, 2); end; end; Kodierung.Text := KodierterText; end else GedrueckteTaste := #0; end;
end. |
Delete - So 03.11.02 09:04
D0P3 F!$H hat folgendes geschrieben: |
Ich weiss, dass ich überreagiert habe |
Ja, stimmt. :wink:
Zitat: |
Aber so wie das hier steht ..., hörte sich das für mich so an, als ob mein Programm für dich nur "Müll" wäre, weil ich keine Dekodierung eingebaut hätte bzw. nicht einbauen könnte. |
:roll: Ich habe doch gesagt: das hätte ich zu
jedem gesagt. Wäre Peter gekommen und hätte das Prinzip vorgelegt, hätte
er den Satz zu hören bekommen, weil ich keinen Ansatz für eine Dekodierung gesehen habe. Ich sag´s schon wieder: es ging also gar nicht gegen dich als Person, sondern gegen die Idee der Kodierung. Und -oh Wunder!-
Zitat: |
Aber du hast mir mit deinem Statement einen schweren Fehler in meinem Programm gezeigt. |
Also hast du doch selbst gemerkt, dass da was nicht stimmte. Ich sehe da also nichts, worüber man sich aufregen müsste.
Zitat: |
7. Aber hier Zitat: | Nur, und da wirst du mir sicher zustimmen: den zum Teil fehlerhaften Quellcode der ersten Postings habe ich gar nicht erst berücksichtigt. | muss ich dir wiedersprechen. OK, Der Quellcode ist fehlerhaft, aber wie soll ich ihn den korrekt hinkriegen, wenn ich die Befehle nicht kenne bzw. nicht weiss, wie ich die Befehle benutzen soll? |
Du darfst die Kommentare nicht aus dem Zusammenhang reißen. Ich will damit sagen, dass ich mir den Thread gestern auf die Platte kopiert und mich dann mit dem Thema beschäftigt habe. Zu dem Zeitpunkt gab es bereits Lösungen bzw. Änderungen auf eure (deine und Peters) erste Code-Postings. Wozu hätte ich die also noch nehmen sollen, wenn es aktuellere Codes gab?
Ich weiß jetzt also nicht so richtig, warum du dich von dem Satz nun wieder "angemacht" fühlst? Wäre nicht passiert, wenn du ihn in dem Kontext gelassen hättest, in den er gehört. :)
Zitat: |
Doch zu ... kann ich nur sagen, dass ich erstmal mit einem sehr einfach gestrickten Programm anfange und dieses dann "entschlacke" - wenn es denn funktioniert. Danach versuche ich es zu verkürzen, indem ich komplizierte Befehle nehme. |
Ich habe bereits gestern gesagt, dass nichts dagegen einzuwenden ist und dass du -im Gegensatz zu anderen- ja wenigstens noch selbst denken möchtest.
Zitat: |
Tja, du hast - meiner Meinung nach - das Verschlüsselungsprinzip der Enigma nicht verstanden, obwohl das Beispiel hier RICHTIG ist (Nicht in den falschen Hals bekommen)! |
Ich weiß nicht, was du mit meinem Hals hast ... :wink: ...
Woher hast du die Anordnung der Walzen? Ich habe dazu nämlich nichts gefunden. :cry: Dann hätte ich von Anfang an das richtige Prinzip benutzen können. So musste ich mir (mangels Kenntnis über die Zugehörigkeit der Buchstaben) eben ein eigenes Prinzip ausdenken.
Nicht, dass ich das nicht auch erwähnt hätte, dass es ein selbst ausgedachtes Prinzip ist ... *hi hi* ... Ist ja egal.
So, nun gucke ich mir mal deine Umsetzung der ENIGMA in aller Ruhe an.
< ------------- >
OT: Wenn ich dir einen offenen Rat geben darf - Lies bitte Kommentare, Kritik und dergleichen von einer etwas höheren Warte aus. Will sagen: betrachte sachliche Kritik an einem Programm nicht gleich als Kritik an dir selbst. Zum einen hat jeder mal angefangen, und ich sagte doch: mir persönlich ist es egal, ob du ein Anfänger oder ein Profi bist.
Das Forum ist dazu da, über Lösungen bzw. deren Ansätze zu diskutieren. Wenn ich allerdings nun jeden Satz auf die Goldwaage legen müsste, nur weil du zu schnell und ungerechtfertigt beleidigt reagierst, dann ist es keine Diskussion, die mir Spaß macht, weil ich mich für Sachen rechtfertigen muss, die mir unterstellt wurden, die ich aber überhaupt nicht gemeint habe.
So, jetzt habe ich eine Kritik an den Mods: Das Thema hat eigentlich nur am Rande mit Komponenten zu tun. Eigentlich gehört es deshalb wieder in die ObjektPascal-Sparte. :wink:
Delete - So 03.11.02 11:08
So, jetzt wieder on-topic:
Ich brauche jetzt mal von dir, D0P3 F!$H, eine kurze Beschreibung, wie du auf den kodierten Text gekommen bist:
Quelltext
1: 2:
| Hallo ihr da draussen NTBHP VDJ RX TLMZAGOU |
Wenn ich mir das ansehe, dann handelt es sich beim kodierten Text um die Partnerbuchstaben, die du in der zweiten Zeile angegeben hast:
Quelltext
1: 2:
| Q W E R T Z U I O P A S D F G H J K L Y X C V B N M N T B H P V D J R X T L M Z A G O U C I Q W E K S Y |
Richtig? Wenn ja, dann -glaube ich- liegt genau dort dein Denkfehler. Wenn du den Partnerbuchstaben heranziehst, dann wäre das beim H das G und nicht das N; denn das N gehört zum Q! Du hast nichts weiter gemacht, als der Reihe nach und von Anfang an (!) die Partnerbuchstaben aufzuzählen, und deshalb ergeben bei dir:
Quelltext
1: 2:
| Hallo ihr da draussen Abcde fgh ij klmnopqr |
den selben kodierten Text. Dabei hast du aber nicht die
tatsächlichen Buchstaben berücksichtigt, die eingetippt wurden! Führt man den Gedanken zu Ende, dann kommt man zu dem Schluss: es spielt absolut keine Rolle, was man eingibt, das Ergebnis ist immer der String
Quelltext
1:
| NTBHPVDJRXTLMZAGOUCIQWEKSY |
(mit oder ohne Leerzeichen an verschiedenen Positionen), der sich nach 26 Buchstaben wiederholt. Es gibt deshalb auch keinen Ansatzpunkt für eine Dekodierung. Die Entschlüsselung solcher Nachrichten hätte selbst die Nazis vor eine unlösbare Aufgabe gestellt. Das ist nicht böse gemeint, D0P3 F!$H, also sei nicht sauer deswegen: aber dein Programm arbeitet exakt so, wie ich es eben kurz beschrieben habe.
Ich zeige dir die Sache, wie
ich sie sehe. Aber ich will dafür am Anfang mal die Walzendrehung vernachlässigen! Also, sagen wir einfach mal: die Walze ist kaputt oder hängt fest. Jedenfalls dreht sie sich
nicht mit. Dann ergäbe sich, ausgehend von den o.g. Partnerbuchstaben IMHO die folgende Kodiersequenz:
Quelltext
1: 2: 3: 4: 5:
| Hallo ihr da draussen GTCCR JGH MT MHTDLLBS
Abcde fgh ij klmnopqr TKWMB ZAG JO UCYSRXNH |
(Ich denke, so macht das mehr Sinn.)
So, nun ließe sich diese "kaputte" ENIGMA aber leicht knacken (Häufigkeitsanalyse der Buchstaben, usw.), da es ja zu jedem Buchstaben immer das selbe Gegenstück (den selben Partner gibt). Also kommt noch die Walzendrehung! Das bedeutet aber: du darfst
auf keinen Fall die Originalbuchstaben (Q, W, E, ...) sondern
nur die Partner (N, T, B, ...) um eine Stelle verschieben. Und wenn ich jetzt nicht völlig danebenliege, dann ergibt sich mit meinem Programm folgende Kodierung:
Quelltext
1: 2:
| Hallo ihr da draussen GLQWM MWT QI EAEIYNCG |
Lässt sich ja auch nachweisen. Das H wird -wie schon gesagt!- mit seinem Partner G kodiert.
-klick- Walzendrehung. Das A hätte normalerweise das T zum Partner, durch die eben erfolgte Drehung ist es aber nun das L.
-klick- Das L (aus "Hallo"!) hat normalerweise das C zum Partner, weil sich die Walze aber insgesamt zweimal gedreht hat, ist der neue Partner das Q, usw.
Als Tipp -
Für eine Umsetzung im Programm empfehle ich dir zwei Strings. Einer enthält das Tastaturlayout in der Form QWERTZ, der zweite enthält die dazu passenden Partnerbuchstaben.
Im "KeyPress" des Memos prüfst du nun -wie gehabt!- ob es ein Buchstabe im Bereich von A bis Z ist. Diesen Buchstaben suchst du im Tastaturlayout-String. Die Position entspricht dabei dem Partnerbuchstaben im zweiten String. Allerdings hast du hier dann noch die Walzendrehung zu berücksichtigen.
Das ist machbar, denn "meine" einwalzige ENIGMA kodiert inzwischen. :wink:
Christian S. - So 03.11.02 12:18
So, jetzt bin ich auch wieder da. Mein Rechner brauchte gestern ganz dringend ein neues OS.
Mathias hat folgendes geschrieben: |
Du hast nichts weiter gemacht, als der Reihe nach und von Anfang an (!) die Partnerbuchstaben aufzuzählen,... |
Im Grunde genommen das gleiche wie vorher nur mit den anderen Buchstaben.
Ich glaube auch, das Deine Methode richtig ist. Wenn man sich auf der Internetseite über die Enigma die Walzenkonstruktion ansieht, erkennt man auch, dass es so, wie DOP3 F!$H bisher macht, nicht stimmen kann. Aber auf mich hört ja keiner! :crying:
MfG,
Peter
Delete - So 03.11.02 16:21
Mal unabhängig von Richtig oder Falsch habe ich einen wirklich schwerwiegenden Fehler gefunden. Wenn wir uns einig sind, dass jeder Buchstabe seinen eigenen Partner hat, und dass dieser Partner offensichtlich nur einmal vorkommen darf - was fällt uns hierbei auf:
Quelltext
1: 2: 3: 4:
| const Keyboard : string[26] = 'QWERTZUIOPASDFGHJKLYXCVBNM'; Walze1 : string[26] = 'NTBHPVDJRXTLMZAGOUCIQWEKSY'; ^ ^ |
Es gibt kein F im unteren String, dafür zwei T. Da brauche ich mich ja nicht wundern, dass längere Texte falsch dekodiert werden. Mich würde jetzt interessieren an welche Stelle das F hingehört, dann funktioniert die Routine bei mir problemlos.
Ich habe nämlich ausprobiert:
Quelltext
1: 2:
| JEU CDMUCT RQGTQSN TSUCPOZ ICH HEISSY MATHIAS SIMMACK |
:( Ich habe spaßeshalber das F mal anstelle des ersten T geschrieben, und siehe da:
Quelltext
1:
| JEU CDMUCT RQGFQSN FSUCPOZ |
Da weiß die ENIGMA dann wie ich heiße. :)
Christian S. - So 03.11.02 16:32
Hi!
Naja, so schlimm ist der Fehler nun doch nicht. Wahrscheinlich hat sich DOP3 F!$H nur vertippt. Und an welche Stelle das F kommt, ist eigentlich egal. Der Schlüssel ist ja sowieso austauschbar.
Man könnte doch eigentlich sogar eine Routine schreiben, die einem einen zufällig generierten Schlüssel ausgibt. Ich glaube, eine Thread zur Permutation hatten wir auch schon mal in AUQ. Allerdings muss der Schlüssel natürlich irgendwo abgespeichert werden, sonst könnte das mit der Entschlüsselung etwas knifflig werden.
Obwohl es eigentlich interessant wäre, eine "richtige" Enigma zu programmieren und dann mal zu sehen, wie lange ein heutiger PC braucht, um den Code zu knacken, für den die Engländer immer mehrere Tage brauchten.
MfG,
Peter
Delete - So 03.11.02 19:11
Hm, wenn ich das historische Vorbild nachprogrammieren möchte, dann muss ich die Buchstabenanordnung auf der Walze schon wissen. Ansonsten: ja, so schwerwiegend ist es sicher nicht.
Ich schau mir mal die anderen Links bei dieser Doku an. Mal seh´n, ob man irgendwo eine richtige Aufstellung findet. Möglich, dass durch diese Schleifkontakte auf den Walzen ja vollkommen unterschiedliche Kombinationen für jeden Buchstaben zustande kommen. Evtl. reicht ein Verschieben der Position nicht. Aber das ist doch mal was ... :wink: ... auf jeden Fall besser als der x-te MP3-Renamer.
Obwohl - ein MP3-Renamer mit Wehrmachtsverschlüsselung. :twisted:
Anonymous - So 03.11.02 19:31
Moin! (Ohhh ... 17.00 Uhr ... da habe ich wohl zu lange durchgemacht :beer: )
Um dieser Diskussion ein Ende zu machen:
Ich weiss, dass es mein Fehler war und
entschuldige mich dafür bei dir, MathiasSimmack!
Entschuldigung angenommen? Sag
bitte JA! :cry:
Aber ich habe auch
nur so reagiert, weil ich in diesem Forum schon öfters wegen meiner einfachen Programmstruktur "angemacht" wurde - wie oben schon erwähnt. (Ich kann es einfach nicht lassen, was? :oops: ) *schämt sich ganz dolle*
<-----
THE END ----->
So ... jetzt zu deinem letzten Posting.
MathiasSimmack hat folgendes geschrieben: |
Ich zeige dir die Sache, wie ich sie sehe. |
Peter Lustig hat folgendes geschrieben: |
Ich glaube auch, das Deine Methode richtig ist. Wenn man sich auf der Internetseite über die Enigma die Walzenkonstruktion ansieht, erkennt man auch, dass es so, wie DOP3 F!$H bisher macht, nicht stimmen kann. |
:crying: Als ich diese Statements gelesen habe wollte ich nicht glauben, dass
ihr beide das Prinzip nicht verstehen wolltet.
Also habe ich nochmal auf der Enigma-Seite nachgeguckt ... und siehe da
ihr habt Recht !
Jetzt habe ich das auch begiffen. (Hoffe ich jedenfalls, bis ich von euch eines besseren belehrt werde :D )
MathiasSammack hat folgendes geschrieben: |
Ich brauche jetzt mal von dir, D0P3 F!$H, eine kurze Beschreibung, wie du auf den kodierten Text gekommen bist: |
Weil ich das Prinzip jetzt verstanden zu haben glaube, lasse ich mal die Beschreibung, okay? :wink:
Ob
deine Eingma richtig funktioniert weiss ich nicht, weil ich ihre Funktionsweise nicht verstanden habe. (Auch nach mehrmaligem Lesen und ausgiebigem Studieren stellte sich leider kein Erfolg ein) :wink:
Aber ich habe natürlich keine Kosten und Mühen gescheut, um
meine Enigma auf den richtigen Stand zu bringen und anderweitig zu verbessern. *Hühnerbrust schwillt ganz dolle an* 8)
<-----
THE END ----->
>>> VERBESSERUNGEN AN MEINER ENIGMA <<<
1. Ich habe die Enigma auf die richtige Verschlüsselung umgestellt. (Obwohl mein Lehrer das wahrscheinlich eh nicht bemerken würde bzw. er hat gesagt, dass ich einfach nur ein Verschlüsselungsprogramm bauen solle)
2.
MathiasSammack hat folgendes geschrieben: |
Als Tipp -
Für eine Umsetzung im Programm empfehle ich dir zwei Strings. Einer enthält das Tastaturlayout in der Form QWERTZ, der zweite enthält die dazu passenden Partnerbuchstaben. |
Ich habe es bei einem String belassen. Das geht auch und ist meiner Meinung nach dadurch nicht komplizierter geworden (Ich werde in diesem Glauben weiterleben bis ihr mein Programm "zerplfückt" habt)
3. Ich habe einige Fehler behoben, die noch im Programm waren, wenn die 'Löschen'-Taste gedrückt wurde. Ihr könnt ruhig zugeben, dass ihr diese Fehler drin gelassen habt, um mich zu prüfen? Ich weiss das! *stolziert herum und lacht ganz dolle dreckig* 8)
<-----
THE END ----->
@ Peter Lustig
Hast du das jetzt mit #13#10 verstanden? (Erklärung weiter oben)
Wie kann ich hier mein Programm zum Download hinstellen? Dann könntet ihr euch die Verschlüsselung mal ansehen.
Aber ich poste zur Sicherheit meinen Quellcode hier hin, damit ihr nicht zu heulen anfangt, weil ihr nichts zum Amüsieren habt! :twisted:
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:
| const Walze1 : String = 'ABCDEFGHIJKLMNOPQRSTUVWXYZQWERTZUIOPASDFGHJKLYXCVBNM';
var Form1 : TForm1; DrehungenWalze1 : Integer = 0; PositionWalze1 : Integer = 1; KodierterText : String = '';
implementation {$R *.dfm}
procedure TForm1.KlartextKeyPress(Sender : TObject; var GedrueckteTaste : Char); begin if (GedrueckteTaste in ['a'..'z', 'A'..'Z', #8, #13, #32]) then begin if (GedrueckteTaste in ['a'..'z']) then GedrueckteTaste := UpCase(GedrueckteTaste); { Ist die gedrückte Taste 'a'..'z', wird sie zum entsprechenden Großbuchstaben } { #129ü #132ä #142Ä #148ö #153Ö #154Ü } case GedrueckteTaste of #8 : if not (KodierterText = '') then begin case KodierterText[Length(KodierterText)] of #10 : Delete(KodierterText, Length(KodierterText) - 1, 2); { Ist das letzte Zeichen im kodierten Text #10 (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 } '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 := 25 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; 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 } 'A'..'Z' : begin PositionWalze1 := (Ord(GedrueckteTaste) - 64) + DrehungenWalze1; { Der 'oberste' Buchstabe der Walze ergibt sich aus der Buchstabenposition im Alphabet + der Anzahl der Walzendrehnungen } if (PositionWalze1 > 26) then Dec(PositionWalze1, 26); { Ist der 'oberste' Buchstabenwert der Walze größer als eine Walzenumdrehung, wird eine Walzenumdrehung abgezogen } KodierterText := KodierterText + Walze1[26 + PositionWalze1]; { Der kodierte Text wird um den Buchstaben erweitert, mit dem der 'oberste' Buchstabe der Walze verknüpft ist } if (DrehungenWalze1 = 25) then DrehungenWalze1 := 0 else Inc(DrehungenWalze1); { Ist die Walze in der letzten Position, fängt sie wieder in der 1. Position an; ansonsten dreht sie sich eine Position weiter } end; 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 im Bild ist } end;
end else GedrueckteTaste := #0; { Ist die gedrückte Taste nicht 'a'..'z', 'A'..'Z', 'Enter', 'Leerstaste' oder 'Löschen', wird sie nicht angezeigt } end;
end. |
P.S.: Ich habe auch probiert die Buchstaben 'ä', 'Ä', 'ö', 'Ö', 'ü', 'Ü' einzubinden. Dies sollte aber so geschehen:
'ä', 'Ä' : Im Eingabefeld werden 'AE' geschrieben und beide Buchstaben werden verschlüsselt
'ö', 'Ö' : Im Eingabefeld werden 'OE' geschrieben und beide Buchstaben werden verschlüsselt
'ü', 'Ü' : Im Eingabefeld werden 'UE' geschrieben und beide Buchstaben werden verschlüsselt
Doch das habe ich nicht hinbekommen, weil ja
Quelltext
1:
| procedure TForm1.KlartextKeyPress(Sender : TObject; var GedrueckteTaste : Char); |
GedrückteTaste ein Char ist und kein String. Dadurch wird das Verschlüsseln von 'ä', 'Ä', 'ö', 'Ö', 'ü', 'Ü' ziemlich kompliziert. Habe ich Recht? :wink:
Christian S. - So 03.11.02 19:31
Mathias hat folgendes geschrieben: |
Hm, wenn ich das historische Vorbild nachprogrammieren möchte, dann muss ich die Buchstabenanordnung auf der Walze schon wissen. |
Achja, es wurde ja nicht die Kombination geändert, sondern die Walzenstellung. :oops: Ansonsten wäre dieser gesamte Thread ziemlich sinnlos.
Mathias hat folgendes geschrieben: |
Obwohl - ein MP3-Renamer mit Wehrmachtsverschlüsselung. |
:mrgreen: :mrgreen: :mrgreen: :mrgreen: (Habe in Java mal den RSA-Algorithmus nachprogrammiert. Soll ich den für Delphi umbauen? Wäre doch auch ganz nett!)
Christian S. - So 03.11.02 20:26
Hi!
Also erstmal vorweg, damit das geklärt ist: ja, das mit #13#10 habe ich verstanden.
So, nun zu Deinem Programm: Ich habe mir den Code noch nicht im Detail angeschaut, aber bisher sieht es so aus, als hättest Du Deine kleine Privatenigma fertig. Fehlt nur noch eine MP3-Sammlung, die Du damit bedrohen kannst. :lol:
Aber wie gesagt, ich habe mir das Programm noch nicht im Detail angeschaut.
MfG,
Peter
Anonymous - So 03.11.02 21:05
Zitat: |
Also erstmal vorweg, damit das geklärt ist: ja, das mit #13#10 habe ich verstanden. |
:D Freut mich! (wurde aber auch mal langsam Zeit!) :D
Zitat: |
Ich habe mir den Code noch nicht im Detail angeschaut, aber bisher sieht es so aus, als hättest Du Deine kleine Privatenigma fertig |
Nehmen wir mal an, dass der Quellcode in Ordnung sei. Dann kommt nun bald die 2. Walze ... UND viel viel später vielleicht eventuell mal schauen ... die 3. Walze
Ich habe mal wieder ein paar Fragen:
1. Wie kann ich hier ins Forum Datein uploaden?
2. Wie kann ich eine 'GroupBox' durchsichtig machen? Ich will nämlich die 'GroupBox' als "Rahmen" um jedes Memofeld machen. Aber wenn ich eine 'GroupBox' erstelle und das Programm starte, dann verdeckt sie das Memofeld.
Christian S. - So 03.11.02 21:56
DOP3 F!$H hat folgendes geschrieben: |
Freut mich! (wurde aber auch mal langsam Zeit!) |
:schmoll:
DOP§ FI!$H hat folgendes geschrieben: |
Dann kommt nun bald die 2. Walze ... UND viel viel später vielleicht eventuell mal schauen ... die 3. Walze |
Das ist doch jetzt aber kein Problem mehr. Wenn Du die Walzenstrings und die Walzendrehungen etc. in einem Array speicherst, kannst Du problemlos so viele Walzen einbauen wie Du willst. Du baust die Verschlüsselung einfach in eine Schleife.
DOP3 F!$H hat folgendes geschrieben: |
Wie kann ich hier ins Forum Datein uploaden? |
Geht, glaube ich, nicht. Du musst die Daten auf einen anderen Server laden und kannst dann die URL angeben.
Groupbox: du markierst die Groupbox und benutzt dann im Edit-Menü den Befehl "Send to Back". Das sollte helfen.
MfG,
Peter
Anonymous - So 03.11.02 22:00
Ich habe da noch ein paar Fragen!
1. Gibt es eine Möglichkeit quasi Images in ein z.B. Array zu packen?
2. Kann man irgendwie Label setzen, um z.B. mit einem Button das Programm neu zu starten (falls es dafür nicht einen ähnlichen Befehl gibt wie 'Close();') ?
Christian S. - So 03.11.02 22:57
Hi!
Images: es gab in AUQ schon 'ne Menge Threads, in denen beschrieben wird, wir man Komponenten in Arrays verwaltet. Das geht bestimmt auch mit TImage.
Zu dem Problem mit dem Neustarten des Programmes fällt mir im Moment nichts ein. Ich werde mal drüber nachdenken und vielleicht hat ja auch Mathias eine Idee.
MfG,
Peter
Tino - Mo 04.11.02 10:02
D0P3 F!$H hat folgendes geschrieben: |
Ich habe da noch ein paar Fragen! |
Stelle bitte neue Fragen die nicht zum Thema passen in ein neues Topic in der richtigen Sparte!
Gruß
TINO
Delete - Mo 04.11.02 10:45
D0P3 F!$H hat folgendes geschrieben: |
Wie kann ich hier mein Programm zum Download hinstellen? |
Siehe Sparten "Open Source" bzw. "Freeware" (wenn du den Quellcode lieber für dich behalten willst :twisted:). Aber wie Peter schon schrieb: du brauchst eigenen Webspace.
Zitat: |
Ich habe die Enigma auf die richtige Verschlüsselung umgestellt |
"Richtig" im Sinne von was? Wenn du meinst, dass das Programm nun wirklich die Buchstaben verschlüsselt, die man eintippt - dann stimmt es. Aber
die ENIGMA dürfte nach einem anderen Prinzip arbeiten. Ich habe insgesamt 8 Rotoreinstellungen gefunden, von denen einer diese Zusammensetzung hatte:
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.
Zitat: |
Ich habe es bei einem String belassen. Das geht auch und ist meiner Meinung nach dadurch nicht komplizierter geworden |
Nein, komplizierter ist es nicht. Aber du brauchst die ersten 26 Buchstaben nie, weil du die Position ohnehin um 26 erhöhst. Insofern könnte man die Walze auch auf die absolut notwendigen Zeichen kürzen.
Dann kannst du ein bisschen effizienter arbeiten, indem du die "UpCase"-Anweisung generell in die Form-Prozedur schreibst:
Quelltext
1: 2: 3: 4: 5: 6:
| procedure TForm1.KlartextKeyPress(Sender: TObject; var GedrueckteTaste: Char); begin GedrueckteTaste := UpCase(GedrueckteTaste);
{ ... } end; |
Schau mal in die Hilfe! Wenn das Zeichen nicht im Bereich von "a" bis "z" ist, wird es sowieso nicht konvertiert. Es betrifft also wirklich nur die Kleinbuchstaben, und du hast eine if-Abfrage gespart.
Aber egal. Wichtig ist, dass du nun eine funktionierende Verschlüsselung hast. Im Vergleich zu deiner ersten "Zeichensalatmaschine" ein echter Fortschritt ... :wink:
Delete - Mo 04.11.02 15:35
D0P3 F!$H hat folgendes geschrieben: |
Aber ich poste zur Sicherheit meinen Quellcode hier hin ... |
Ich habe mal deinen Code verkürzt. Ging leider nicht eher; man kann ja nicht nur am Computer sitzen ... Du sagtest ja: du fängst immer einfach an -was ich sehr gut verstehe!- und dann arbeitest du dich zu schwereren Sachen vor. Also, hier hast du eine zweite Variante des relevanten Codes:
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:
| const Walze1 : array[0..25]of char = ('Q','W','E','R','T','Z','U','I','O','P','A','S','D', 'F','G','H','J','K','L','Y','X','C','V','B','N','M'); var DrehungenWalze1 : integer = 0; KodierterText : string = '';
procedure TForm1.KlartextKeyPress(Sender: TObject; var Key: Char); var PositionWalze1 : integer; begin Key := UpCase(Key);
case Key of 'A'..'Z': begin PositionWalze1 := ((ORD(Key) - 65) + DrehungenWalze1) mod 26; KodierterText := KodierterText + Walze1[PositionWalze1]; DrehungenWalze1 := (DrehungenWalze1 + 1) mod 26; end; { ... } else Key := #0; end;
{ ... } end; |
Die Kommentare habe ich mal weggelassen. Auf die Geschichte mit
mod bin ich durch ein anderes Beispiel gekommen. Will sagen:
Quelltext
1:
| DrehungenWalze1 := (DrehungenWalze1 + 1) mod 26; |
entspricht deiner Version
Quelltext
1: 2:
| if(DrehungenWalze1 = 25) then DrehungenWalze1 := 0 else inc(DrehungenWalze1); |
dürfte aber ebenfalls wieder effizienter sein, weil die if-Abfrage wegfällt. Damit ich die gleiche Vereinfachung auch bei der Position nutzen konnte, habe ich aus dem Walzen-String ein Char-Array gemacht, das bei Null anfängt. Dadurch habe ich diese Zeilen
Quelltext
1: 2:
| PositionWalze1 := (Ord(GedrueckteTaste) - 64) + DrehungenWalze1; if (PositionWalze1 > 26) then Dec(PositionWalze1, 26); |
einsparen können. Das Ergebnis bleibt aber das selbe.
<PS>
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 ...
Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| ZCHZBFXX SFDMHCWC(LN: XQXD): NTNJ; CWY KPANSW : AOTJ; GLCNT UNMFQJ := ((FFL(RP,MTJZS1) - 1) - SQGLUQXYRFLTYM1 + 26) OSW 26; JTYVGB := (IFN(VGHRJU + HFPC('L'))); VSMRKSZTGNRHTA1 := (AMFKZMYLEDKRLN1 + 1) IAQ 26; EDR; |
:wink:
Sonderzeichen bleiben unverändert!
</PS>
So, jetzt zu "meiner" ENIGMA. Die Rotoren und den Reflektor habe ich bereits nach Delphi umgesetzt. War relativ einfach (weil ich ja eine Vorlage hatte), und da zeigt sich dann bereits der Vorteil der Kodierung. Du gibst den Klartext ein, etwa
und erhältst z.B. den Code
Das Ergebnis ist natürlich abhängig von der Einstellung der ENIGMA. Startest du das Programm mit der gleichen Konfiguration neu und gibst dann den kodierten Text ein, erhältst du wieder den Klartext, ohne dass du eine separate Dekodierfunktion brauchst.
Im Augenblick kann man leider noch nichts an den Einstellungen ändern, d.h. die Kodierung erfolgt immer nach dem selben Schema. Walzenwechsel usw. kommen aber noch, sofern ich Zeit finde und Lust habe ...
Anonymous - Mo 04.11.02 21:20
Hi!
Tino hat folgendes geschrieben: |
Stelle bitte neue Fragen die nicht zum Thema passen in ein neues Topic in der richtigen Sparte! |
Ich mache dann mal einen neuen Thread (oder ein neues Topic ... falls 'Thread' der falsche Begriff ist :wink: )
Ihr werdet ihn schon finden, oder nicht ? :P
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!