Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - XOR-problem
huhn - Mi 07.12.05 21:04
Titel: XOR-problem
Hi leute!
ich hab ja schon einiges mit XOR gemacht, darunter auch ein OTP-crypter mit psyeudozufallsgeneratot. Aber irgendwie stoße ich gerade an meine grenze...
ich wollte nur mal schwind einen Text verschlüsseln mit XOR was aber nicht klappt:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| function crypt(str:string):string; var z,w:integer; r:string; const dec:string='Jamaica'; begin r:=str; w:=length(r); for z:=1 to w do r[z]:=char(byte(dec[z mod length(dec)]) xor byte(r[z])); result:=r; end;
procedure TForm1.Button20Click(Sender: TObject); var z:string; begin z:=crypt(memo1.text); memo1.Text:=z; end; |
"hallo wie geht es dir? mir geht es gut!"<--zu verschlüsselner text
Leider funktioniert diese funktion nicht, da er schon nach dem ersten zeichen ohne fehlermeldung oder ähnlichen abbricht.
Es scheint irgendwie an dem "J" zu hängen aber hab kein plan wieso????
Natürlich würde diese funktion funktionieren wenn ich [(z-1) mod length(dec)] sagen würde, jedoch wird dann das erste zeichen immer übersprungen, was ich nicht will.
ich hoffe ihr könnt mir helfen :crying:
ich weiß das XOR schon oft hier dran war und ich hab auch die suche betätigt und quelltexte benutzt, jedoch stand ich immer vor dem selben problem.
mfg huhn
ps: ich steh wahrscheinlich wahnsinnig aufm schlauch und spring nachher ausm fenster vor wut, weil der fehler so leicht war^^
alzaimar - Mi 07.12.05 21:09
z mod length(dec) liefert eine Zahl von 0..length(dec)-1, sollte aber 1..length(dec) sein, denn Strings sind 1-basiert indiziert.
huhn - Mi 07.12.05 21:17
aber das hier liefert mir 1????
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure TForm1.Button1Click(Sender: TObject); begin showmessage(inttostr(1 mod 12)); end; procedure TForm1.Button1Click(Sender: TObject); begin showmessage(inttostr(0 mod 12));end; |
und dann bleibt noch immer die tatsache das immer wenn es auf "J" wieder käme(wenn z-1) das es nicht kodiert. oder stimmt da was nicht bei mir?
DaRkFiRe - Mi 07.12.05 21:50
Was alzaimar schrieb, ist erstmal grundsätzlich richtig - korrigier erstmal diesen Fehler und teste dann nochmal.
huhn - Mi 07.12.05 22:17
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| function decrypt(str:string):string; var z,l:integer; r:string; const dec:string='Jamaicaner'; begin r:=str; l:=length(r); for z:=1 to l do r[z]:=char(byte(dec[(z-1) mod length(dec)]) xor byte(r[z]));result:=r; end; |
mein quelltext sieht nun so aus, für mich scheint es zwar unlogisch zu sein aber erstmal egal. also funktionieren tut es noch immer nicht, es verschlüsselt immer nut teile, jedoch nicht den kompletten text.
so wird in meinen bsp-text nur bis zum ersten "?" verschlüsselt bei -1.
wenn ich z+1 mache wird mein bsp text komplett verschlüsselt jedoch nicht andere texte komplett.
mfg huhn
alzaimar - Mi 07.12.05 22:23
Huhn, schau doch mal:
z z mod 8
1 1
2 2
..
7 7
8 0
Du willst aber etwas Anderes. Du möchtest
Statt 'z mod Length(r)' musst Du '(1 + (z-1) mod Length (r))' schreiben (probier's aus). Bei mir geht es dann jedenfalls.
Aber daran liegts eh nicht, das die Schleife gar nicht durchlaufen wird.
Schalte mal alle Warnungen, overflow und rangechecks *an*. Das solte man sowieso (in den Compileroptionen des Projektes).
Sirke - Mi 07.12.05 22:30
Was alzaimar über das modulo-Problem schreibt stimmt schon, das musst du mit der Addotion von 1 lösen !
Aber um zu deinem Abbruch-Problem zu kommen:
Es ist kein Fehler im Quelltext, sonder die Wahl der falschen Zeichen!
Wenn du die gewählten Zeichen verschlüsselst, kommt eine Zahl die kleiner als 33 ist heraus. Diese Zeichen sind nicht darstellbar und brechen meist eine Zeichenkette ab. Wenn du stattdessen das Ergebnis mit IntToHex() ausgibst oder andere Zeichen (wobei auch dort wieder solche Werte entstehen können) verwendest, sollte de gesamte Kette verschlüsselt werden.
MfG Sirke
DaRkFiRe - Do 08.12.05 07:13
Kurzer Ausreißer in dem Post über meinem jetzigen: das Leerzeichen hat den ASCII Code 32 (0x20) und ist noch darstellbar, alle anderen darunter (0-31, 0x0-0x1F) sind Steuerzeichen!
huhn - Do 08.12.05 15:32
ok das beantwortet mein frage mit dem zeichen unter 32!
daran wirds wohl legen, deswegen hatte ich auch früher keine probleme...
das mit dem mod hab ich jetzt auch kapiert,
war gestern wohl einfach doch schon zu spät :autsch:
naja ich danke euch!
mfg huhn
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 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!