Autor Beitrag
gameit
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Do 02.02.12 14:49 
Hey,
ich bin momentan dabei eine Caesar Verschlüsselung in Delphi7 zu schreiben, das klappt eigentlich auch ganz gut
ich habe aber irgendwo einen Denkfehler den ich einfach nicht finden kann also möchte ich euch bitten ob ihr vielleicht
einmal über meinen Quelltext gucken könntet. Für eventuelle Optimierungen bin ich natürlich immer offen...
Vielen Dank schonmal (sry für die länge (; )
ausblenden volle Höhe Delphi-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:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
unit Caesar;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Button1: TButton;
    procedure verschluesseln;
    procedure Button1Click(Sender: TObject);
    procedure edit2keypress(Sender: TObject; var Key: Char);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  k: integer;
  s:string;
  t:string;
  x:char;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
s:=Form1.Edit1.Text;
t:=form1.edit3.text;
  for i:=1 to Length(edit1.Text) do
    begin
      k:= strtoint(edit2.Text);
      if k>25 then begin k:= strtoint(edit2.Text)- 25end;
      if s[i]='z' then begin k:=k+25end
      else if s[i]='y' then begin k:=k+24end
      else if s[i]='x' then begin k:=k+23end
      else if s[i]='w' then begin k:=k+22end
      else if s[i]='v' then begin k:=k+21end
      else if s[i]='u' then begin k:=k+20end
      else if s[i]='t' then begin k:=k+19end
      else if s[i]='s' then begin k:=k+18end
      else if s[i]='r' then begin k:=k+17end
      else if s[i]='q' then begin k:=k+16end
      else if s[i]='p' then begin k:=k+15end
      else if s[i]='o' then begin k:=k+14end
      else if s[i]='n' then begin k:=k+13end
      else if s[i]='m' then begin k:=k+12end
      else if s[i]='l' then begin k:=k+11end
      else if s[i]='k' then begin k:=k+10end
      else if s[i]='j' then begin k:=k+9;  end
      else if s[i]='i' then begin k:=k+8;  end
      else if s[i]='h' then begin k:=k+7;  end
      else if s[i]='g' then begin k:=k+6;  end
      else if s[i]='f' then begin k:=k+5;  end
      else if s[i]='e' then begin k:=k+4;  end
      else if s[i]='d' then begin k:=k+3;  end
      else if s[i]='c' then begin k:=k+2;  end
      else if s[i]='b' then begin k:=k+1;  end
      else if s[i]='a' then begin end
      else if s[i]=' ' then begin t[i]:=' '; break; end;
      verschluesseln;
      t[i]:=x;
    end;
Form1.Edit3.Text:=t;
end;


procedure tform1.verschluesseln;
begin

          while k>25 do begin k:= strtoint(edit2.Text)- 25end;

          if k=0 then begin x:='a'end
          else if k=1 then begin x:='b'end
          else if k=2 then begin x:='c'end
          else if k=3 then begin x:='d'end
          else if k=4 then begin x:='e'end
          else if k=5 then begin x:='f'end
          else if k=6 then begin x:='g'end
          else if k=7 then begin x:='h'end
          else if k=8 then begin x:='i'end
          else if k=9 then begin x:='j'end
          else if k=10 then begin x:='k'end
          else if k=11 then begin x:='l'end
          else if k=12 then begin x:='m'end
          else if k=13 then begin x:='n'end
          else if k=14 then begin x:='o'end
          else if k=15 then begin x:='p'end
          else if k=16 then begin x:='q'end
          else if k=17 then begin x:='r'end
          else if k=18 then begin x:='s'end
          else if k=19 then begin x:='t'end
          else if k=20 then begin x:='u'end
          else if k=21 then begin x:='v'end
          else if k=22 then begin x:='w'end
          else if k=23 then begin x:='x'end
          else if k=24 then begin x:='y'end
          else if k=25 then begin x:='z'end;
end;

procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);
begin
  if not (Key in ['0'..'9', Char(VK_BACK)]) then
    Key := #0;
end;


end.
Mathematiker
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1447

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: Do 02.02.12 16:09 
Dein Algorithmus ist ziemlich umständlich und mit den vielen, vielen Tests schlecht nachvollziehbar.
Schneller und einfacher geht es, wenn Du die Funktionen ord und chr für die Umwandlung in ASCII-Code und zurück nutzt.
Befindet sich der Klartext im String klar und soll der Geheimtext in den string geheim sowie die Verschiebungsweite in v (integer), so kann ein einzelner Buchstabe wie folgt verändert werden:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
  // Verschlüsselung
  n := ord (klar[i]);
  n := 97 + (n + v - 97mod 26;
  geheim[i] := chr (n);

  // Entschlüsselung
  n := ord (geheim[i]);
  n := 97 + (n - v - 97 + 26mod 26;
  klar[i] := chr (n);

Der Algorithmus funktioniert hier für Kleinbuchstaben und kann auch auf andere Bereiche angepasst werden.
Der scheinbare "Trick" beruht darin, dass mittels mod 26 die Zahl n immer im Bereich von 'a' bis 'z' gehalten wird.

Beste Grüße
Mathematiker
gameit Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Do 02.02.12 20:37 
ja ja das is schon wohl alles logisch hab auch schon n caesar verschlüssler mit chr und ord und mod usw wollte aber eigendlich mal ohne das arbeiten sozusagen ganz trivial...
Mathematiker
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1447

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: Do 02.02.12 21:22 
Hallo gameit,
Zitat:
ja ja das is schon wohl alles logisch

Sorry, das ist nicht "wohl logisch", das ist voll logisch!
Zitat:
wollte aber eigendlich mal ohne das arbeiten sozusagen ganz trivial...

Nun gut, das kannst Du schon machen. Aber dann nutze wenigstens case statt der vielen Tests, z.B.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
   case s[i] of
      'z' : k:=k+25;
      'y' : k:=k+24;
   ...
      'b' : k:=k+1;
      'a' : ;
      ' ' : t[i]:=' ';
   end;

Nun zum Algorithmus.
Ich vermute s enthält den Klartext und t den Geheimtext. Warum liest Du dann aber t ein, es soll doch erst konstruiert werden?
Sollte aber t am Anfang nicht die gleiche Länge wie s haben, gibt es Probleme, da Du mit t[i] nur vorhandene(!) Zeichen ändern kannst. Ein evtl. leerer String t bleibt leer!

Beste Grüße
Mathematiker
Dude566
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: Do 02.02.12 21:36 
Vielleicht ist ja das hilfreich: delphi-treff.de/tipp...ngen/caesar-chiffre/

_________________
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
gameit Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Mo 06.02.12 17:08 
mhh... danke erstmal für die hilfe und für den tipp mit dem case..of den befehl kannte ich noch nicht ;D
dann zu der frage warum ich t einlese... ich denke damit meinst du die zeile "t:=form1.edit3.text;" oder?
das mache ich damit ich nachher sagen kann "t[i]:=x;"
danke nochmal ;)