Entwickler-Ecke

Sonstiges (Delphi) - Rückwärtsgang für meine Verwürfelung


JayEff - Sa 23.10.04 16:16
Titel: Rückwärtsgang für meine Verwürfelung
hi leute.

Ich hab einen Verwürfelungsalgo geschrieben, der sieht SO aus:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
function keychar(s:string) : char; //Diese Funktion liefert den Schlüssel "s" Buchstabe für Buchstabe
begin
Inc(keyint);
KeyChar:=s[keyint];
If Keyint=Length(s) then Keyint:=0;
end;
procedure TForm4.Button1Click(Sender: TObject);
var
  i,x:integer;
begin
memo2.Text:='';
for i:=1 to 26 do az[i]:='';
keyint:=0;
for i:=1 to length(Memo1.Text) do
begin
x:=ord(keychar(Edit1.Text))-96;
az[x]:=az[x]+Memo1.Text[i];
end;
for i:=1 to 26 do Memo2.Text:=Memo2.Text+az[i]+char(byte(13))+char(byte(10));
end;


Ich ordne also jeden Klartext buchstaben in ein teil des a bis z - arrays.
Mein rückwärtsgang ist dieser:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure TForm4.Button2Click(Sender: TObject);
var
  i,x,y:integer;
begin
for i:=1 to 26 do az[i]:='';
keyint:=0;
memo1.text:='';
for i:=1 to 26 do az[i]:=memo2.Lines[i-1];
for i:=0 to 25 do y:=y+length(Memo2.Lines[i]);
for i:=0 to y do
begin
  x:=ord(keychar(Edit1.Text))-96;
  if az[i]<>'' then Memo1.Text:=Memo1.Text+az[x][1];
  az[i] := AnsiRightStr(az[i], length(az[i]) - 1);
end;

end;

Aber das klappt nicht. -.-
irgentwo muss wohl ein fehler sein, oder ich packe das problem falsch an... naja vielleciht könnt ihr mir ja helfen. Hier ein verschlüsselter text:
Zitat:

treu.do.

ekhehsr
Ai üengedb.
stes xsi ehsbm.s t kefeerr.rgilbaam eelsmi

e ggrzw
ieod l c.
l etlesnijhr caeegp

migs
dnncnvfe s
ntwcfresetu
hent iai uetui
n i


t ctssdi sinba siems
oghhchtlcnnwüt i eel
ui iuish iine nt iap
alhtareuadhvs
r i
cel a
res
do


beim zurück verschlüsseln wird daraus:

Zitat:
Alsolotlhtruit unt etnn

und danach eine schöne zugriffsverletzung.

aber es sollte so aussehen:
Zitat:
Also gut hier ist ein text den du wahrscheinlich nicht entschlüsset bekommst. dashier ist eigentlich ja keine chiffrierung sondern eine verwürfelung. aber egal. ich glaube dass das trotzdem ein gutes beispiel ist. wie acuh immer. viel spass.


Danke für eure Hilfe!


sourcehunter - Sa 23.10.04 21:20

Warscheinlich reicht es schon in TForm1.Button2Click y mit 0 zu initialisieren. Ansonst wäre es sehr hilfreich, wenn du die funktionsweise deines Algorithmusses erläutern würdest.


JayEff - Sa 23.10.04 21:36

da y ein integer ist, wird sie von delphi automatisch mit 0 initialisiert. ausser String und Integer werden alle anderen Variablen zufallsgeneriert, aber diese beiden sind '' und 0. ich werden den Code mal kommentieren und neu posten.


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:
procedure TForm4.Button1Click(Sender: TObject);
var
  i,x:integer;
begin
memo2.Text:=''//zur sicherheit, wenn das prog 2 mal ausgeführt wird
for i:=1 to 26 do az[i]:=''//az leeren (ist ein array, der für jeden buchstaben (a bis z) ein elment hat)
keyint:=0//nötig für keychar(schlüssel);
for i:=1 to length(Memo1.Text) do
begin
x:=ord(keychar(Edit1.Text))-96;   //der schlüssel soll nur aus kleinbuchstaben bestehen, desshalb diese zahl. dadurch wird a=1, b=2 und so weiter
az[x]:=az[x]+Memo1.Text[i];  //fügen wir den klaartextbuchstaben dem dem schlüsselbuchstaben entsprechenden element in az zu
end;
for i:=1 to 26 do Memo2.Text:=Memo2.Text+az[i]+char(byte(13))+char(byte(10)); //das ausgabefeld bekommt jedes element von az in alphabethischer reihenfolge dazu; danach eine entertaste(wusste nicht wie ich das sonst hinbekomm... achja.. lines.add -.-
end;

procedure TForm4.Button2Click(Sender: TObject);
var
  i,x,y:integer;
begin
for i:=1 to 26 do az[i]:='';  //az wieder leeren
keyint:=0;                    // s.o.
memo1.text:='';               // s.o.
for i:=1 to 26 do az[i]:=memo2.Lines[i-1]; //az füllen
for i:=0 to 25 do y:=y+length(Memo2.Lines[i]); //alle zeichen von memo2 adieren, ohne leerzeilen (#13 #10 sind 2 zeichen -.-)
for i:=0 to y do
begin
  x:=ord(keychar(Edit1.Text))-96//s.o.
  if az[i]<>'' then Memo1.Text:=Memo1.Text+az[x][1]; //erster buchstabe von az[i] zum ausgabefeld hinzufügen
  az[i] := AnsiRightStr(az[i], length(az[i]) - 1);   //ersten buchstaben von az[i] löschen
end;

vielleciht ists jetzt ersichtilcher?
bitte helft mir o.O ichnixblick :(


sourcehunter - So 24.10.04 13:16

Ich glaube der Fehler liegt in Zeile 25, aber ich kann dir nicht sagen, wie es richtig aussehen muss. Das char(byte(13)) kannst du durch #13 ersetzen und das andere durch #10.


uall@ogc - So 24.10.04 13:52

ahhhh augenkrebs!

verschachtel erstmal deine funktionen richtig sonst guckt sich das eh keiner an :>


JayEff - Mi 27.10.04 22:58

öhm.. das dachte ich mir, mit dem #13 #10 aber ich war mir ned sicher drum wollt ichs ned drauf ankommen lassen -.-
was meinst du mit der fehler ist da? warum? wo ist da ein fehler? in der for-schleife? um was handelt es sich?

--- danke dass es sich trotzdem einer angeguckt hat :)


sourcehunter - Do 28.10.04 11:45

Das ist ja das Problem ich weiß es eben auch nicht richtig. Das liegt aber größtenteils an deiner Form und auch daran, dass ich noch keine Zeit hatte mir das genauer anzugucken. Deshalb habe ich ja gefragt, wie der Algorithmus funktionieren sollte. Am Besten wäre es, wenn du auch ein kürzeres Beispiel in Einzelschritten posten könntest. Mal sehen vielleicht kann ich am Wochenende mal etwas genauer hingucken.


JayEff - Do 28.10.04 15:23

verwürfelung:

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:
hallohallohallohalloh
dies ist der klartext
=>jedem schlüsselbuchstaben(hallo) werden klartextbuchstaben zugeordnet.
=>h:dieat
  a:isrr
  l:est  kte
  o: dlx
=>schlüssel wird in alphabethiscer reihenfolge geordnet:
a:isrr
h:dieat
l:est  kte
o: dlx
=>verwürfelter text: jeder nicht benutzte buchstabe im schlüssel erhält eine leere zeile:
a:isrr
b:
c:
d:
...
h:dieat
i:
...
l:est  kte
m:
n:
o: dlx
p:
q:
...
y:
z:

Die buchstaben der zeilen sind nur zur übersicht. z.B. "a:isrr" leutet "issr"
Umgekehrt:

Quelltext
1:
2:
=>Jedem Buchstaben des eingegebenen schlüssels eine textzeile zuordnen.
=>text (ohne leerzeilen) von 0 bis ende durchgehen und den text wieder zusammensetzen.


Ich hoffe das konnte dir helfen :) danke für den Versuch auf jedenfall :)