
Продолжаю изучать криптографию, делюсь опытом. Нашел интересную особенность дискретного логарифма, которая превращается в математический бэкдор протокола Диффи — Хеллмана (далее DH).
Пробежимся по теории
Вспомним дискретный логарифм (далее DLOG) https://ru.wikipedia.org/wiki/Дискретное_логарифмирование
Нам нужен вариант DLOG в конечном поле , где p - простое число https://ru.wikipedia.org/wiki/Конечное_поле
Общеизвестно что задача DLOG является односторонней функцией https://ru.wikipedia.org/wiki/Односторонняя_функция т.е. поиск является трудной задачей.
Кроме полного перебора, существует много алгоритмов решения данной задачи https://ru.wikipedia.org/wiki/Дискретное_логарифмирование#Алгоритмы_решения (не будем их рассматривать).
Иногда поиск является тривиальной задачей, например:
если , то
если , то
Следует сказать что является первообразным корнем или примитивом https://ru.wikipedia.org/wiki/Первообразный_корень_(теория_чисел)
Для примитив
, проверим:
Обращаем внимание на последнюю строку, т.е. если , то
или
Итак, у нас есть уже три случая, когда поиск тривиален:
Как правило для анализа DLOG строят таблицу логарифмов:

По таблице логарифмов нарисуем график:

На графике ничего интересного, только хаотичное изменение показателя
Криптографический протокол DH построен на задаче DLOG https://ru.wikipedia.org/wiki/Протокол_Диффи_—_Хеллмана
Посмотрим пример прямо из вики:

Ничего сложного.
Далее пойдет новая или непубличная информация.
Основная часть
Будем анализировать DLOG как таблицу степеней. Таблица степеней это перевернутая таблица логарифмов (см. рис. ниже), слева — таблица степеней, справа — таблица логарифмов. Об этом я писал в статье "Как сгенерировать порождающие полиномы для конечных полей." https://habr.com/ru/articles/844300

Таблица степеней удобнее, так как можно наблюдать сразу несколько примитивов (), синим подчеркнута строка для примитива
, колонка для
не обозначена.
Далее посмотрим несколько таблиц степеней и обратим внимание на среднюю колонку

Имея ввиду экстраполяцию, можно предположить, что данная особенность распространяется на все множество таблиц степеней .
В средней колонке число показывает строки с уникальными значениями, значит в начале строки - примитив, наблюдаем также:
не касается последней строки, там
;
- простое число, иначе, например для
- непростое, поэтому будут "лишние" строки:
.
Математически это выглядит так:
Математики знакомые с критериями Эйлера https://ru.wikipedia.org/wiki/Критерий_Эйлера и квадратичным вычетом https://ru.wikipedia.org/wiki/Квадратичный_вычет увидят знакомое:
но здесь вместо установлено
!
Надо вспомнить модулярную арифметику https://en.wikipedia.org/wiki/Modular_arithmetic (статья в en-вики более понятна), фактически в данном случае , вернее так:
Используя вышесказанное, можно находить все примитивы конечного поля:

Общее количество примитивов конечного поля равно , где
— функция Эйлера totient https://ru.wikipedia.org/wiki/Функция_Эйлера
Посмотрим на таблицу степеней в виде графика, добавил нулевое значение
для симметричности, похож на "паука":

Вернемся в протоколу DH, изменим наименования переменных:
для Алисы:,
- открытый ключ,
- закрытый ключ.
для Боба: ,
- открытый ключ,
- закрытый ключ.
- общий секретный ключ, используется для шифровки - расшифровки сообщений.
Алиса вычисляет
Боб вычисляет
Рассмотрим канонический пример:
Алиса выбирает закрытый ключ
Боб выбирает закрытый ключ
Алиса вычисляет открытый ключ
Боб вычисляет открытый ключ
Алиса и Боб обмениваются открытыми ключами
Алиса вычисляет общий секретный ключ
Боб вычисляет общий секретный ключ
Алиса и Боб получили один и тот-же секретный ключ
, не передавая его по сети.
Теперь пример, когда закрытый ключ равен :
Алиса выбирает закрытый ключ
Боб выбирает закрытый ключ
Алиса вычисляет открытый ключ
Боб вычисляет открытый ключ
Алиса и Боб обмениваются открытыми ключами
Алиса вычисляет общий секретный ключ
Боб вычисляет общий секретный ключ
Злоумышленник перехватил открытый ключ и вычисляет закрытый ключ той-же Алисы по формуле (1):
Далее, для получения секретного ключа есть два способа:
1 способ. С помощью открытого ключа Боба
2 способ. Сразу, если хотя бы один из открытых ключей равен , то
или
, по формуле:
Внимательно посмотрите на последнюю строку любого , например см. рис. выше "Несколько таблиц степеней".
Я не нашел в открытых источниках запрета на использование в качестве закрытого ключа .
Данное выражение упоминается в статье: S. C. Pohlig and M. E. Hellman, "An improved algorithm for computing logarithms in GF(p) and its cryptographic significance." https://ee.stanford.edu/~hellman/publications/28.pdf, IEEE Trans. Info. Theory 24 (1978), 106–111.
В статье указано что должно быть простым числом для повышения безопасности.
Еще в статье можно встретить упоминание тривиального случая : "Also, restrictions might be imposed on K (e.g.,
) to avoid simple but improbable transformations." В переводе: "Кроме того, на K могут быть наложены ограничения (например,
), чтобы избежать простых, но маловероятных преобразований." (
- ключ).
Решение: запретить использовать в качестве закрытого ключа , дополняем список тривиальных случаев:
Можно найти еще? Попробуем.
Рассмотрим внимательно "паука", см. рис. выше, почему он симметричен?
Примитивы сгруппированы парами:

Когда-то я неправильно предположил, что эти пары взаимно простые, на самом деле они мультипликативно обратны по модулю https://ru.wikipedia.org/wiki/Обратное_по_модулю_число
Проверим:
Посмотрим график первой пары

Симметрично, не правда ли? и в табличном виде:

Мы выяснили выше, что мультипликативно обратны, проверим остальные пары:
Все пары мультипликативно обратны по модулю .
Возвращаемся к DH, рассмотрим пример:
Алиса выбирает закрытый ключ
Боб выбирает закрытый ключ
Алиса вычисляет открытый ключ
Боб вычисляет открытый ключ
Алиса и Боб обмениваются открытыми ключами
Алиса вычисляет общий секретный ключ
Боб вычисляет общий секретный ключ
Вроде все нормально, но!
Нам известен примитив
, мы можем получить мультипликативно обратный
при помощи расширенного алгоритма Евклида https://ru.wikipedia.org/wiki/Расширенный_алгоритм_Евклида
Сравниваем
с открытыми ключами, у Боба открытый ключ
, значит закрытый ключ Боба равен
, см. рис. ниже
Вычисляем секретный ключ

Бинго - вот вторая "дырка", согласно формуле:
Эту формулу можно вывести из Малой теоремы Ферма https://ru.wikipedia.org/wiki/Малая_теорема_Ферма
.
- это и есть обратное число -
Дополняем список тривиальных случаев:
Больше уязвимостей пока не нашел.
Можно еще посмотреть график поля (симметричность также видна) и таблицу, см. рисунки ниже:


Заключение
Предупреждения о предполагаемой сложности задачи DLOG, например:
"Криптографическая стойкость алгоритма Диффи — Хеллмана (то есть сложность вычисления
по известным
) основана на предполагаемой сложности задачи дискретного логарифмирования." Форматирование сохранено, источник: https://ru.wikipedia.org/wiki/Протокол_Диффи_—_Хеллмана#Криптографическая_стойкость
"A cryptographic system is described which is secure if and only if computing logarithms over
is infeasible." (мой перевод: "Описывается криптографическая система, которая является безопасной тогда и только тогда, когда вычисление логарифмов по
невозможно.") Источник: S. C. Pohlig and M. E. Hellman, "An improved algorithm for computing logarithms in GF(p) and its cryptographic significance." https://ee.stanford.edu/~hellman/publications/28.pdf IEEE Trans. Info. Theory 24 (1978), 106–111.
Что касается описанных в данной статье уязвимостях, то проблемы не такие большие. Необходимо в программное обеспечение, генерирующее закрытые ключи, добавить исключения: , остальные были известны и ранее.
Математические уязвимости существуют и должны быть общеизвестны.
Если нашли ошибки, пишите камменты.
"Поиграться" с таблицами степеней и определить примитивы можно в сервисе https://dlog.vladlin.ru/ (AS IS)
На задаче DLOG, кроме протокола Диффи-Хеллмана, базируются и другие, например:
Надо проверить :-)
update 1
1 Для случая с можно обойтись без расширенного алгоритма Евклида:
т.е., если примитив и публичный ключ
мультипликативно обратны, то секретный ключ
, в обратную сторону тоже работает.
2 Насчет Схемы Эль-Гамаля (вики), также основанной на трудности вычисления дискретных логарифмов.

Видим что выражением (выделено красным на картинке) "обходятся" только три тривиальных случая .
Скорее всего, в каких-то спецификациях написано больше.
Впрочем, схема Эль-Гамаля уже устарела и не рекомендуется к использованию.