![]() |
xor, was ist falsch?
Hallo,
ich hab folgendes:
Delphi-Quellcode:
const cschluessel = 'asdfghjkl';
function DoCrypt(AText : string):string; var i : integer; begin for i:= 1 to Length(AText) do AText[i]:= Chr(Ord(cschluessel[Succ(i mod Length(cschluessel))]) xor Ord(AText[i])); Result:=AText; end; irgendwoe hat sich da ein Fehler eingeschlichen, es wird zwar verschlüsselt, aber nichtmehr korrekt entschlüsselt. Hab ich da einen Denkfehler? Der String der übergeben wird ist der Inhalt einer INi-Datei den ich in eine Stringlist lade. Also Stringlist.Text :angel: |
Re: xor, was ist falsch?
Delphi-Quellcode:
const cschluessel = 'asdfghjkl';
function DoCrypt(AText : string):string; var i : integer; begin for i:= 1 to Length(AText) do AText[i]:= Chr(Ord(cschluessel[i mod Length(cschluessel)]) xor Ord(AText[i])); Result:=AText; end; so gehts :shock: muss ich cschluessel nicht von 1 bis Length(csschluessel) ansprechen? ist doch ein string oder? wenn ich von 0 bis Pred(Length(cschluessel)) gehts :wall: |
Re: xor, was ist falsch?
Also sei mir nich bös, aber bei mir gehts so net.
Delphi-Quellcode:
Procedure TForm1.Button1Click(Sender: TObject); Var l: Tstringlist; Begin l := Tstringlist.create; l.text := Memo1.Lines.Text; l.text := Docrypt(l.text); memo1.lines.text := l.text; l.free; End; |
Re: xor, was ist falsch?
Hallo Martin,
dein Fehler steckt in deiner Indexberechnung:
Delphi-Quellcode:
// Succ(i mod Length(cSchlussel))
Succ(Pred(i) mod Length(cSchluessel))
Delphi-Quellcode:
Grüße vom marabu
function XorStr(const s, key: String): String;
var i, iKey: Integer; begin SetLength(Result, Length(s)); iKey := 0; for i := 1 to Length(s) do begin iKey := Succ(iKey mod Length(key)); Result[i] := Chr(Ord(key[iKey]) xor Ord(s[i])); end; end; @Uwe: Probiere es mal so:
Delphi-Quellcode:
Oder auch mit DoCrypt() - wenn der Fehler draußen ist.
procedure TForm1.Button1Click(Sender: TObject);
var s: String; begin s := XorStr(Memo1.Text, cSchluessel); Memo1.Text := XorStr(s, cSchluessel); End; |
Re: xor, was ist falsch?
@marabu:Warum spielt das eine Rolle? Ich fang beim verschlüsseln und beim entschlüsseln beim selben index an, also dürfte das kein unterschied machen oder?
Zitat:
|
Re: xor, was ist falsch?
@marabu
Das kann aber auch nicht wirklich funktionieren, Da wenn Ikey = Length(Key) -> Ikey := -1; geschieht. Das wäre dann ein wenig Fatal. Bei mir hat es jedenfalls auch nicht getan. Aber mit :
Delphi-Quellcode:
Funktionierts echt gut.
Const
cschluessel = 'asdfghjkl'; Function DoCrypt(AText: String): String; Var i: integer; Begin For i := 1 To Length(AText) Do AText[i] := Chr(Ord(cschluessel[i Mod Length(cschluessel) + 1]) Xor Ord(AText[i])); Result := AText; End; .. Procedure TForm1.Button1Click(Sender: TObject); Var s: String; Begin s := DoCrypt(Memo1.Text); Memo1.Text := s; End; @Angel Mus ich nicht wenn ich 2 mal auf den Button Clicke |
Re: xor, was ist falsch?
@Martin:
dein Code funktioniert zwar (zufällig), aber er benutzt das Byte vor dem Schlüssel - das letzte Zeichen im Schlüssel allerdings nie. Ein 1-n-Ring wird nunmal mit Succ(i mod n) gebildet und ein 0-n-Ring mit Succ(i) mod Succ(n). @Uwe: Zitat:
Grüße PS: Schreibfehler korrigiert - hatte Pred() aus meinem ersten Beitrag kopiert... |
Re: xor, was ist falsch?
Ich Habe es getestet:
mit :
Delphi-Quellcode:
und
Const
cschluessel = 'asdfghjkl'; Function DoCrypt(AText: String): String; Var i: integer; Begin For i := 1 To Length(AText) Do AText[i] := Chr(Ord(cschluessel[i Mod Length(cschluessel) + 1]) Xor Ord(AText[i])); Result := AText; End;
Delphi-Quellcode:
und Memo1.text = 'Hallo Welt';
Const
cschluessel = 'asdfghjkl'; Function DoCrypt(AText: String): String; Var i: integer; Begin For i := 1 To Length(AText) Do AText[i] := Chr(Ord(cschluessel[i Mod Length(cschluessel)]) Xor Ord(AText[i])); Result := AText; End; Es hat beidesmal geklappt ;) allein das ist schon "Komisch" |
Re: xor, was ist falsch?
also wenn die länge 4 beträgt, sieht die reihenfolge der indexe wenn ich i nicht eins veringere(meine version) doch so aus:
1,2,3,0,1,2,3,0,1,2,3,... wenn ich i verringere(deine version) so: 0,1,2,3,0,1,2,3,... oder nicht? Das sollte doch trotzdem funktionieren, da ich beim VERschlüsseln und beim ENTschlüsseln immer das selbe verwende. @Uwe: probier längere strings und mehr zeilen |
Re: xor, was ist falsch?
Hmm also wenn ich deutlich Längere Passwörter Nehme ist es Klar
nur
Delphi-Quellcode:
Geht. Allerdings würde das Bedeuten das Delphi die Stringkonstante in einen Array of Char baut der dann INdex 0..Length -1 hat merkwürdig.Const cschluessel = 'asdfghjkl'; Function DoCrypt(AText: String): String; Var i: integer; Begin For i := 1 To Length(AText) Do AText[i] := Chr(Ord(cschluessel[i Mod Length(cschluessel)]) Xor Ord(AText[i])); Result := AText; End; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:19 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz