Python nach C# übersetzen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
AyrA
User
Beiträge: 3
Registriert: Freitag 15. Juli 2011, 14:52

Freitag 15. Juli 2011, 15:00

ich habe hier ein Python skript (ca. 350 Zeilen, nichts weltbewegendes) das eine komprimierte, verschlüsselte Zeichenfolge wieder in die Ursprungsform zurück bringt
Dieses muss ich nach C# übersetzen, das geht so weit ganz wunderbar (hoffe ich zumindest)
jetzt habe ich aber festgestellt, dass die Funktion:

Code: Alles auswählen

def rc4crypt(data, key):
    x = 0
    box = range(256)
    for i in range(256):
        x = (x + box[i] + ord(key[i % len(key)])) % 256
        box[i], box[x] = box[x], box[i]
    x = 0
    y = 0
    out = []
    for char in data:
        x = (x + 1) % 256
        y = (y + box[x]) % 256
        box[x], box[y] = box[y], box[x]
        out.append(chr(ord(char) ^ box[(box[x] + box[y]) % 256]))

    return ''.join(out)
etwas anderes zurückliefert, als die C# Funktion:

Code: Alles auswählen

        static byte[] rc4crypt(byte[] data,byte[] key)
        {
            byte[] ret = new byte[data.Length];
            byte[] box = new byte[256];
            int x = 0, y = 0, i = 0;
            byte  temp = 0;

            for (x = 0; x < 256; x++)
            {
                box[x] = (byte)x;
            }

            for (i = 0; i < 256; i++)
            {
                x = (x + box[i] + key[i % key.Length]) % 256;
                temp = box[i];
                box[i] = box[x];
                box[x] = temp;
            }

            x = y = 0;

            for(i=0;i<data.Length;i++)
            {
                x = (x + 1) % 256;
                y = (y + box[x]) % 256;
                temp = box[y];
                box[y] = box[x];
                box[x] = temp;
                ret[i] = (byte)(data[i] ^ box[(box[x] + box[y]) % 256]);
            }

            return ret;
        }
ich haby python zuvor leider noch nie gesehen und rate daher hauptsächlich, was ich mich aber hauptsächlich frage, ist ob box[x], box[y] = box[y], box[x] wirklich temp = box[y];
box[y] = box[x];
box[x] = temp;
entspricht

Weiss das jemand?

ich kann gerne auch das komplette skript hochladen
BlackJack

Freitag 15. Juli 2011, 15:30

@AyrA: Das mit `temp` sieht richtig aus. Daran sollte es nicht liegen.
bords0
User
Beiträge: 172
Registriert: Mittwoch 4. Juli 2007, 20:40

Freitag 15. Juli 2011, 19:54

Spontan würde ich sagen, dass x=0; vor dem zweiten for fehlt.
AyrA
User
Beiträge: 3
Registriert: Freitag 15. Juli 2011, 14:52

Freitag 15. Juli 2011, 19:59

bords0 hat geschrieben:Spontan würde ich sagen, dass x=0; vor dem zweiten for fehlt.
Danke!
ist mir auch gerade aufgefallen, dazu kam, dass der Schlüssel, den ich an die Funktion übergeben sollte offenbar nicht als string, sondern als bytes übergeben werden musste. Jetzt stimmt die Entschlüsselung und das Ergebnis ist das richtige und nicht irgend so nen kuddelmuddel
AyrA
User
Beiträge: 3
Registriert: Freitag 15. Juli 2011, 14:52

Freitag 15. Juli 2011, 23:39

Ich möchte mich noch für die Hilfe bedanken, das Skript läuft nun einwandfrei. Der Thread kann also geschlossen werden, wenn wer das möchte
Antworten