![]() |
xor funktioniert nicht
hey,
mein problem besteht darin, dass ich bei meiner xor-verschlüsselung nur mist raus bekomme, ich denke mal das liegt daran ich mit einen ganzen wort als schlüssel arbeiten will, was ich als string speichern muss, nun nimmt die funktion ord aber nur char, also schaut es euch mal an, wäre dankbar für rückmeldungen
Delphi-Quellcode:
diese progressbar füllt sich zum teil nicht ganz auf, soll das so sein?
function xorfunktion (text: Char;key:string): char;
begin Result := Char(Ord(text) xor Ord(key)); end; procedure TForm2.Button1Click(Sender: TObject); var V, text: string; key: string; i,j: integer; begin memo1.Clear; text := memo2.text; key := edit3.text; V := ''; for i := 0 to Length(text) do begin for j := 0 to length(key) do begin V := V+ xorfunktion (text[i], key[j]); Application.ProcessMessages; ProgressBar1.Position := i+j; ProgressBar1.Update; memo1.Text := V; end; end; end; |
Re: xor funktioniert nicht
Du übergibst hier
Zitat:
P.S.: Willkommen in der DP :dp: |
Re: xor funktioniert nicht
Probiers mal so:
Delphi-Quellcode:
function xorfunktion (text: Char;key:char): char;
begin Result := Char(Ord(text) xor Ord(key)); // Nur 2 Chars miteinander xoren ! ord(string) sollte sowiso eine Fehlermeldung bringen! end; procedure TForm2.Button1Click(Sender: TObject); var V, text: string; key: string; i,keyindex: integer; begin memo1.Clear; text := memo2.text; key := edit3.text; V := ''; ProgressBar1.Max := length(text); // Progressbar einstellen for i := 1 to Length(text) do // Schleifengrenze korrigiert begin keyindex := i mod length(key) + 1 // Index des Schlüssels V := V + xorfunktion(text[i], key[keyindex]); ProgressBar1.Position := i; // .update nicht nötig Application.ProcessMessages; end; memo1.Text := V; end; |
Re: xor funktioniert nicht
ah gut danke, das funktioniertso einwandfrei, zu der frage warum ich key nicht gleich char gemacht habe, weil ich gleube char immer nur ein zeichen speichern kann ich aber erst mal den ganzen text da rein lesen muss
|
Re: xor funktioniert nicht
Zitat:
Oder setz vorher mal das .Max der ProgressBar auf die länge des Strings :zwinker: und nochmal was das Ord(key) angeht ... das Ord liefert da den internen Pointer des Strings und kein Zeichen aus diesem String :stupid: |
Re: xor funktioniert nicht
sehr schön, noch kurz eine frage zur entschlüsselung, das xor sollte ja ansich gleich bleiben, nur die parameter ändern sich oder?
|
Re: xor funktioniert nicht
wenn du den Text nochmals mit dem selben Schlüssel genauso bearbeitest, dann kommt der ursprüngliche Text raus.
|
Re: xor funktioniert nicht
perfekt, dann bedanke ich mich für eure hilfe und schließe das thema ab
mfg max |
Re: xor funktioniert nicht
Am Besten du nimmst eine sauber programmierte Funktion wie diese:
Delphi-Quellcode:
Auf den Progressbar kannst du verzichten, weil die Funktion so schnell ist, dass das Zeichnen des Progressbars mehr Zeit braucht als die eigentliche Operation.
function StringXorCrypt(const text, key:string):string;
var i, j, keylen : Integer; begin SetLength(Result, length(text)); j := 1; keylen := Length(key); for i := 1 to Length(text) do begin Result[i] := chr(ord(text[i]) xor ord(key[j])); Inc(j); if j > keylen then j := 1; end; end; |
Re: xor funktioniert nicht
Zitat:
Man sollte jedoch überlegen ob es wirklich Sinn macht die Progressbar bei jedem Schleifendurchlauf zu aktuallisieren oder ob es nicht sinnvoller wäre diese nur einmal alle X Sekunden zu aktuallisieren oder alle X Schleifendurchläufe. |
Re: xor funktioniert nicht
Zitat:
Alles unter naja sagen wir 5 Sekunden braucht nur eine Sanduhr. Sollte die Datenmenge so groß werden, daß man mehr als 3 Sekunden braucht, dann kann man immer noch die Funktion auf Zeigerarithmetik umbauen...
Delphi-Quellcode:
// 250 MB => ~ 1 Sekunde
function StringXorCrypt(const text, key:string):string; var i, j, keylen : Integer; ptext, presult, pkey : PChar; begin SetLength(Result, length(text)); j := 1; keylen := Length(key); ptext := PChar(text); presult := PChar(Result); pkey := PChar(key); for i := 1 to Length(text) do begin presult^ := chr(ord(ptext^) xor ord(pkey^)); inc(presult); Inc(ptext); Inc(pkey); Inc(j); if j > keylen then begin j := 1; pkey := PChar(key); end; end; end; |
Re: xor funktioniert nicht
falls es noch schneller sein muß...
Delphi-Quellcode:
500 MB + 9 Byte-Key
Function StringXorCrypt(Const Text, Key: AnsiString): AnsiString;
Var pText, pTextEnd, pKey, pKeyEnd, pResult: PAnsiChar; Begin SetLength(Result, Length(Text)); pText := PAnsiChar(Text); pTextEnd := PAnsiChar(Text) + Length(Text); pKey := PAnsiChar(Key); pKeyEnd := PAnsiChar(Key) + Length(Key); pResult := PAnsiChar(Result); While pText < pTextEnd do Begin pResult^ := Chr(Ord(pText^) xor Ord(pKey^)); Inc(pText); Inc(pResult); Inc(pKey); If pKey >= pKeyEnd Then pKey := PAnsiChar(Key); End; End; shmia = 2,3 sec himi = 1,2 sec (auf meiner 2,7 GHz-Krücke) und wer Lust hat, bekommst bestimmt immernoch mehr raus, aber ob das soooooo nötig ist? also Beides schon schnell genug und ob man da wirklich noch 'ne ProgressBar braucht :shock: , selbst wenn man vermutlich nicht oft solche Datenmengen verschlüsseln wird :roll: PS: das AnsiString <> String hat nix mit dem Tempo zu tun, sondern nur mit der Kompatibilität zu D2009+ |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:10 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