Autor Beitrag
Tino
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: 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
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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:
ausblenden Quelltext
1:
2:
abcdefghijklmnopqrstuvwxyz
EKMFLGDQVZNTOWYHXUSPAIBRCJ

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

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

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:
ausblenden 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:
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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:
ausblenden 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:
ausblenden Quelltext
1:
DrehungenWalze1 := (DrehungenWalze1 + 1) mod 26;					

entspricht deiner Version
ausblenden 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
ausblenden 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 ...
ausblenden 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
ausblenden Quelltext
1:
MATHIASSIMMACK					

und erhältst z.B. den Code
ausblenden Quelltext
1:
EHGTPYBLGYFZAV					

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 ...
D0P3 F!$H
Gast
Erhaltene Danke: 1



BeitragVerfasst: 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