[Delphi] Caesar Verschlüsslung Delphi
spacer
Autor Nachricht
gameit
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Do 02.02.12 14:49 
Verwendete Sprache: Delphi
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 markieren
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)- 25; end;
if s[i]='z' then begin k:=k+25; end
else if s[i]='y' then begin k:=k+24; end
else if s[i]='x' then begin k:=k+23; end
else if s[i]='w' then begin k:=k+22; end
else if s[i]='v' then begin k:=k+21; end
else if s[i]='u' then begin k:=k+20; end
else if s[i]='t' then begin k:=k+19; end
else if s[i]='s' then begin k:=k+18; end
else if s[i]='r' then begin k:=k+17; end
else if s[i]='q' then begin k:=k+16; end
else if s[i]='p' then begin k:=k+15; end
else if s[i]='o' then begin k:=k+14; end
else if s[i]='n' then begin k:=k+13; end
else if s[i]='m' then begin k:=k+12; end
else if s[i]='l' then begin k:=k+11; end
else if s[i]='k' then begin k:=k+10; end
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)- 25; end;

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.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.


Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.
Mathematiker
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 43
Erhaltene Danke: 5

Win Vista, Win 7
Delphi 5
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 markieren
1:
2:
3:
4:
5:
6:
7:
8:
9:
  // Verschlüsselung
n := ord (klar[i]);
n := 97 + (n + v - 97) mod 26;
geheim[i] := chr (n);

// Entschlüsselung
n := ord (geheim[i]);
n := 97 + (n - v - 97 + 26) mod 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
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
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...
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Mathematiker
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 43
Erhaltene Danke: 5

Win Vista, Win 7
Delphi 5
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 markieren
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
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Dude566
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1483
Erhaltene Danke: 72

W7, Vista, XP, Ubuntu
Delphi XE2 Pro, Turbo Delphi, Java/Eclipse, Notepad++
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.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
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 ;)
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
home home