AGB  ·  Datenschutz  ·  Impressum  







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

RC4 und Delphi.Net

Ein Thema von skyware · begonnen am 16. Okt 2004 · letzter Beitrag vom 17. Okt 2004
Antwort Antwort
Seite 1 von 2  1 2      
skyware

Registriert seit: 11. Dez 2002
Ort: Wetzikon, Zürich
151 Beiträge
 
Delphi 6 Enterprise
 
#1

RC4 und Delphi.Net

  Alt 16. Okt 2004, 15:58
Hallo zusammen!

Interessiert habe ich die RC4 Beiträge gelesen...hab dann die vorgeschlagenen
Funktionen auch gleich ausprobiert.
Unter Delphi 6 läuft alles einwandfrei
Doch unter Delphi 8.NET hat der Compiler keine Freude am Datentype "PByteArray"
Hat jemand ne Ahnung wie man diesen Code ändern muss damit er auch .NET kompatibel ist?

Danke im voraus

Delphi-Quellcode:
procedure RC4Init(var RC4: TRC4Context; const Key: String);
var
  R,S,T,K: Byte;
  U,L: Integer;
begin
  L := Length(Key);
  with RC4 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(Key)[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;
  end;
end;
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#2

Re: RC4 und Delphi.Net

  Alt 16. Okt 2004, 18:30
Ein Byte(Key[U+1]) sollte es tun.
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#3

Re: RC4 und Delphi.Net

  Alt 16. Okt 2004, 18:46
Zitat von skyware:
Doch unter Delphi 8.NET hat der Compiler keine Freude am Datentype "PByteArray"
PByteArray dürfte wohl ein Pointer auf einen ByteArray darstellen. Das wird die CLR nie schlucken.

Zitat von Robert Marquardt:
Ein Byte(Key[U+1]) sollte es tun.
Ich glaube nicht....
So bekommst du wenigstens einen byte[], das dürfte eigentlich die größte Hürde gewesen sein.
Delphi-Quellcode:
var
  ...
  SomeByteArray: array of byte;
begin
  ...
  SomeByteArray := Convert.FromBase64String(Key);
  ...
end;
  Mit Zitat antworten Zitat
skyware

Registriert seit: 11. Dez 2002
Ort: Wetzikon, Zürich
151 Beiträge
 
Delphi 6 Enterprise
 
#4

Re: RC4 und Delphi.Net

  Alt 16. Okt 2004, 18:56
Hallo Robert,

danke für die prompte Antwort!
Es lässt sich nun kompilieren, hab den Code nochmals angeschaut. Das heisst nun also
das in "Byte(AKey[xU+1])" das xU+1 Zeichen (Char) von AKey als Byte gelesen wird?

Nun versteht ich aber folgende Zeile nicht mehr:
"TByteArray(Dest)[xS] := TByteArray(ASource)[xS] xor FD[xT];"
die lässt sich nämlich auch nicht kompilieren
Und mit "Bytes" scheints auch nicht zu gehen...
Was muss hier getan werden, und was passiert hier genau?


Delphi-Quellcode:
procedure RC4Code(var ARC4: TRC4Context; const ASource; var Dest; ACount: Integer);
var
  xS : Integer;
  xT : Byte;

  xtest : byte;
begin
  with ARC4 do
    for xS := 0 to ACount -1 do
    begin
      Inc(FI);
      xT := FD[FI];
      Inc(FJ, xT);
      FD[FI] := FD[FJ];
      FD[FJ] := xT;
      Inc(xT, FD[FI]);
      {$IFDEF CLR}
      TByteArray(Dest)[xS] := TByteArray(ASource)[xS] xor FD[xT];
      {$ELSE}
      TByteArray(Dest)[xS] := TByteArray(ASource)[xS] xor FD[xT];
      {$ENDIF}
    end;
end;
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#5

Re: RC4 und Delphi.Net

  Alt 16. Okt 2004, 19:14
Lass dir einen Tip geben. Schließe D8 und mache dir ein schönes Wochenende.
D8 hat nur unwesentlich mehr mit .Net zu tun als es D7 hatte. Willst du irgendwann mal in einer Delphi IDE .Net programmieren, würde ich dir C# in Delphi2005 empfehlen.
Delphi.Net ermöglicht einfach keinen Code, der aussieht wie .Net. (Es hat auch unter .Net noch Forward deklarationen, der Compiler kann immer noch nicht gleichnamige Typen & Objekte unterscheiden, usw. )
Solch ein mittelalterlicher Compiler passt einfach nicht zu .Net. Warum sollte auch der Entwickler ekligen Code schreiben müssen nur damit der Compiler alles in einem Durchlauf machen kann.
In spätestens 2 Monaten liegt dein D8 dort, wo es bei fast jedem D8-Besitzer liegt: Im Schrank und staubt ein.
  Mit Zitat antworten Zitat
skyware

Registriert seit: 11. Dez 2002
Ort: Wetzikon, Zürich
151 Beiträge
 
Delphi 6 Enterprise
 
#6

Re: RC4 und Delphi.Net

  Alt 16. Okt 2004, 20:00
neeeee möcht jetzt nicht aufgeben!
sind nur 2 zeilen die laufen müssen, das wird schon
noch klappen, möchte delphi8 nicht in den schrank verbannen!
  Mit Zitat antworten Zitat
LarsMiddendorf

Registriert seit: 4. Sep 2003
Ort: Hemer
104 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: RC4 und Delphi.Net

  Alt 16. Okt 2004, 21:32
Deklarier die Funktion doch als unsafe, dann kannst du Zeiger und vermutlich auch PByteArray nutzen.
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#8

Re: RC4 und Delphi.Net

  Alt 17. Okt 2004, 07:50
Die originale Umtypung ist im Prinzip das Gleiche wie PChar().
Der wichtigste Unterschied zwischen einem PChar und einem string ist das der string ab 1 adessiert wird und der PChar ab 0.
Byte(Key[U+1]) heisst also das der Char aus dem string geholt wird (+1) und dann in ein Byte umgetype wird.
Das Original typt den string zu einem Byte array um und holt dann das Byte.
  Mit Zitat antworten Zitat
skyware

Registriert seit: 11. Dez 2002
Ort: Wetzikon, Zürich
151 Beiträge
 
Delphi 6 Enterprise
 
#9

Re: RC4 und Delphi.Net

  Alt 17. Okt 2004, 15:07
Hallo zusammen,

danke für Eure Unterstützung, leider hab ich immer noch 2 Problemchen
die ich seit gestern nicht lösen konnte, bin am verzweifeln
Die Codezeilen die mir noch Probleme bereichen sind mit "//todo" markiert.
Hab scho diverses versucht mit Byte casten, mit Convert.GetBase64FromString etc.,
hat alles nichts geholfen
Please help

ps: Lars, unsafe Code möcht ich eigentlich vermeiden

Delphi-Quellcode:
unit HTFunctions_Crypt_RC4;

interface

uses
  {$IFDEF CLR}Borland.Vcl.SysUtils{$ELSE}SysUtils{$ENDIF};


function RC4Encode(const AString, AKey: string): string;
function RC4Decode(const AString, AKey: string): string;


implementation

type
  TRC4Context = record
    FD : array[Byte] of Byte;
    FI,
    FJ : Byte;
  end;

{ RC4Init:
-------------------------------------------------------------------------------}

procedure RC4Init(var ARC4: TRC4Context; const AKey: String);
var
  xR,
  xS,
  xT,
  xK : Byte;
  xU,
  xL : Integer;
begin
  xL := Length(AKey);
  with ARC4 do
  begin
    FI := 0;
    FJ := 0;
    for xS := 0 to 255 do FD[xS] := xS;
    xR := 0;
    xU := 0;
    for xS := 0 to 255 do
    begin
      {$IFDEF CLR}
      if xU < xL then xK := Byte(AKey[xU+1]) else xK := 0;
      {$ELSE}
      if xU < xL then xK := PByteArray(AKey)[xU] else xK := 0;
      {$ENDIF}
      Inc(xU);
      if xU >= xL then xU := 0;

      Inc(xR, FD[xS] + xK);
      xT := FD[xS];
      FD[xS] := FD[xR];
      FD[xR] := xT;
    end;
  end;
end;

{ RC4Code:
-------------------------------------------------------------------------------}

procedure RC4Code(var ARC4: TRC4Context; const ASource; var Dest; ACount: Integer);
var
  xS : Integer;
  xT : Byte;
begin
  with ARC4 do
    for xS := 0 to ACount -1 do
    begin
      Inc(FI);
      xT := FD[FI];
      Inc(FJ, xT);
      FD[FI] := FD[FJ];
      FD[FJ] := xT;
      Inc(xT, FD[FI]);
      {$IFDEF CLR}
      //todo
      TByteArray(Dest)[xS] := TByteArray(ASource)[xS] xor FD[xT];
      {$ELSE}
      TByteArray(Dest)[xS] := TByteArray(ASource)[xS] xor FD[xT];
      {$ENDIF}
    end;
end;

{ RC4Done:
-------------------------------------------------------------------------------}

procedure RC4Done(var ARC4: TRC4Context);
begin
  //todo
  FillChar(ARC4, SizeOf(ARC4), 0);
end;

{ RC4Encode:
-------------------------------------------------------------------------------}

function RC4Encode(const AString, AKey: string): string;
var
  xRC4 : TRC4Context;
begin
  SetLength(Result, Length(AString));
  RC4Init(xRC4, AKey);
  RC4Code(xRC4, AString[1], Result[1], Length(AString));
  Rc4Done(xRC4);
end;

{ RC4Decode:
-------------------------------------------------------------------------------}

function RC4Decode(const AString, AKey: string): string;
var
  xRC4 : TRC4Context;
begin
  SetLength(Result, Length(AString));

  RC4Init(xRC4, AKey);
  RC4Code(xRC4, AString[1], Result[1], Length(AString));
  Rc4Done(xRC4);
end;


end.
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#10

Re: RC4 und Delphi.Net

  Alt 17. Okt 2004, 15:19
Zitat von skyware:
ps: Lars, unsafe Code möcht ich eigentlich vermeiden
Du gibst dir aber alle Mühe unsafe Code zu erzeugen.
Schließlich benutzt du die VCL.Net! Die ist vollgestopft mit unsafe Code.
Ich sag's nochmal: Schließe D8 und mache dir 'nen schönen Sonntag (Den Samstag hast du ja schon mit D8 verplempert ).
Was du da versuchst ist keine Portierung zu .Net, es ist nur eine Portierung zur VCL.Net.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 21:12 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