Применение протокола Диффи-Хеллмана для защищенной передачи сообщений
Раздел:
Programming /
Криптография
@
01.02.2009 |
Ключевые слова: Диффи-Хеллман криптография
Автор: Евгений Архипочкин
В настоящей статье рассматривается пример использования протокола Диффи- Хеллмана для защищенной передачи сообщений между двумя модулями информационной системы.
В случае необходимости передачи конфиденциальной информации между рабочими станциями в сетях, как правило, используется протокол SSL или его модификации. Но зачастую задействовать такое «тяжелое» средство нецелесообразно, особенно если оба абонента находятся внутри одной системы (компьютера).
В свою очередь, использование протокола Диффи-Хеллмана позволяет создать подобие защищенного канала для передачи информации между двумя разнородными объектами, в том числе одной системы.
К примеру, в качестве пар таких объектов могут выступать:
- модуль клиентской части системы и хранимый пакет, написанный на PL\SQL в СУБД Oracle;
- тот же пакет PL\SQL и библиотека, разработанная на C++ и функционирующая на уровне ОС сервера СУБД Oracle.
«Разнородность» таких объектов заключается не только в том, что они написаны на разных языках программирования, но и в том, что они функционируют в различных средах и на разных уровнях системы, хотя в последнем примере оба компонента располагаются на одном сервере.
Для начала обратимся к теории [1]. Алгоритм Диффи-Хеллмана, относится к протоколам открытого распределения ключей и позволяет двум абонентам выработать общий секретный ключ путем динамического взаимодействия на основе обмена открытыми сообщениями без какой-либо общей секретной информации, распределяемой заранее.
Для выполнения алгоритма стороны должны договориться о значениях большого простого числа p и образующего элемента aмультипликативной группы . Для выработки общего ключа kони должны сгенерировать случайные числа x, 1 ≤ x≤ p – 2 и y, 1 ≤ y≤ p – 2, соответственно. Затем они должны обменяться сообщениями в соответствии с протоколом:
(1) A → B: ax mod p
(2) B → A: ax mod p
Искомый общий ключ теперь вычисляется по формуле:
k = (ay)x = (ax) y mod p
На выработанном таким образом ключе можно зашифровывать и расшифровывать сообщения с использованием любого доступного (то есть, реализованного на обоих объектах) алгоритма шифрования.Покажем, как на основе этого протокола может быть реализована схема передачи информации.
Пусть необходимо организовать взаимодействие программных модулей A и B. Не важно, на каких языках программирования они разработаны, и в каких средах они функционируют, главное, чтобы на каждом субъекте взаимодействия были доступны следующие криптографические средства:
- функции зашифрования и расшифрования на основе алгоритма с закрытым ключом k: b:=Enc(a, k) и а:=Dec(b, k) соответственно;
- функция генерации псевдослучайного значения Rand( ).
Для простоты будем считать, что все значения и сообщения передаются и возвращаются как аргументы и значения функций, реализованных в этих модулях. Перед названием функции через точку будем указывать модуль, которому она принадлежит.
Пусть инициатором взаимодействия выступает модуль A, которому необходимо защищенно получить от модуля Bсообщение message. В таком случае, взаимодействие можно построить следующим образом (см. схему 1).
Схема 1.
В модуле А:
1. Генерируются случайные значения rand1 и rand2.
2. Вычисляется открытый ключ модуля a_open_key = a rand2(modp), где p — простое число, a —примитивный элемент группы GF(p), a и p - константы
3. Вызывается функция B.f( ) модуля B, которой в качестве параметра передаётся rand1.
В модуле B:
4. Генерируется случайное значение rand и вычисляется открытый ключ модуля B: b_open_key = a rand1(modp).
5. Вызывается функция A.g( ), в качестве аргумента которой передается b_open_key.
6. Функция A.g( ) возвращает в качестве результата значение а_open_key.
7. На основе ключа модуля Aа_open_keyвычисляется сеансовый ключ: sec_key2 = a_open_key rand(modp).
8. На ключе rand1+sec_key2 (“+” — конкатенация) зашифровывается сообщение: message’= Enc(message, rand1+sec_key2);
9. Возвращается зашифрованное message’ как результат вызова функции B.f( ).
В модуле А:
10. В модуле A вычисляется сессионный ключ g_key = b_open_key rand2(modp).
11. На ключе rand1+g_key расшифровывается сообщение: message= Dec(message’, rand1+g_key).
Таким образом, сообщение messageпередается в зашифрованном виде, но ключ шифрования в канале связи не появляется. Более того, при достаточно большиха и p вычислить ключ на основании переданной по каналу связи информации за разумное время невозможно.
Необходимо отметить, что протокол Диффи-Хеллмана является одним из самых простых протоколов распределения ключей и обладает определенными недостатками [1]. Известны более совершенные алгоритмы, например, STS (station-to-station), предполагающий дополнительное применение цифровой подписи, или протокол MTI (Мацумото-Такашима-Имаи) с модифицированной процедурой выработки общего ключа. Но рассмотренный в силу своей наглядности протокол Диффи-Хеллмана является удобным для реализации с помощью самых простых средств. После успешной реализации доработать его до STS вам не составит труда.
Литература.
1. Алферов А.П., Зубов А.Ю., Кузьмин А.С., Черемушкин А.В. Основы криптографии. 3-е изд., испр. и доп. — М.: Гелиос АРБ, 2005.
Евгений Архипочкин
Руководитель Группы проектирования систем защиты информации компании CBOSS
http://www.cboss.ru/
Это интересно:
Распечатать статью
Вернуться в раздел:
Programming /
Криптография
Реклама: