"25 этюдов о шифрах" - читать интересную книгу автора

3.6. Открытое распределение ключей

Кроме принципа построения криптосистемы с открытым ключом, Диффи и Хеллмэн в той же работе предложили еще одну новую идею — открытое распределение ключей. Они задались вопросом: можно ли организовать такую процедуру взаимодействия абонентов A и B по открытым каналам связи, чтобы решить следующие задачи:

1) вначале у A и B нет никакой общей секретной информации, но в конце процедуры такая общая секретная информация (общий ключ) у A и B появляется, т.е. вырабатывается;

2) противник, который перехватывает все передачи информации и знает, что хотят получить A и B, тем не менее не может восстановить выработанный общий ключ A и B.

Диффи и Хеллмэн предложили решать эти задачи с помощью функции F(x) = #945;x(modp), где p — большое простое число, x — произвольное натуральное число, #945; — некоторый примитивный элемент поля GF(p).

Примитивным называется такой элемент a из GF(p), что каждый элемент поля, за исключением нуля, может быть представлен в виде степени a. Можно доказать, хотя это и не просто, что примитивный элемент всегда существует.

Общепризнано, что инвертирование функции #945;x(modp), т.е. дискретное логарифмирование, является трудной математической задачей (см. этюд 3.4).

Сама процедура или, как принято говорить, протокол выработки общего ключа описывается следующим образом.

Числа p и #945; считаются общедоступными.

Абоненты A и B независимо друг от друга случайно выбирают по одному натуральному числу — скажем x(A) и x(B). Эти элементы они держат в секрете. Далее каждый из них вычисляет новый элемент:

y(A)=#945;x(A)(modp), y(B)=#945;x(B)(modp).

Потом они обмениваются этими элементами по каналу связи. Теперь абонент A, получив y(B) и зная свой секретный элемент x(A), вычисляет новый элемент

y(B)x(A)(modp)=(#945;x(B))x(A)(modp).

Аналогично поступает абонент B:

y(A)x(B)(modp)=(#945;x(A))x(B)(modp).

Из свойств поля следует, что тем самым у A и B появился общий элемент поля, равный #945;x(A)x(B). Этот элемент и объявляется общим ключом A и B.

Из описания протокола видно, что противник знает p, #945;, #945;x(A), #945;x(B), не знает x(A) и x(B) и хочет узнать ax(A)x(B). В настоящее время нет алгоритмов действий противника, более эффективных, чем дискретное логарифмирование, а это — трудная математическая задача. (Рекомендуем самостоятельно найти за противника общий ключ, используя алгоритм дискретного логарифмирования и не принимая во внимание вопросы его сложности.)