Одни из авторов идеи криптосистем с открытым ключом, Диффи и Хеллман предложили новую идею - открытое распределение ключей.
Они задались вопросом: можно ли организовать такую процедуру взаимодействия абонентов А и В по открытым каналам связи, чтобы решить следующие задачи:
1) вначале у А и В нет никакой общей секретной информации, но в конце процедуры такая общая секретная информация (общий ключ) у А и В появляется, т. е. вырабатывается;
2) пассивный противник, который перехватывает все передачи информации и знает, что хотят получить А и В, тем не менее не может восстановить выработанный общий ключ А и В.
Метод получил название метода экспоненциального ключевого обмена. Он был первой криптосистемой с открытым ключом, хотя для обмена ключами можно использовать любые криптосистемы с открытым ключом, например, тот же алгоритм RSA.
Криптостойкость данного метода определяется трудоемкостью вычисления дискретного логарифма:
f (х) = gх mod р,
где р — большое простое число, х — произвольное натуральное число, g — некоторый примитивный элемент поля Галуа GF (р). Общепризнано, что инвертирование функции gх mod р, т.е. дискретное логарифмирование, является трудной математической задачей.
|
|
Сама процедура или протокол выработки общего ключа заключается в следующем. Значения р и g являются общедоступными параметрами протокола. Абоненты A и В независимо друг от друга случайно выбирают по одному большому натуральному числу x а и xb. Это их секретные ключи. Далее каждый из них вычисляет открытые ключи:
y а = gx а mod р и у В = gxB mod р.
Потом они обмениваются этими элементами по каналу связи. Теперь абонент А, получив y В и зная свой секретный элемент х а, вычисляет новый элемент:
у В x а mod р = (gxB) x а mod р.
Аналогично поступает абонент В:
yAxB mod р = (gx а) xB mod р.
Тем самым у А и В появился общий элемент поля, равный gx а xB. Этот элемент и объявляется общим ключом абонентов A и В.
Необратимость преобразования в этом случае обеспечивается тем, что достаточно легко вычислить показательную функцию в конечном поле Галуа, состоящем из р элементов (р — простое число). Обратная задача вычисления x из y будет достаточно сложной. Если р выбрано достаточно правильно, то извлечение логарифма потребует вычислений, пропорциональных L(р) = exр { (ln р ln ln р)0.5}.
При всей простоте алгоритма Диффи-Хелмана его недостатком по сравнению с системой RSA является отсутствие гарантированной нижней оценки трудоемкости раскрытия ключа.
Алгоритмы практической реализации криптосистем с открытым ключом
Возведение в степень по модулю m
В криптографии используются вычисления по mod m, так как алфавит любой криптографической системы представляет собой конечное множество целых чисел. Арифметика вычетов к тому же легче реализуется на компьютерах, поскольку она ограничивает диапазон промежуточных значений и результата. Для k -битовых вычетов m промежуточные результаты любого сложения, вычитания или умножения будут не длиннее, чем 2 k бит. Поэтому в арифметике вычетов мы можем выполнить возведение в степень без огромных промежуточных результатов. Вычисление степени некоторого числа по модулю другого числа,
|
|
ad mod m,
представляет собой просто последовательность умножений и делений, но существуют приемы, ускоряющие это действие. Один из таких приемов стремится минимизировать количество умножений по модулю, другой - оптимизировать отдельные умножения по модулю. Так как операции дистрибутивны, быстрее выполнить возведение в степень как поток последовательных умножений, каждый раз получая вычеты.
Например, для того, чтобы вычислить а8 mod m, не выполняйте семь умножений и одно приведение по модулю; вместо этого выполните три меньших умножения и три меньших приведения по модулю:
а8 mod m = ((a2 mod m)2 mod m)2 mod m.
Точно также, а16 mod m = (((a2 mod m)2 mod m)2 mod m)2 mod m.
Вычисление ad mod m, где d не является степенью 2, не намного труднее. Двоичная запись представляет х в виде суммы степеней 2: число 25 — это бинарное 11001, поэтому 25 = 16 + 8 + 1. Тогда
a 25 mod m = (a a8 a16)mod m= (a *(((a*a2) 2) 2) 2) mod m.
С продуманным сохранением промежуточных результатов нам понадобится только шесть умножений:
(((((((a2 mod m)* a)2mod m)2mod m)2mod m)2mod m)2mod m *a)mod m.
Такой прием называется методом двоичных квадратов и умножений. Он использует простую и очевидную цепочку сложений, в основе которой лежит двоичное представление числа. Увеличение скорости вычислений при умножении 200-битовых чисел будет очень заметным.
Алгоритм вычисления ad mod m.
Пусть натуральные числа a и d не превосходят по величине т.
1. Представим d в двоичной системе счисления:
d = do2r + … + dr-12 + dr,
где r – число двоичных разрядов, di - цифры в двоичном представлении, равные 0 или 1, и do = 1.
2. Положим ao=a и затем для i = 1,.... r вычислим
aiº a2i-1 adi mod т.
Тогда ar есть искомый вычет ad mod m.
Справедливость этого алгоритма вытекает из легко доказываемого индукцией по i сравнения:
aiº ado2i+…+di mod т.
Так как каждое вычисление на шаге 2 требует не более трех умножений по модулю т и этот шаг выполняется r £ lo g 2 т раз, то сложность алгоритма может быть оценена величиной 0(ln m). Говоря о сложности алгоритмов, мы имеем в виду количество арифметических операций.
Второй алгоритм — это классический алгоритм Евклида вычисления наибольшего общего делителя целых чисел. Мы предполагаем заданными два натуральных числа а и b и вычисляем их наибольший общий делитель НОД(а, b).