
Лекции (Все подряд) / Потоковые шифры
.docПотоковые шифры
Потоковые шифры представляют собой разновидность гаммирования и преобразуют открытый текст в шифрованный последовательно по 1 биту. Генератор ключевой последовательности выдает последовательность бит k1 , k2, ..., ki, ... Эта ключевая последовательность складывается по модулю 2 с последовательностью бит исходного текста р1, р2 ...,pi, … для получения шифрованного текста:
ci
= рi
ki
.
На приемной стороне шифрованный текст складывается по модулю 2 с идентичной ключевой последовательностью для получения исходного текста:
ciki=
pi
ki
ki
= pi
Стойкость системы целиком зависит от внутренней структуры генератора ключевой последовательности. Если генератор выдает последовательность с небольшим периодом, то стойкость системы будет невелика. Напротив, если генератор будет выдавать бесконечную последовательность истинно случайных бит, то мы получим «ленту однократного использования» с идеальной стойкостью.
Реальная стойкость потоковых шифров лежит где-то посредине между стойкостью простой моноалфавитной подстановки и «ленты однократного использования». Генератор ключевой последовательности выдает поток битов, который выглядит случайным, но в действительности является детерминированным и может быть в точности воспроизведен на приемной стороне. Чем больше генерируемый поток похож на случайный, тем больше усилий потребуется от криптоаналитика для взлома шифра.
Однако, если каждый раз при включении генератор будет выдавать одну и ту же последовательность, то взлом криптосистемы будет тривиальной задачей. Перехватив два шифрованных текста, злоумышленник может сложить их по модулю 2 и получить два исходных текста, сложенных также по модулю 2. Такую систему раскрыть очень просто. Если же в руках противника хотя бы один раз окажется пара «исходный текст-шифрованный» текст, задача вообще становится тривиальной.
По этой причине все потоковые шифры предусматривают использование ключа. Выход генератора ключевой последовательности зависит от этого ключа. В этом случае простой криптоанализ будет невозможен.
Потоковые шифры наиболее пригодны для шифрования непрерывных потоков данных, например, в сетях передачи данных.
Самосинхронизирующиеся шифры
В 1946 году в США была запатентована базовая идея так называемых самосинхронизирующихся потоковых шифров (или шифрования с автоключом - Cipher-Text Auto Key (CTAK)). Она заключается в том, что внутреннее состояние генератора является функцией фиксированного числа предшествующих битов шифрованного текста. Поскольку внутреннее состояние зависит только от п бит шифрованного текста, генератор на приемной стороне войдет в синхронизм с передающей стороной после получения п бит.
Реализация этого подхода выглядит следующим образом. Каждое сообщение предваряется случайным заголовком длиной п бит. Этот заголовок шифруется и передается в линию. На приемной стороне заголовок расшифровывается. Результат дешифрования будет неверным, но после обработки п бит заголовка оба генератора будут синхронизированы.
Недостатком системы является распространение ошибок. При искажении одного бита генератор на приемной стороне выдаст п неверных бит ключевой последовательности, пока ошибочный бит не будет вытолкнут из памяти, что приведет к ошибочному дешифрованию п бит исходного текста.
Кроме того, самосинхронизирующиеся шифры уязвимы для атак типа «воспроизведение». Злоумышленник записывает некоторое количество бит шифрованного текста. Затем, позднее, он подменяет биты трафика записанными - «воспроизводит» их. После некоторого количества «мусора», пока приемная сторона не синхронизируется, старый шифрованный текст будет расшифровываться нормально. У приемной стороны нет никаких средств определения того, что принимаемые данные не являются актуальными.
Самосинхронизирующиеся потоковые шифры могут быть реализованы в виде блочных шифров, используемых в режиме обратной связи по шифрованному тексту. При этом за один раз может шифроваться произвольное число бит, меньшее либо равное длине блока.
Синхронные шифры
В синхронных потоковых шифрах выходные значения генератора не зависят от исходного или шифрованного текстов.
Основная сложность в данном подходе заключается в необходимости синхронизации генераторов ключа на передающей и приемной сторонах. Если в процессе передачи произошло выпадение или вставка хотя бы одного бита, то вся последовательность битов шифрованного текста после ошибочного бита не сможет быть расшифрована. Если такое произойдет, стороны должны провести повторную синхронизацию. При этом синхронизация должна быть проведена так, чтобы никакой отрезок ключевой последовательности не повторился, так что очевидное решение возвратиться к некоторому предыдущему состоянию генератора не подходит.
Положительным свойством синхронных потоковых шифров является отсутствие эффекта распространения ошибок. Один искаженный бит при передаче приведет к искажению только одного бита текста при дешифровании.
Синхронные шифры также защищают от вставок и выбрасываний отрезков шифрованного текста из потока. Такие операции приведут к нарушению синхронизации, что будет сразу же обнаружено на приемной стороне.
Однако, такие шифры уязвимы к изменению отдельных бит. Если злоумышленник знает исходный текст, то он сможет изменять биты в потоке шифрованного текста таким образом, что он будет расшифровываться так, как необходимо злоумышленнику.
Алгоритм RC4
RC4 представляет собой потоковый шифр с переменной длиной ключа, разработанный в 1987 г. Роном Райвестом для компании RSA Data Security, Inc. С 1994 г он тех пор стал доступен для независимого анализа.
Алгоритм работает в режиме OFB.
Ключевая последовательность не зависит
от исходного текста. Структура алгоритма
включает блок замены размерностью 8
8: S0, ...,
S255. Блок замены
представляет собой зависимую от ключа
переменной длины перестановку чисел
0,...,255. Имеется два счетчика i
и j, первоначально равные 0. Для
генерирования псевдослучайного
байта выполняются следующие действия:
i=(i+1) mod 256
j = (j + Si) mod 256
переставить Si и Sj
t = (Si+ Sj) mod 256
k =St.
Затем байт k складывается по модулю 2 с байтом исходного текста для получения шифрованного.
Инициализация блока замены также проста. Вначале он заполняется линейно: S0=0, S1 = 1, …, S255=255. Затем заполняется еще один 256-байтовый массив ключом, при этом ключ может повторяться необходимое число раз для заполнения всего массива: k0,, …,k255. Счетчик j устанавливается в 0. После чего производятся следующие действия:
for i=0 to 255
j= (j + ki + Si) mod 256
переставить Si и Sj.
Шифрование по этому алгоритму примерно в 10 раз быстрее, чем шифрование DES при программной реализации.
Возможно обобщение алгоритма на большие
длину слова и размер блока замены.
Так, можно построить шифр с блоком замены
размерностью 1616
(потребуется 128 Кбайт памяти) и длиной
слова 16 бит. Этап инициализации будет
значительно медленнее, необходим цикл
до 65535, если мы хотим в точности следовать
конструкции, но получившийся в результате
алгоритм будет более быстрым.