Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.149 Beiträge
 
Delphi 12 Athens
 
#7

Re: RC4 Problem bei Wikipedia-Pseudoquellcode

  Alt 18. Feb 2009, 09:15
in Wiki ist auch ein "grober" Fehler enthalten
Für i = 0 bis LängeVon(s) wir wissen doch, daß dieses
Für i = 0 bis LängeVon(s) - 1 sein muß !

[add]
hab's auch mal schnell von Wiki aus übersetzt und komm im Großen und Ganzen auf's Selbe wie gammatester
Delphi-Quellcode:
Procedure TRC4.Initialize(Const Key: TByteDynArray);
  Var i, j: Integer;
    Temp: Byte;

  Begin
    For i := Low(sBox) to High(sBox) do sBox[i] := i;
    j := 0;
    For i := 0 to Length(sBox) - 1 do Begin
      j := (j + sBox[i] + Key[i mod Length(Key)]) mod Length(sBox);
      Temp := sBox[i];
      sBox[i] := sBox[j];
      sBox[j] := Temp;
    End;
  End;

Function TRC4.Crypt(Const Data: TByteDynArray): TByteDynArray;
  Var i, j, k: Integer;
    Temp, RandomChar: Byte;

  Begin
    SetLength(Result, Length(Data));
    i := 0;
    j := 0;
    For k := 0 to Length(Data) - 1 do Begin
      i := (i + 1) mod Length(sBox);
      j := (j + sBox[i]) mod Length(sBox);
      Temp := sBox[i];
      sBox[i] := sBox[j];
      sBox[j] := Temp;
      RandomChar := sBox[(sBox[i] + sBox[j]) mod Length(sBox)];
      Result[k] := Chr(RandomChar xor Data[k]);
    End;
  End;
@fortuneNext: du solltest beachten, das in dem Wiki-Beispiel 0-Indizierte Arrays verwendet werden, aber ein String mit dem Index 1 beginnt, weßhalb du bei Key den Index um 1 anheben mußt.
Den Index für Text hast'e dagegen schon angehoben, durch x := 1 to Length(text).

so, wenn ich das Ganze dann noch etwas Kürze und es ebenfalls auf String umstell, dann komm ich auf Folgendes:
Delphi-Quellcode:
Type TRC4 = Record
    sBox: Array[Byte] of Byte;
    Procedure Initialize(Const Key: AnsiString);
    Function Crypt (Const Data: AnsiString): AnsiString;
  End;

Procedure TRC4.Initialize(Const Key: AnsiString);
  Var i, j: Integer;
    Temp: Byte;

  Begin
    For i := Low(sBox) to High(sBox) do sBox[i] := i;
    j := 0;
    For i := 0 to High(sBox) do Begin
      j := Byte(j + sBox[i] + Ord(Key[i mod Length(Key) + 1]));
      Temp := sBox[i];
      sBox[i] := sBox[j];
      sBox[j] := Temp;
    End;
  End;

Function TRC4.Crypt(Const Data: AnsiString): AnsiString;
  Var i, j, k: Integer;
    Temp: Byte;

  Begin
    SetLength(Result, Length(Data));
    i := 0;
    j := 0;
    For k := 1 to Length(Data) do Begin
      i := Byte(i + 1);
      j := Byte(j + sBox[i]);
      Temp := sBox[i];
      sBox[i] := sBox[j];
      sBox[j] := Temp;
      Result[k] := AnsiChar(sBox[Byte(sBox[i] + sBox[j])] xor Ord(Data[k]));
    End;
  End;

Procedure TForm1.FormCreate(Sender: TObject);
  Var RC4: TRC4;
    s: String;

  Begin
    S := 'abcdefghijklmnopqrstuvwxyz';
    Label1.Caption := S;

    RC4.Initialize('1234567980');
    S := RC4.Crypt(S);
    Label2.Caption := StringReplace(S, #0, #1, [rfReplaceAll]);

    RC4.Initialize('1234567980');
    S := RC4.Crypt(S);
    Label3.Caption := S;
  End;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat