Entwickler-Ecke

Algorithmen, Optimierung und Assembler - Wer hat mir eine RC4-Encryption-Function?


Hanna Bubiskopf - So 27.02.05 20:48
Titel: Wer hat mir eine RC4-Encryption-Function?
Nachdem ich vergeblich gegoogelt habe und nur komplizierte Klassen fand,
deren Nutzung ich sowieso nicht kapiere, habe ich eine Bitte an Euch:

Ich brauche eine RC4-Funktion zum Verschlüsseln von Strings.
Der Rückgabewert soll ein String sein, der Input soll ein String sein.
Ich brauche eine RC4-Funktion!
Bitte keine XOR-Verschlüsselungen. Das war leider das Einzige was ich auf dieser
Seite fand!


MrSaint - So 27.02.05 21:24

http://www.freevbcode.com/ShowCode.asp?ID=4398 gibts den Code als VB-Code... Mit ein bisschen Google sollte es dir das Übersetzen ermöglichen...


Hanna Bubiskopf - Mo 28.02.05 12:34
Titel: StrConv in Delphi?
Die Funktion hatte ich übrigens schon in VB, bloss wußte ich nicht wie ich
die nach Delphi kriege.
Nunja ich hab ja schon gesagt, dass ich Anfänger bin.

Wie übersetze ich dann den folgenden VB-Code in Delphi:
Dim Key() as Byte
Key() = StrConv(Left$(Password, 256), vbFromUnicode)

Google findet zu "StrConv in Delphi" nix.


patrick - Mo 28.02.05 13:26

zu der funktion [b]StrConv[b]
findest du hier was:
http://www.techonthenet.com/access/functions/string/strconv.htm
das delphi äquivalent wäre dann wohl das hier: function StringToWideChar(const Source: string; Dest: PWideChar; DestSize: Integer): PWideChar;

diese funktion convertiert einen ANSI (pascal) string in einen unicode string


Hanna Bubiskopf - Mo 28.02.05 18:45
Titel: ich hab das mal probiert, aber es klappt net :-(
Also ich scheitere daran, dass es in Delphi keinen Len-Befehl gibt.
Ich habe dann die StrUtils included, aber irgendwie gibt's keine Len()-Funktion.
Und dann bleiben noch die Fragen offen, wie ich
diese Funktion korrekt mit Parametern bestücken kann:
function StringToWideChar(const Source: string; Dest: PWideChar; DestSize: Integer): PWideChar;


F34r0fTh3D4rk - Mo 28.02.05 18:47

ist len nicht das gleiche wie length in delphi ?


Hanna Bubiskopf - Mo 28.02.05 20:29
Titel: ach mensch, jetzt veratet mir halt mal wie
Die Length-Funktion fand ich vorhin schon endlich.
Aber das nützt mir trotzdem abslut nix.
Ich hänge hier fest.
Die Funktion braucht dreimal soviel Parameter wie die VB-Funktion.
Also was muss ich hier reintun in diese Funktion?
Seit doch mal so nett und lasst mich net hängen!
function StringToWideChar(const Source: string; Dest: PWideChar; DestSize: Integer): PWideChar;


MrSaint - Mo 28.02.05 20:35

ich hab doch oben schon einen link gepostet. Da ist so eine Funktion in VB, welche nur 2 parameter will. Dann übersetz doch einfach die!


Delete - Mo 28.02.05 21:07

In der Code-Lib der Delphipraxis hat es einen Beitrag dazu: http://www.delphipraxis.net/topic30830_rc4verschluesselung.html&highlight=rc4


retnyg - Mo 28.02.05 21:59

ich habe mir erlaubt das VB-Beispiel zu übersetzen:
hier das resultat:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
Function RC4(Expression, Password :String) : string;
// (C) http://www.freevbcode.com/ShowCode.asp?ID=4398
// pascal adaption by retnyg
var RB: array [0..255of byte;
    X,Y,Z:Longint;
    key:string;
    bytearray: array [0..255of byte;
    temp: byte;
    l,lp: integer;
begin
  l:= Length(Expression);
  lp := Length(Password);
  If (lp = 0or (l = 0then  Exit;
  If lp > 256 Then  Key := copy(Password, 0256Else Key := Password;
  For X := 0 To 255 do RB[X] := X;
  X :=0;Y:=0;Z:=0;
  For X := 0 To 255 do begin
    Y := (Y + RB[X] + byte(Key[X Mod lp])) Mod 256;
    Temp := RB[X];
    RB[X] := RB[Y];
    RB[Y] := Temp;
    if x < l then byteArray[x] := byte(expression[x+1]);
  end;
  X:=0;Y:=0;Z:=0;
//bytearray := expression;
  For X := 0 To l do begin
    Y := (Y + 1Mod 256;
    Z := (Z + RB[Y]) Mod 256;
    Temp := RB[Y];
    RB[Y] := RB[Z];
    RB[Z] := Temp;
    ByteArray[X] := byte(ByteArray[X]) Xor (RB[(RB[Y] + RB[Z]) Mod 256]);
  end;
  result := '';
  for x := 0 to l - 1  do result := result + chr(ByteArray[x]);
end;