![]() |
RC4 Problem
Hi,
ich habe diesen Thread hier gefunden: ![]() Und würde mir jetzt vom oberen Code gerne ein paar Zeilen abschauen und versuchen zu verstehen. Allerdings verstehe ich folgende Codezeile nicht:
Delphi-Quellcode:
Sie wird schon beim Compilen als Fehler angezeigt:
with x do
TByteArray(Dest)[S] := TByteArray(Source)[S] xor D[T]; [Fehler]: Ungültige Typumwandlung und zwar an der Stelle TByteArray(Dest)[S] := TByteArray(Source)[|S] xor D[T]; Alles deklarierte ist das:
Delphi-Quellcode:
Kann mir jemand helfen, indem er mir verrät, was ich falsch gemacht habe?
type
TRC4Context = record D: array[byte] of Byte; I,J: byte; end; var R,S,T,K:byte; U,L,N,Count:integer; X:TRC4Context; Danke! mfg fortuneNext |
Re: RC4 Problem
In der Zeile gibt es zwei Typumwandlungen (Typecasts) nämlich TByteArray(Dest) und TByteArray(Source). Leider hast Du ausgerechnet die Deklarationen von Source und Dest nicht aufgelistet. Weiterhin ist nicht klar was T ist, aber es ist eher unwahrscheinlich, daß da der Grund für die Fehlermeldung liegt.
Liefere also Variablen und Typen in der with-Anweisung nach, vielleicht wird's dann möglich weiterzuhelfen. Gruß Gammatester |
Re: RC4 Problem
Nah, zur einfachheit poste ich einfach mal meinen gesamten Text.
Also ich wollte das gerne - nur zum erstmaligen Verständnis - in eine einzige Funktion umschreiben. Achtung - die Variablen heißen ein wenig anders, da ich das Ding komplett neu abgeschrieben hab, ums besser zu verstehen.
Delphi-Quellcode:
function TfMain.Encrypt_RC4(uncrypted,password:string):string;
type TRC4Context = record D: array[byte] of Byte; I,J: byte; end; var R,S,T,K:byte; U,L,N,Count:integer; X:TRC4Context; begin Count := length(uncrypted); L := Length(password); with x do begin I := 0; J := 0; for S := 0 to 255 do D[S] := S; R := 0; U := 0; for S := 0 to 255 do begin if U < L then K := PByteArray(password)[U] else K := 0; Inc(U); if U >= L then U := 0; Inc(R, D[S] + K); T := D[S]; D[S] := D[R]; D[R] := T; end; for N := 0 to Count -1 do begin Inc(I); T := D[I]; Inc(J, T); D[I] := D[J]; D[J] := T; Inc(T, D[I]); TByteArray(Result)[N] := TByteArray(uncrypted)[N] xor D[T]; end; end; FillChar(x, SizeOf(x), 0); end; Das ist jetzt die ganze Funktion. |
Re: RC4 Problem
Zitat:
Delphi-Quellcode:
ersetzt. Aber: Das ist sehr gefährlich, weil Result[0] und uncrypted[0] benutzt werden und es wahrscheinlich krachen wird. Was ist eigentlich das Hypnotische an strings, daß sie dauernd in Cryptocode verwendet werden?? Eigentlich sind sie da roh ziemlich unbrauchbar, nur als Hex- oder Base64-Ein/Ausgabe.
PByteArray(Result)[N] := PByteArray(uncrypted)[N] xor D[T];
Im Origial verdent untyped constd bzw vars verwendet, d.h. in der Regel beim aktuellen Aufruf dann array of bytes oder so. Zwei Ratschläge: 1. Wenn Du unbedingt strings benutzen willst, brauchst Du die Typcasts über Bytearrays eigentlich nicht, nur mußt Du halt darauf achten, daß die Indizierung bei 1 losgeht, also
Delphi-Quellcode:
for N := 1 to Count do begin
Inc(I); T := D[I]; Inc(J, T); D[I] := D[J]; D[J] := T; Inc(T, D[I]); Result[N] := char(byte(uncrypted[N]) xor D[T]); end; 2. Nimm lieber den Originalansatz mit const source; etc. Beim eigentlichen Aufruf kannst Du dann immer noch strings via Typecasts verwenden. Gammatester |
Re: RC4 Problem
Super, das klappt soweit :-)
Danke! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:48 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