Entwickler-Ecke
Algorithmen, Optimierung und Assembler - Caesar Verschlüsslung Delphi
gameit - Do 02.02.12 14:49
Titel: Caesar Verschlüsslung 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 (; )
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 public 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. |
Mathematiker - 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:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| n := ord (klar[i]); n := 97 + (n + v - 97) mod 26; geheim[i] := chr (n);
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
gameit - 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 - 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.
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
gameit - 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 ;)
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!