Переведите кто то с C# в C++ (RC4)

Тема в разделе "LANGS.C", создана пользователем r2max, 1 сен 2011.

  1. r2max

    r2max Женя

    Публикаций:
    0
    Регистрация:
    30 мар 2011
    Сообщения:
    40
    Адрес:
    Киев
    Очень прошууу)
    Переведите кто то с C# в С++
    Я пытался но ничего не получается(
    Код (Text):
    1. using System;
    2. using System.Linq;
    3.  
    4.  
    5. namespace RC4_Testing
    6. {
    7.     public class RC4
    8.     {
    9.         byte[] S = new byte[256];
    10.  
    11.         int x = 0;
    12.         int y = 0;
    13.  
    14.         public RC4(byte[] key)
    15.         {
    16.             init(key);
    17.         }
    18.  
    19.         // Key-Scheduling Algorithm
    20.         // Алгоритм ключевого расписания
    21.         private void init(byte[] key)
    22.         {
    23.             int keyLength = key.Length;
    24.  
    25.             for (int i = 0; i < 256; i++)
    26.             {
    27.                 S[i] = (byte)i;
    28.             }
    29.  
    30.             int j = 0;
    31.             for (int i = 0; i < 256; i++)
    32.             {
    33.                 j = (j + S[i] + key[i % keyLength]) % 256;
    34.                 S.Swap(i, j);            
    35.             }
    36.         }
    37.  
    38.         public byte[] Encode(byte[] dataB, int size)
    39.         {      
    40.             byte[] data = dataB.Take(size).ToArray();              
    41.  
    42.             byte[] cipher = new byte[data.Length];
    43.  
    44.             for (int m = 0; m < data.Length; m++)
    45.             {              
    46.                 cipher[m] = (byte)(data[m] ^ keyItem());
    47.             }
    48.  
    49.             return cipher;
    50.         }
    51.         public byte[] Decode(byte[] dataB, int size)
    52.         {
    53.             return Encode(dataB, size);
    54.         }
    55.        
    56.         // Pseudo-Random Generation Algorithm
    57.         // Генератор псевдослучайной последовательности
    58.         private byte keyItem()
    59.         {
    60.             x = (x + 1) % 256;
    61.             y = (y + S[x]) % 256;
    62.  
    63.             S.Swap(x, y);
    64.  
    65.             return S[(S[x] + S[y]) % 256];
    66.         }    
    67.     }
    68.  
    69.     static class SwapExt
    70.     {
    71.         public static void Swap<T>(this T[] array, int index1, int index2)
    72.         {
    73.             T temp = array[index1];
    74.             array[index1] = array[index2];
    75.             array[index2] = temp;
    76.         }
    77.     }
    78. }
    Ну и мой кривой недоделанный вариант

    Код (Text):
    1. class RC4
    2. {
    3. public:
    4.  
    5.     int X, Y;
    6.     char S[256];
    7.  
    8.     RC4(byte key[])
    9.     {
    10.         init(key);
    11.     }
    12.  
    13.     // Алгоритм ключевого расписания
    14.     void init(char key[])
    15.     {
    16.         int keyLength = sizeof(key);
    17.         for (int i = 0; i < 256; i++)
    18.         {
    19.             S[i] = (char)i;
    20.         }
    21.  
    22.         int j = 0;
    23.         for (int i = 0; i < 256; i++)
    24.         {
    25.             j = (j + S[i] + key[i % keyLength]) % 256;
    26.             byte _i = S[i];
    27.             byte _j = S[j];
    28.             S[j]=_i;
    29.             S[i]=_j;
    30.         }
    31.     }
    32.    
    33.     char * Encode(char * dataB, int size)
    34.     {      
    35.         char * data = dataB.Take(size).ToArray();              
    36.  
    37.         char * cipher = new char[data.Length];
    38.  
    39.         for (int m = 0; m < data.Length; m++)
    40.         {              
    41.             cipher[m] = (char)(data[m] ^ keyItem());
    42.         }
    43.  
    44.         return cipher;
    45.     }
    46.    
    47.     char * Decode(char * dataB, int size)
    48.     {
    49.         return Encode(dataB, size);
    50.     }
    51.    
    52.     char keyItem()
    53.     {
    54.         x = (x + 1) % 256;
    55.         y = (y + S[x]) % 256;
    56.  
    57.         S.Swap(x, y);
    58.  
    59.         return S[(S[x] + S[y]) % 256];
    60.     }
    61. }
     
  2. artkar

    artkar New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2005
    Сообщения:
    400
    Адрес:
    Russia
    А чё не так? У шарпа синтаксис С, только фреймворковские объкты переделать.
    К сожалению нет студии, помочь не могу.
     
  3. Guest

    Guest Guest

    Публикаций:
    0
    Код (Text):
    1.             VOID rc4(UINT8* pbData, UINT32 dwDataLen, char* key)
    2.             {
    3.                 UINT8 x, y, state[256];
    4.                 UINT32 i, i2;
    5.  
    6.                 auto l_swap_byte = [](UINT8* a, UINT8* b) -> VOID
    7.                 {
    8.                     UINT8 swapByte;
    9.  
    10.                     swapByte = *a;
    11.                     *a = *b;
    12.                     *b = swapByte;
    13.                 };
    14.  
    15.                 for (i = 0; i < 256; i++)
    16.                 {
    17.                     state[(UINT8)i] = (UINT8)i;
    18.                 }
    19.  
    20.                 for (i2 = i = x = y = 0; i < 256; i++)
    21.                 {
    22.                     y = ((UINT8)key[i2++] + state[i] + y) & 0xFF;
    23.                     l_swap_byte(&state[i], &state[y]);
    24.                     if (key[i2] == 0)
    25.                     {
    26.                         i2 = 0;
    27.                     }
    28.                 }
    29.  
    30.                 for (i = x = y = 0; i < dwDataLen; i++)
    31.                 {
    32.                     x = (x + 1) & 0xFF;
    33.                     y = (state[x] + y) & 0xFF;
    34.                     l_swap_byte(&state[x], &state[y]);
    35.                     pbData[i] ^= state[(UINT8)((UINT8)state[x]+(UINT8)state[y])];
    36.                 }
    37.             }
    38.  
    39.             VOID rc4(LPVOID lpData, UINT32 dwSize, LPSTR lpszKey)
    40.             {
    41.                 rc4(reinterpret_cast<LPBYTE>(lpData), dwSize, lpszKey);
    42.             }
     
  4. apple

    apple Виктор

    Публикаций:
    0
    Регистрация:
    26 апр 2005
    Сообщения:
    907
    Адрес:
    Russia
    ТС,
    просто интересно, будет ли быстрее что-то типа
    Код (Text):
    1. #define SWAP(x,y) ( ((x) == (y)) || ( ((x) ^= (y)), ((y) ^= (x)), ((x) ^= (y)) ) )
    массив еще добавьте

    Код (Text):
    1.  
    2. for (i = 0; i < 256; i++)
    3. {
    4.      state[(UINT8)i] = (UINT8)i;
    5. }
    6.  
    7. for (i2 = i = x = y = 0; i < 256; i++)
    8. {
    9.    ...
    и может это в один цикл запихать?
     
  5. Guest

    Guest Guest

    Публикаций:
    0
    тогда уж x^=y^=x^=y
    p.s. в один цикл не положить, можно только визуально укоротить.
     
  6. apple

    apple Виктор

    Публикаций:
    0
    Регистрация:
    26 апр 2005
    Сообщения:
    907
    Адрес:
    Russia
    ну а если встретим своп для той же ячейки.
    ps. да, неукоротить, поспешил. а если высчитывать ее в том же цикле (втором)