RC4 byRef issue

  • C#
  • .NET (FX) 1.0–2.0

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Niko Ortner.

    RC4 byRef issue

    Hey

    Ich hab wieder dieses byref-problem.
    Es geht um diese RC4 function :

    C#-Quellcode

    1. public void RC4(ref byte[] bytes, byte[] key)
    2. {
    3. byte[] s = new byte[256];
    4. byte[] k = new byte[256];
    5. byte temp;
    6. int i, j;
    7. for (i = 0; i < 256; i++)
    8. {
    9. s[i] = (byte)i;
    10. k[i] = key[i % key.GetLength(0)];
    11. }
    12. j = 0;
    13. for (i = 0; i < 256; i++)
    14. {
    15. j = (j + s[i] + k[i]) % 256;
    16. temp = s[i];
    17. s[i] = s[j];
    18. s[j] = temp;
    19. }
    20. i = j = 0;
    21. for (int x = 0; x < bytes.GetLength(0); x++)
    22. {
    23. i = (i + 1) % 256;
    24. j = (j + s[i]) % 256;
    25. temp = s[i];
    26. s[i] = s[j];
    27. s[j] = temp;
    28. int t = (s[i] + s[j]) % 256;
    29. bytes[x] ^= s[t];
    30. }
    31. }


    Ich möchte sie so modifizieren das das input array nicht bei reference übergeben wird, stattdessen soll einfach das encrypted byte array returned werden.
    Wichtig ist das das ursprüngliche input array unverändert bleibt..
    Ich hab das so versucht :

    C#-Quellcode

    1. public static byte[] RC4(byte[] bytes, byte[] key)
    2. {
    3. byte[] s = new byte[256];
    4. byte[] k = new byte[256];
    5. byte temp;
    6. int i, j;
    7. for (i = 0; i < 256; i++)
    8. {
    9. s[i] = (byte)i;
    10. k[i] = key[i % key.GetLength(0)];
    11. }
    12. j = 0;
    13. for (i = 0; i < 256; i++)
    14. {
    15. j = (j + s[i] + k[i]) % 256;
    16. temp = s[i];
    17. s[i] = s[j];
    18. s[j] = temp;
    19. }
    20. i = j = 0;
    21. for (int x = 0; x < bytes.GetLength(0); x++)
    22. {
    23. i = (i + 1) % 256;
    24. j = (j + s[i]) % 256;
    25. temp = s[i];
    26. s[i] = s[j];
    27. s[j] = temp;
    28. int t = (s[i] + s[j]) % 256;
    29. bytes[x] ^= s[t];
    30. }
    31. return bytes;
    32. }


    Allerdings ist auch das ursprüngliche array (myArr) verschlüsselt..
    Das soll aber nicht so sein. Warum passiert das, ich übergebe nichts byref..
    Ich hatte das Problem bereits vor einiger zeit in einem anderen thread, aber iwie verstehe ich nicht ganz wieso das passiert..
    C# Developer
    Learning C++

    Rinecamo schrieb:

    Kopier den Inhalt vom Array und arbeite darauf, Arrays gehören nicht zu den value types.
    msdn.microsoft.com/de-de/library/t63sy5hs.aspx

    Hm, kann man nicht irgendwie forcen das das bytearray byval übergeben wird. Ich wollte eig vermeiden die inhalte in ein neues array zu kopieren...
    C# Developer
    Learning C++
    Arrays sind Reference Types - die _kannst_ du also nicht als reines Value übergeben. Was du mit dem ref-Keyword gemacht hast, ist eine Referenz auf einen Reference Types zu erstellen, was in den wenigsten Fällen Sinn macht.

    nafets schrieb:

    Arrays sind Reference Types - die _kannst_ du also nicht als reines Value übergeben. Was du mit dem ref-Keyword gemacht hast, ist eine Referenz auf einen Reference Types zu erstellen, was in den wenigsten Fällen Sinn macht.



    Hm, ja was könnte ich dann machen um die funktion so umzuschreiben das das inputarray unverändert bleibt? bleibt das keine option als die daten in ein neues array zu kopieren
    ?
    C# Developer
    Learning C++
    Du kannst die Zeile 32 zu ​output[x] = bytes[x] ^ s[t] ändern - dann wird das Ergebnis in ein separates Array geschrieben. Das ist wahrscheinlich minimal performanter, als direkt am Anfang eine Kopie vom ​bytes-Array zu erstellen.
    Ich weiß das RC4 nicht die sicherste encryption ist, ich möchte sie aber gerne verwenden @Manawyrm

    @naftes :

    Ich glaub ich habs:

    C#-Quellcode

    1. ​public static byte[] RC4(byte[] bytes, byte[] key)
    2. {
    3. byte[] z = new byte[bytes.Length];
    4. byte[] s = new byte[256];
    5. byte[] k = new byte[256];
    6. byte temp;
    7. int i, j;
    8. for (i = 0; i < 256; i++)
    9. {
    10. s[i] = (byte)i;
    11. k[i] = key[i % key.GetLength(0)];
    12. }
    13. j = 0;
    14. for (i = 0; i < 256; i++)
    15. {
    16. j = (j + s[i] + k[i]) % 256;
    17. temp = s[i];
    18. s[i] = s[j];
    19. s[j] = temp;
    20. }
    21. i = j = 0;
    22. for (int x = 0; x < z.GetLength(0); x++)
    23. {
    24. i = (i + 1) % 256;
    25. j = (j + s[i]) % 256;
    26. temp = s[i];
    27. s[i] = s[j];
    28. s[j] = temp;
    29. int t = (s[i] + s[j]) % 256;
    30. z[x] = (byte)(bytes[x] ^ s[t]);
    31. }
    32. return z;
    33. }
    C# Developer
    Learning C++