Бэби-степ гигантский шаг - Baby-step giant-step

В теория групп, раздел математики, бэби-шаг гигантский шаг это встреча посередине алгоритм для вычисления дискретный логарифм или же порядок элемента в конечный абелева группа из-за Дэниел Шэнкс.[1] Проблема дискретного бревна имеет фундаментальное значение для области криптография с открытым ключом.

Многие из наиболее часто используемых систем криптографии основаны на предположении, что дискретный журнал чрезвычайно трудно вычислить; чем сложнее, тем большую безопасность обеспечивает передача данных. Один из способов повысить сложность проблемы дискретного журнала - основать криптосистему на более крупной группе.

Теория

Алгоритм основан на компромисс между пространством и временем. Это довольно простая модификация пробного умножения, наивного метода нахождения дискретных логарифмов.

Учитывая циклическая группа порядка , а генератор группы и элемента группы , проблема в том, чтобы найти целое число такой, что

Алгоритм бэби-шага-гигантского шага основан на переписывании :

Таким образом, мы имеем:

Алгоритм предварительно вычисляет для нескольких значений . Затем он исправляет и пробует ценности в правой части приведенного выше сравнения, как пробное умножение. Он проверяет, выполняется ли сравнение для любого значения , используя предварительно вычисленные значения .

Алгоритм

Вход: Циклическая группа грамм порядка п, имеющий генератор α и элемент β.

Выход: Ценность Икс удовлетворение .

  1. м ← Потолок (п)
  2. Для всех j где 0 ≤ j < м:
    1. Вычислить αj и сохраните пару (j, αj) в таблице. (Видеть § На практике )
  3. Вычислить αм.
  4. γβ. (набор γ = β)
  5. Для всех я где 0 ≤ я < м:
    1. Проверить, является ли γ вторым компонентом (αj) любой пары в таблице.
    2. Если да, верните я + j.
    3. Если не, γγαм.


Алгоритм C ++ (C ++ 17)

#включают <cmath>#включают <cstdint>#включают <unordered_map>стандартное::uint32_t pow_m(стандартное::uint32_t основание, стандартное::uint32_t exp, стандартное::uint32_t мод) {        // модульное возведение в степень с использованием алгоритма умножения квадратов}/// Вычисляет x так, чтобы g ^ x% mod == hстандартное::необязательный<стандартное::uint32_t> babystep_giantstep(стандартное::uint32_t грамм, стандартное::uint32_t час, стандартное::uint32_t мод) {        const авто м = static_cast<стандартное::uint32_t>(стандартное::потолок(стандартное::sqrt(мод)));        авто стол = стандартное::unordered_map<стандартное::uint32_t, стандартное::uint32_t>{};        авто е = стандартное::uint64_t{1}; // временные значения могут быть больше 32 бит        за (авто я = стандартное::uint32_t{0}; я < м; ++я) {                стол[static_cast<стандартное::uint32_t>(е)] = я;                е = (е * грамм) % мод;        }        const авто фактор = pow_m(грамм, мод-м-1, мод);        е = час;        за (авто я = стандартное::uint32_t{}; я < м; ++я) {                если (авто Это = стол.найти(static_cast<стандартное::uint32_t>(е)); Это != стол.конец()) {                        возвращаться {я*м + Это->второй};                }                е = (е * фактор) % мод;        }        возвращаться стандартное::нуллопт;}

На практике

Лучший способ ускорить алгоритм гигантского шага младенца-шага - использовать эффективную схему поиска в таблице. Лучшее в этом случае - это хеш-таблица. Хеширование выполняется на втором компоненте, и для выполнения проверки на шаге 1 основного цикла γ хешируется, а полученный адрес памяти проверяется. Поскольку хеш-таблицы могут извлекать и добавлять элементы в время (постоянное время), это не замедляет общий алгоритм гигантских шагов маленького шага.

Время работы алгоритма и пространственная сложность , намного лучше, чем время работы наивного перебора.

Алгоритм гигантского шага Baby-step часто используется для решения общего ключа в Обмен ключами Диффи Хеллмана, когда модуль - простое число. Если модуль не простой, Алгоритм Полига – Хеллмана имеет меньшую алгоритмическую сложность и решает ту же проблему.

Примечания

  • Алгоритм гигантских шагов baby-step - это общий алгоритм. Он работает для любой конечной циклической группы.
  • Необязательно знать порядок группы грамм заранее. Алгоритм все еще работает, если п является просто верхней границей группового порядка.
  • Обычно алгоритм шага младенца используется для групп, порядок которых простой. Если порядок группы составной, то Алгоритм Полига – Хеллмана более эффективен.
  • Алгоритм требует О (м) объем памяти. Можно использовать меньше памяти, выбрав меньшую м на первом шаге алгоритма. Это увеличивает время работы, которое затем О (п/м). В качестве альтернативы можно использовать Алгоритм ро Полларда для логарифмов, который имеет примерно такое же время работы, как и алгоритм гигантского шага baby-step, но требует лишь небольшой памяти.
  • Авторство этого алгоритма принадлежит Дэниелу Шанксу, опубликовавшему статью 1971 года, в которой он впервые появился, а статья Нечаева 1994 года[2] заявляет, что это было известно Гельфонд в 1962 г.

дальнейшее чтение

  • Х. Коэн, Курс вычислительной алгебраической теории чисел, Springer, 1996.
  • Д. Шанкс, Номер класса, теория факторизации и родов. В Proc. Symp. Чистая математика. 20, страницы 415—440. AMS, Провиденс, Р.И., 1971.
  • А. Штейн и Э. Теске, Оптимизированные методы шага младенца - гигантского шага, Журнал Математического общества Рамануджана 20 (2005), вып. 1, 1–32.
  • А. В. Сазерленд, Порядок вычислений в общих группах, Кандидатская диссертация, M.I.T., 2007.
  • Д. К. Терр, Модификация алгоритма гигантских шагов Шэнкса, «Математика вычислений» 69 (2000), 767–773. Дои:10.1090 / S0025-5718-99-01141-2

Рекомендации

  1. ^ Дэниел Шэнкс (1971), «Число классов, теория факторизации и родов», В Proc. Symp. Чистая математика., Провиденс, Р.И .: Американское математическое общество, 20, стр. 415–440
  2. ^ Нечаев В. И. Сложность детерминированного алгоритма дискретного логарифма // Математические заметки. 55, нет. 2 1994 (165-172)

внешняя ссылка