Алгоритмы асимметричного шифрования
Алгоритм Диффи-Хеллмана
Первая публикация данного алгоритма открытого ключа появилась в статье Диффи и Хеллмана, в которой вводились основные понятия криптографии с открытым ключом и в общих чертах упоминался алгоритм обмена ключа Диффи-Хеллмана.
Цель алгоритма состоит в том, чтобы два участника могли безопасно обменяться ключом, который в дальнейшем может использоваться в каком-либо алгоритме симметричного шифрования. Сам алгоритм Диффи-Хеллмана может применяться только для обмена ключом.
Алгоритм основан на трудности вычислений дискретных логарифмов. Дискретный логарифм определяется следующим образом. Вводится понятие примитивного корня простого числа Q как числа, чьи степени создают все целые от 1 до Q–1. Это означает, что если А является примитивным корнем простого числа Q, тогда числа
являются различными и состоят из целых от 1 до Q–1 возможно с некоторыми перестановками.
В этом случае для любого целого B<Q и примитивного корня A простого числа Q можно найти единственную экспоненту Х, такую, что
Экспонента X называется дискретным логарифмом, или индексом Y, по основанию A (mod Q). Это обозначается как
Теперь опишем алгоритм обмена ключей Диффи-Хеллмана.
Общеизвестные элементы
Q - Простое число
A - A<Q и A является примитивным корнем Q
Предполагается, что существуют два известных всем числа: простое число Q и целое A, которое является примитивным корнем Q.
Создание пары ключей пользователем I
Выбор случайного числа Хi - закрытый ключ
Вычисление числа Yi - открытый ключ
Создание открытого ключа пользователем J
Выбор случайного числа Хj - закрытый ключ
Вычисление случайного числа Yj - открытый ключ
Теперь предположим, что пользователи I и J хотят обменяться ключом для алгоритма симметричного шифрования. Пользователь I выбирает случайное число Хi< Q и вычисляет Yi = AXi (mod Q). Аналогично пользователь J независимо выбирает случайное целое число Хj< Q и вычисляет Yj= AXj (mod Q).
Пользователи I и J обмениваются открытыми ключами Yi и Yj
Каждая сторона держит значение Х в секрете и делает значение Y доступным для другой стороны.
Создание общего секретного ключа пользователем I
Создание общего секретного ключа пользователем J
Теперь пользователь I вычисляет ключ К = (Yj)Xi (mod Q), и пользователь J вычисляет ключК = (Yi)Xj (mod Q). В результате оба получат одно и то же значение:
по правилам модульной арифметики
Таким образом, две стороны обменялись секретным ключом. Так как Хi и Хj являются закрытыми, противник может получить только следующие значения: Q, A, Yi и Yj. Для вычисления общего ключа атакующий должен взломать дискретный логарифм, т.е. вычислить
Безопасность обмена ключа в алгоритме Диффи-Хеллмана вытекает из того факта, что, хотя относительно легко вычислить экспоненты по модулю простого числа, но очень трудно вычислить дискретные логарифмы. Для больших простых чисел задача считается неразрешимой.
Следует заметить, что данный алгоритм уязвим для атак типа "man-in-the-middle". Если противник может осуществить активную атаку, т.е. имеет возможность не только перехватывать сообщения, но и заменять их другими, он может перехватить открытые ключи участников Yi и Yj, создать свою пару открытого и закрытого ключа (Xоп, Yоп)и послать каждому из участников свой открытый ключ. После этого каждый участник вычислит ключ, который будет общим с противником, а не с другим участником. Если нет аутентификации хотя бы одной из сторон внешним по отношению к алгоритму Диффи-Хеллмана способом, то участники не смогут обнаружить подобную подмену.