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;
Ein Therapeut entspricht 1024 Gigapeut.