Очень прошууу) Переведите кто то с C# в С++ Я пытался но ничего не получается( Код (Text): using System; using System.Linq; namespace RC4_Testing { public class RC4 { byte[] S = new byte[256]; int x = 0; int y = 0; public RC4(byte[] key) { init(key); } // Key-Scheduling Algorithm // Алгоритм ключевого расписания private void init(byte[] key) { int keyLength = key.Length; for (int i = 0; i < 256; i++) { S[i] = (byte)i; } int j = 0; for (int i = 0; i < 256; i++) { j = (j + S[i] + key[i % keyLength]) % 256; S.Swap(i, j); } } public byte[] Encode(byte[] dataB, int size) { byte[] data = dataB.Take(size).ToArray(); byte[] cipher = new byte[data.Length]; for (int m = 0; m < data.Length; m++) { cipher[m] = (byte)(data[m] ^ keyItem()); } return cipher; } public byte[] Decode(byte[] dataB, int size) { return Encode(dataB, size); } // Pseudo-Random Generation Algorithm // Генератор псевдослучайной последовательности private byte keyItem() { x = (x + 1) % 256; y = (y + S[x]) % 256; S.Swap(x, y); return S[(S[x] + S[y]) % 256]; } } static class SwapExt { public static void Swap<T>(this T[] array, int index1, int index2) { T temp = array[index1]; array[index1] = array[index2]; array[index2] = temp; } } } Ну и мой кривой недоделанный вариант Код (Text): class RC4 { public: int X, Y; char S[256]; RC4(byte key[]) { init(key); } // Алгоритм ключевого расписания void init(char key[]) { int keyLength = sizeof(key); for (int i = 0; i < 256; i++) { S[i] = (char)i; } int j = 0; for (int i = 0; i < 256; i++) { j = (j + S[i] + key[i % keyLength]) % 256; byte _i = S[i]; byte _j = S[j]; S[j]=_i; S[i]=_j; } } char * Encode(char * dataB, int size) { char * data = dataB.Take(size).ToArray(); char * cipher = new char[data.Length]; for (int m = 0; m < data.Length; m++) { cipher[m] = (char)(data[m] ^ keyItem()); } return cipher; } char * Decode(char * dataB, int size) { return Encode(dataB, size); } char keyItem() { x = (x + 1) % 256; y = (y + S[x]) % 256; S.Swap(x, y); return S[(S[x] + S[y]) % 256]; } }
А чё не так? У шарпа синтаксис С, только фреймворковские объкты переделать. К сожалению нет студии, помочь не могу.
Код (Text): VOID rc4(UINT8* pbData, UINT32 dwDataLen, char* key) { UINT8 x, y, state[256]; UINT32 i, i2; auto l_swap_byte = [](UINT8* a, UINT8* b) -> VOID { UINT8 swapByte; swapByte = *a; *a = *b; *b = swapByte; }; for (i = 0; i < 256; i++) { state[(UINT8)i] = (UINT8)i; } for (i2 = i = x = y = 0; i < 256; i++) { y = ((UINT8)key[i2++] + state[i] + y) & 0xFF; l_swap_byte(&state[i], &state[y]); if (key[i2] == 0) { i2 = 0; } } for (i = x = y = 0; i < dwDataLen; i++) { x = (x + 1) & 0xFF; y = (state[x] + y) & 0xFF; l_swap_byte(&state[x], &state[y]); pbData[i] ^= state[(UINT8)((UINT8)state[x]+(UINT8)state[y])]; } } VOID rc4(LPVOID lpData, UINT32 dwSize, LPSTR lpszKey) { rc4(reinterpret_cast<LPBYTE>(lpData), dwSize, lpszKey); }
ТС, просто интересно, будет ли быстрее что-то типа Код (Text): #define SWAP(x,y) ( ((x) == (y)) || ( ((x) ^= (y)), ((y) ^= (x)), ((x) ^= (y)) ) ) массив еще добавьте Код (Text): for (i = 0; i < 256; i++) { state[(UINT8)i] = (UINT8)i; } for (i2 = i = x = y = 0; i < 256; i++) { ... и может это в один цикл запихать?
ну а если встретим своп для той же ячейки. ps. да, неукоротить, поспешил. а если высчитывать ее в том же цикле (втором)