AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

RC4 Problem

Ein Thema von fortuneNext · begonnen am 30. Okt 2008 · letzter Beitrag vom 1. Nov 2008
Antwort Antwort
fortuneNext

Registriert seit: 11. Aug 2007
Ort: Neuss
133 Beiträge
 
Delphi 7 Enterprise
 
#1

RC4 Problem

  Alt 30. Okt 2008, 16:19
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
Tim
"Hilfe & Support konnte nicht geöffnet werden. Bitte öffnen sie Hilfe & Support, um das Problem zu beheben."
"No Keyboard found. Press F1 to continue."
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#2

Re: RC4 Problem

  Alt 30. Okt 2008, 21:44
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
  Mit Zitat antworten Zitat
fortuneNext

Registriert seit: 11. Aug 2007
Ort: Neuss
133 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: RC4 Problem

  Alt 30. Okt 2008, 22:22
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.
Tim
"Hilfe & Support konnte nicht geöffnet werden. Bitte öffnen sie Hilfe & Support, um das Problem zu beheben."
"No Keyboard found. Press F1 to continue."
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#4

Re: RC4 Problem

  Alt 30. Okt 2008, 22:58
Zitat von fortuneNext:
TByteArray(Result)[N] := TByteArray(uncrypted)[N] xor D[T];
Also die Fehler verschwinden, wenn man das durch
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
  Mit Zitat antworten Zitat
fortuneNext

Registriert seit: 11. Aug 2007
Ort: Neuss
133 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: RC4 Problem

  Alt 1. Nov 2008, 21:33
Super, das klappt soweit
Danke!
Tim
"Hilfe & Support konnte nicht geöffnet werden. Bitte öffnen sie Hilfe & Support, um das Problem zu beheben."
"No Keyboard found. Press F1 to continue."
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:25 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