- •Методические материалы
- •1. Основные понятия
- •2. Традиционные криптосистемы
- •2.1. Некоторые особенности криптосистем. Примеры традиционных криптосистем
- •2.2. Теоретическая стойкость криптосистем 2
- •2.2.1. Системы с совершенной секретностью
- •2.2.2. Шифр Вернама
- •2.2.3. Элементы теории информации
- •2.2.4. Расстояние единственности шифра с секретным ключом
- •2.3. Современные криптосистемы с секретным ключом 4
- •2.3.1. Основные положения
- •2.3.2. Блоковые шифры
- •2.3.2.1. Общие положения
- •2.3.2.2. Блоковый шифр гост 28147-89
- •2.3.2.3. Режимы функционирования блоковых шифров
- •2.3.3. Потоковые шифры
- •2.3.3.1. Общие положения
- •2.3.3.2. Режим ofb блокового шифра
- •2.3.3.3. Режим ctr блокового шифра
- •2.3.3.4. Алгоритм rc4 6
- •3. Криптосистемы с открытым ключом 7
- •3.1. Основные положения
- •3.2. Криптосистема Диффи-Хеллмана
- •3.3. Шифр Шамира
- •3.4. Шифр Эль-Гамаля
- •3.5. Шифр rsa. Односторонняя функция с "лазейкой"
- •3.6. Цифровая (электронная) подпись
- •3.6.1. Криптографические хеш-функции
- •3.6.2. Цифровая подпись rsa
- •3.6.3. Цифровая подпись на базе шифра Эль-Гамаля
- •3.6.4. Стандарты на цифровую подпись
- •3.7. Криптографические протоколы
- •3.7.1. Протокол для доказательства с нулевым знанием
- •3.7.2. Протокол для поддержки электронных денег
- •Рекомендуемая литература
3. Криптосистемы с открытым ключом 7
3.1. Основные положения
Укажем вначале три практические задачи, которые приводят к целесообразности применения криптосистем с так называемым открытым ключом:
хранение паролей в компьютере. Проблема заключается в том, что если пароль хранить на жестком диске, противник ℰ может прочитать его, а затем использовать для несанкционированного доступа к данным (особенно просто это сделать, если ℰ это администратор системы);
опознавание самолетов по признаку "свой–чужой". Здесь проблема возникает в связи с тем, что пароль должен предаваться по открытому каналу, следовательно, ℰ может перехватить пароль;
удаленный доступ в компьютерных сетях (например, доступ клиента к сеансу работы в банке по паролю). Здесь проблема аналогична предыдущей.
Сегодня все эти проблемы могут решаться с помощью криптографических методов. Решение основано на применении односторонних функций (one-way function). Дадим нестрогое качественное определение таких функций.
Определение: Пусть дана функция
y = f(x), (3.1)
определенная на конечном множестве Х, для которой существует обратная функция
x = f 1(y). (3.2)
Эта функция называется односторонней, если вычисление по (3.1) – простая задача, а вычисление по (3.2) – сложная задача, требующая привлечения больших вычислительных ресурсов, например, более 106 лет работы суперкомпьютера.
Простейший пример односторонней функции:
y = ax mod p, (3.3)
где р – простое число, а х – целое число из множества {1,..., p1}.
Соответствующая обратная функция имеет вид:
x = logay mod p. (3.4)
Ее принято называть дискретным логарифмом.
Для того чтобы обеспечить необходимую трудность вычисления обратной функции даже при использовании лучших современных компьютеров, в данной односторонней функции используют числа размером более 512 бит.
На практике применяют и другие односторонние функции, например, криптографические хеш-функции. При выполнении ряда требований к таким функциям допустимо использовать существенно более короткие числа – ~60120 бит.
Покажем, что вычисление по формуле (3.3) может выполняться достаточно быстро. Продемонстрируем это на простом примере вычисления a16 mod p. Можем записать:
a16 mod p = mod p,
То есть значения этой функции вычисляется всего за 4 операции умножения, а не за 15, как при использовании "наивного" варианта: аа...а.
Опишем общий алгоритм. Введем величину t = [log2x]. Рассчитываем числа ряда
a, a2, a4, a8, ... , a2t (mod p) (3.5)
В этом ряду каждое число получается путем умножения предыдущего числа самого на себя по модулю р. Запишем показатель степени х в двоичной системе счисления:
x = (xt xt1 ... x1 x0 )2 .
Тогда y = ax mod p может быть вычислено так:
y = mod p (3.6)
(все вычисления проводят по модулю р).
В общем случае справедливо следующее утверждение:
количество операций умножения при вычислении по (3.3) не превосходит 2log2x. Соответственно, если использовать значения показателя х из диапазона 1,..., p1, то количество операций умножения не превосходит 2log2р. |
Практически важно то, что столь же эффективные алгоритмы вычисления обратной функции (3.4) не известны. В настоящее время известно несколько методов вычисления обратной функции. Простейший из них – "шаг младенца, шаг великана" требует порядка операций умножения. Соответственно, сложность вычисления прямой и обратной функций можно охарактеризовать следующей таблицей.
Таблица 3.1
Количество десятичных знаков в записи числа р |
Количество операций умножения при вычислении (3.3) 2log2р |
Количество операций умножения при вычислении (3.4) |
12 |
80 |
2106 |
60 |
400 |
21030 |
90 |
600 |
21045 |
Таким образом, если используется суперкомпьютер, который умножает два 90-значных числа за 1014 сек. (что недостижимо для современных компьютеров), то, например, для последнего варианта из табл. 3.1 получим:
Твыч. (3.3) = 6001014 = 61012 сек.;
Твыч. (3.4) = 10451014 = 1031 сек. 1022 лет.
Самые быстрые из известных в настоящее время методов вычисления дискретных логарифмов имеют порядок временной сложности:
Т < c1 .
(Это один из вариантов алгоритма исчисления порядка, называемый Number Field Sieve). Соответственно они порождают более жесткие требования к параметрам односторонней функции вида (3.3) – как уже отмечалось обычно полагается, что модуль р должен иметь размер не менее 1024 бит (по данным на 2003 год).
Рассмотрим, теперь на конкретных примерах идею применения односторонних функций.
Пример 1. Обеспечение доступа к данным компьютера по паролю.
Решение это задачи основано на том, что непосредственно пароли вообще не хранятся. При регистрации на компьютере пользователь набирает свое имя, например, "фрукт" и пароль, например, "абрикос". Компьютер преобразует слово "абрикос" в двоичное представление и считает его значением переменной x. Далее вычисляется значение переменной y по формуле (3.3). После этого в памяти компьютера постоянно хранится пара ("имя", y). В дальнейшем, всякий раз, когда этот пользователь входит в компьютер, он набирает пару ("фрукт", "абрикос"), компьютер по паролю из этой пары вычисляет значение переменной y и сравнивает полученное значение с хранящимся в памяти. Если совпадение есть, то пользователь допускается к работе.
Если противник ℰ попытается вычислить значение пароля x по хранящемуся в компьютере значению y, то он не сможет это сделать из-за непомерных затрат времени.
Пример 2. Опознавание самолетов средствами противовоздушной обороны (ПВО) по признаку "свой–чужой" (по-видимому, эта задача была первой, когда на практике использовались односторонние функции).
Каждому своему самолету присваивается секретное имя, известное и летчику (бортовому компьютеру) и системе ПВО. Пусть, например, это имя СОКОЛ и пусть самолет с этим именем приближается к границе 16 ноября 2004 года в 12 часов 45 минут. Тогда перед приближением к границе бортовой компьютер самолета формирует слово
СОКОЛ 04 11 16 12 45
Рассматривая полученное слово как значение переменной x, бортовой компьютер вычисляет y по формуле (3.3), в которой числа a и p не секретны (!). Затем самолет сообщает значение y станции ПВО. Станция сравнивает полученное значение с аналогичным значением, вычисляемым ею по тому же алгоритму и по тем же исходным данным и при совпадении опознает самолет как "свой". (Станция ПВО вынуждена рассчитывать значение y для всех секретных имен типа СОКОЛ).
Рассмотренный вариант опознавания требует точной синхронизации часов самолета и станции ПВО. Один из вариантов решения – открытая передача меток времени службой навигации. Он уязвим к некоторым возможным действиям противника. Более защищенным является вариант, когда вместо меток времени по дополнительному открытому каналу передачи данных от станции ПВО к самолету передается случайно сгенерированное число, которое и используется вместо даты при формировании значения переменной x.