Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi RC4 Problem (https://www.delphipraxis.net/123316-rc4-problem.html)

fortuneNext 30. Okt 2008 16:19


RC4 Problem
 
Hi,
ich habe diesen Thread hier gefunden:
http://www.delphipraxis.net/internal...&highlight=rc4
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:
with x do
TByteArray(Dest)[S] := TByteArray(Source)[S] xor D[T];
Sie wird schon beim Compilen als Fehler angezeigt:
[Fehler]: Ungültige Typumwandlung

und zwar an der Stelle

TByteArray(Dest)[S] := TByteArray(Source)[|S] xor D[T];

Alles deklarierte ist das:

Delphi-Quellcode:
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;
Kann mir jemand helfen, indem er mir verrät, was ich falsch gemacht habe?
Danke!

mfg
fortuneNext

gammatester 30. Okt 2008 21:44

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

fortuneNext 30. Okt 2008 22:22

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.

gammatester 30. Okt 2008 22:58

Re: RC4 Problem
 
Zitat:

Zitat von fortuneNext
Delphi-Quellcode:
TByteArray(Result)[N] := TByteArray(uncrypted)[N] xor D[T];

Also die Fehler verschwinden, wenn man das durch
Delphi-Quellcode:
PByteArray(Result)[N] := PByteArray(uncrypted)[N] xor D[T];
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.

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

fortuneNext 1. Nov 2008 21:33

Re: RC4 Problem
 
Super, das klappt soweit :-)
Danke!


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:39 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz