Как известно, последняя революция в криптографии случилась в 1976 году из-за статьи “New Directions in Cryptography” американских ученых Уитфилда Диффи (Whitfield Diffie) и Мартина Хеллмана (Martin Hellman).  Эта работа оказалась для последующего развития криптографии как «Большой Взрыв» — произошло рождение новой вселенной асимметричной криптографии. До этого момента (во всяком случае в открытой печати) существовала только симметричная криптография. Молодыми и никому тогда не известными учеными впервые была предложена схема, в которой для выработки общего секрета абонентам изначально не надо было обмениваться какими-либо секретными ключами. Помимо своей первозданности этот алгоритм интересен тем, что несмотря на то, что могут устаревать “сложные” задачи, лежащие в основе его безопасности, их можно успешно заменять новыми. Изначально это была задача дискретного логарифмирования в мультипликативной группе конечного поля (Discrete Logarithm Problem, сокр. — DLP), сейчас на практике широко используется задача дискретного логарифмирования в группе точек эллиптической кривой (Elliptic Curve DLP — ECDLP). В будущем (не таком уж далеком) предполагается использовать другие “сложные” задачи, которые будет иметь экспоненциальную сложность не только на классическом, но и на квантовом компьютере. Они называются постквантовыми. Одной из таких задач является задача нахождения изогении между эллиптическими кривыми, о которой я хочу рассказать в этой статье.  Поскольку цель статьи – максимально просто объяснить новый математический “движок” для протокола Диффи-Хеллмана (Diffie-Hellman или сокращенно — DH), то не рассматриваются некоторые атаки: мы предполагаем, что злоумышленник может только читать сообщения в канале, но не может вмешиваться в работу канала, чтобы перехватывать сообщения абонентов и отправлять свои (т.е. злоумышленник не “Человек посередине”). На практике (к примеру, в протоколе TLS) на открытые ключи DH может ставиться подпись и тут уже Человек Посередине подменить ключ DH не может: от сервера клиенту открытый ключ DH приходит как сертификат, от клиента к серверу – временный (ephemeral) ключ, подписанный на постоянном закрытом ключе ЭЦП клиента. В общем, в суровой реальности от подмены открытых ключей DH спасает технология PKI, основанная на доверии обеих сторон одному УЦ. Но, опять же, чтобы не отвлекать читателя от главного – математики, про PKI я ничего не пишу в этой статье. И еще раз: поскольку известны случаи, когда реализовывались и внедрялись системы, в которых стороны обменивались временными (ephemeral) открытыми ключами, которые стороны никак не проверяли (видимо те, кто их проектировал считали себя слишком занятыми людьми, чтобы изучить основы криптографии или хотя бы обратиться к специалистам), то прошу не забывать, что в реальной жизни это необходимо. Человек Посередине (он же Посредник, он же Man-in-the-middle) – это не Снежный Человек и он существует. Алиса и Боб изначально выбирают параметры (domain parameters): мультипликативную группу конечного поля и g — генератор ее подгруппы. Ничего страшного в слове генератор нет. Это всего лишь один из элементов группы со следующим свойством: если взять его степени от 1 до числа элементов группы, мы получим всю группу целиком. Подгруппа – это подмножество группы, которая сама по себе – тоже группа (при перемножении ее элементов в любых сочетаниях, мы получим только элементы этого самого подмножества).  Элементы группы: числа от 1 до p — 1, где p – простое число.  Групповая операция a*b mod p: умножаем элементы группы a и b, затем a*b делим на p. Остаток от деления a*b на p и есть результат операции a*b mod p.  К примеру, пусть модуль p равен 11. Чаще всего обозначается как . Состоит из 11 – 1 = 10 элементов: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10   Число элементов в группе называется порядком группы (group order). Порядок  равен 10. А теперь немного поиграем с операциями:  1 для этой группы – это нейтральный элемент. Neutral — т.к. он “не взаимодействует” ни с какими другими элементами и результат операции с ним всегда равен второму элементу операции. В данном случае 1*10 mod 11 — это 10. Для любого элемента любой группы существует обратный элемент, который “обращает” его в нейтральный. Для этой группы 6 и 2 – обратные друг для друга. Когда групповая операция называется умножением (как в случае ), то используют такие обозначения для обратного к  элемента:  Т.е. * = 1 Что еще можно сказать про эту группу? Она коммутативна (или абелева):  Генераторы группы — это такие ее элементы, все степени которых являются всеми элементами группы. Группы, в которых есть хотя бы один такой элемент называют циклическими. Как понять, что x – генератор? Самый примитивный метод: построить таблицу степеней x:  Как насчет степеней 2?  Итого: 2 — генератор .  Порядок элемента – минимальная степень, в которую его надо возвести, чтобы получить нейтральный. Порядок 2 в  равен 10.  Теперь рассмотрим степени 3:   Порядок 3 равен 5. Он не “пробегает” все значения , т.к. мы видим, что на пятой степени происходит зацикливание: если продолжить умножение, то опять получим 3, 9, 5, 4, 1.  Что еще можно сказать про 3?  Легко видеть, что это подмножество  -подгруппа: есть нейтральный элемент 1. Замкнутость: результат любых a*b mod p для этих чисел не выходит за пределы этого множества, ведь результат будет одним из множества {3, 9, 5, 4, 1}.  Каждый элемент имеет обратный: 3*4 mod 11 = 1, 9*5 mod 11 = 1, 1*1 mod 11 = 1. Какие еще подгруппы есть в ?   Еще есть группа порядка 2: {1, 10}  Ну и конечно же тривиальные подгруппы { 1 } и {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} (т.к. формально группа является подгруппой самой себя)  Как можно оптимизировать поиск генератора для ?  Тут необходимо использовать фундамент теории групп – теорему Лагранжа: “Порядок подгруппы делит порядок группы”.   Элемент x либо является генератором группы, либо является генератором одной из ее подгрупп. Следовательно, возведение x в степени порядков подгрупп и сравнение результата с 1 может это подтвердить или опровергнуть.  Примечание: Алисе и Бобу необходимо проверять приходящие извне ключи на принадлежность их “рабочей” подгруппе большого простого порядка q:   Алиса проверяет  mod p = 1? Если нет, то протокол прерывается.  Аналогично поступает Боб: он проверяет ключ, пришедший от Алисы:  mod p = 1?  Мы сейчас не рассматриваем противника, который мог бы подменить по дороге открытые ключи, но тем не менее всегда надо помнить, что и в криптографии встречаются случаи из разряда “при таких друзьях нам и враги не нужны”: программа на устройствах Алисы или Боба может содержать различные ошибки (в реализации модульной арифметики, или просто может повредиться память).