RC4 — это симметричный алгоритм шифрования потоков, разработанный Роном Ривестом в 1987 году. Он используется в большинстве современных протоколов шифрования, таких как WEP, WPA, SSH и TLS. Алгоритм RC4 использует потоковое шифрование, которое означает, что данные проходят через шифровальную программу по одному байту за раз. Алгоритм использует дополнительную параметризованную секретную последовательность в качестве ключа для генерации индекса. Индекс используется для алгоритма XOR и генерирует «таблицу перестановок», которую используется для дальнейшего шифрования. Алгоритм RC4 использует перемешивание таблицы после прогона каждого байта данных.
Шифр разработан в компании RSA Security, и для его использования требуется соответствующая лицензия.
Алгоритм RC4, как и любой потоковый шифр, строится на основе генератора псевдослучайных битов. На вход генератора записывается ключ, а на выходе читаются псевдослучайные биты. Длина ключа может составлять от 40 до 2048 бит. Генерируемые биты имеют равномерное распределение.
Основные преимущества шифра:
- высокая скорость работы;
- переменный размер ключа.
RC4 довольно уязвим, если:
- используются не случайные или связанные ключи;
- один ключевой поток используется дважды.
Эти факторы, а также способ использования могут сделать криптосистему небезопасной (например, WEP).
Алгоритм работает примерно так:
1) Инициализация массива S со значениями от 0 до 255
2) Инициализация массива T со значениями от 0 до 255 в соответствии с ключом
3) Инициализация индекса i в нулевое значение
4) Инициализация индекса j в нулевое значение
5) Цикл от 0 до 255
6) Получить индекс i из массива S и добавить к нему значение j из массива T
7) Записать результат в индекс i массива S
8) Записать значение i массива S в индекс j массива T
9) Записать значение j массива T в индекс i массива S
10) Увеличить индекс i на 1
11) Увеличить индекс j на значение i массива S
12) Закончить цикл
13) Цикл для данных
14) Получить i из массива S
15) Записать значение i массива S в индекс j массива T
16) Записать значение j массива T в индекс i массива S
17) Увеличить индекс i на 1
18) Получить значение i из массива S и добавить к нему значение j из массива T
19) Записать полученный результат в индекс j массива T
20) Записать значение j массива T в индекс i массива S
21) Вычислить значение K как значение S[j] + S[i]
22) Зашифровать или расшифровать данные с использованием K
23) Увеличить индекс j на значение i массива S
24) Закончить цикл
25) Вернуть зашифрованные или расшифрованные данные