Алгоритм Полига — Хеллмана

Материал из testwiki
Перейти к навигации Перейти к поиску

Алгоритм Полига — Хеллмана (также называемый алгоритм Сильвера — Полига — Хеллмана) — детерминированный алгоритм дискретного логарифмирования в кольце вычетов по модулю простого числа. Одной из особенностей алгоритма является то, что для простых чисел специального вида можно находить дискретный логарифм за полиномиальное время.Шаблон:Sfn

История

Данный алгоритм был придуман американским математиком Роландом Сильвером (Шаблон:Lang-en), но впервые был опубликован другими двумя американскими математиками Шаблон:Не переведено 2 и Мартином Хеллманом в 1978 году в статье «An improved algorithm for computing logarithms over GF(p) and its cryptographic significance»Шаблон:Sfn, которые независимо от Роланда Сильвера разработали данный алгоритм.Шаблон:Sfn

Исходные данные

Пусть задано сравнение

Шаблон:EF

и известно разложение числа p−1 на простые множители:

Шаблон:EF

Необходимо найти число x,0≤x<p−1, удовлетворяющее сравнению (1).Шаблон:Sfn

Идея алгоритма

Суть алгоритма в том, что достаточно найти x по модулям qiαi для всех i, а затем решение исходного сравнения можно найти с помощью китайской теоремы об остатках.

Чтобы найти x по каждому из таких модулей, нужно решить сравнение:

(ax)(p−1)/qiαi≡b(p−1)/qiαi(modp).Шаблон:Sfn

Описание алгоритма

Упрощённый вариант

Лучшим путём, чтобы разобраться с данным алгоритмом, будет рассмотрение особого случая, в котором p=2n+1.

Нам даны a, p и b, при этом a есть примитивный элемент GF(p) и нужно найти такое x, чтобы удовлетворялось ax≡b(modp).

Принимается, что 0≤x≤p−2, так как x=p−1 неотличимо от x=0, потому что в нашем случае примитивный элемент a по определению имеет степень p−1, следовательно:

ap−1≡1≡a0(modp).

Когда p=2n+1, легко определить x двоичным разложением c коэффициентами {q0,q1,…,qn−1}, например:

x=∑i=0n−1qi2i=q0+q121+⋯+qn−12n−1

Самый младший бит q0 определяется путём возведения b в степень (p−1)/2=2n−1 и применением правила

b(p−1)/2(modp)≡{+1,q0=0−1,q0=1.

Шаблон:Вывод

Теперь преобразуем известное разложение и введём новую переменную z1:

b≡ax≡ax1+q0(modp)⇒z1≡ba−q0≡ax1(modp),

где

x1=∑i=1n−1qi2i=q121+q222+⋯+qn−12n−1

Понятно, что x1 делится на 4 при q1=0, а при q1=1 делится на 2, а на 4 уже нет.

Рассуждая как раньше, получим сравнение:

z1(p−1)/4(modp)≡{+1,q1=0−1,q1=1,

из которого находим q1.

Оставшиеся биты получаются похожим способом. Напишем общее решение нахождения qi с новыми обозначениями:

mi=(p−1)/2i+1
zi≡b⋅a−q0−q121−…−qi−12i−1≡axi(modp),

где

xi=∑k=in−1qk2k.

Таким образом, возведение zi в степень mi даёт:

zimi≡a(xi⋅mi)≡(a(p−1)/2)(xi/2i)≡(−1)xi/2i≡(−1)qi(modp).

Следовательно:

zimi(modp)≡{+1,qi=0−1,qi=1,

из которого находим qi.

Найдя все биты, получаем требуемое решение x.Шаблон:Sfn

Пример

Дано:

a=3,b=11,p=17=24+1

Найти:

x

Решение:
Получаем p−1=24. Следовательно x имеет вид:

x=q0+q121+q222+q323

Находим q0:

b(p−1)/2≡11(17−1)/2≡118≡(−6)8≡(36)4≡24≡16≡−1(mod17)⇒q0=1

Подсчитываем z1 и m1:

z1≡b⋅a−q0≡11⋅3−1≡11⋅6≡66≡−2(mod17)
m1=(p−1)/21+1=(17−1)/22=4

Находим q1:

z1m1≡(−2)4≡16≡−1(mod17)⇒q1=1

Подсчитываем z2 и m2:

z2≡z1⋅a−q121≡(−2)⋅3−2≡(−2)⋅62≡(−2)⋅36≡(−2)⋅2≡−4≡13(mod17)
m2=(p−1)/22+1=(17−1)/23=2

Находим q2:

z2m2≡132≡(−4)2≡16≡−1(mod17)⇒q2=1

Подсчитываем z3 и m3:

z3≡z2⋅a−q2⋅22≡13⋅3−4≡13⋅9−2≡13⋅22≡(−4)⋅4≡−16≡1(mod17)
m3=(p−1)/23+1=(17−1)/24=1

Находим q3:

z3m3≡11≡1(mod17)⇒q3=0

Находим искомый x:

x=1+1⋅21+1⋅22+0⋅23≡7

Ответ: x=7

Основное описание

Шаг 1 (составление таблицы).
Составить таблицу значений {ri,j}, где
 ri,j=aj⋅p−1qi,i∈{1,…,k},j∈{0,…,qi−1}.
Шаг 2 (вычисление logabmodqiαi). 
Для i от 1 до k:
 Пусть
  x≡logab≡x0+x1qi+...+xαi−1qiαi−1(modqiαi),
 где
  0≤xi≤qi−1.
 Тогда верно сравнение:
  ax0⋅p−1qi≡bp−1qi(modp)

Шаблон:Вывод

 С помощью таблицы, составленной на шаге 1, находим x0.
 Для j от 0 до αi−1 
  Рассматриваем сравнение
   axj⋅p−1qi≡(ba−x0−x1qi...−xj−1qij−1)p−1qij+1(modp)
  Решение опять же находится по таблице
 Конец цикла по j
Конец цикла по i
Шаг 3 (нахождение ответа).
Найдя logabmodqiαi для всех i, находим logabmod(p−1) по китайской теореме об остатках.Шаблон:Sfn

Пример

Необходимо найти дискретный логарифм 28 по основанию 2 в GF(37), другими словами найти x для:

2x≡28(mod37).

Находим разложение φ(37)=37−1=36=22⋅32.

Получаем q1=2,α1=2,q2=3,α2=2.

Составляем таблицу rij:

r20≡20⋅37−12≡1(mod37)
r21≡21⋅37−12≡218≡−1(mod37)
r30≡20⋅37−13≡1(mod37)
r31≡21⋅37−13≡212≡26(mod37)
r32≡22⋅37−13≡224≡10(mod37)

Рассматриваем q1=2. Для x верно:

x≡x0+x1q1(modq1αi)≡x0+x1⋅2(mod22)

Находим x0 из сравнения:

ax0⋅p−1q1≡bp−1q1(modp)⇒2x0⋅37−12≡2837−12≡2818≡1(mod37)

Из таблицы находим, что при x0=0 верно выше полученное сравнение.

Находим x1 из сравнения:

ax1⋅p−1qi≡(b⋅a−x0)p−1qi2⇒2x1⋅37−12≡(28⋅2−0)37−14≡289≡−1(mod37)

Из таблицы получаем, что при x1=1 верно выше полученное сравнение. Находим x:

x≡0+1⋅2≡2(mod4)

Теперь рассматриваем q2=3. Для x верно:

x≡x0+x1⋅3(mod32)

По аналогии находим x0 и x1:

2x0⋅37−13≡2837−13≡2812≡26(mod37)⇒x0=1
2x1⋅37−13≡(28⋅2−1)37−132≡144≡10(mod37)⇒x1=2

Получаем x:

x≡1+2⋅3≡7(mod9)

Получаем систему:

{x≡2(mod4)x≡7(mod9)

Решим систему. Первое сравнение преобразуем в равенство, которое подставляем во второе сравнение:

x=2+4⋅t⇒2+4⋅t≡7(mod9)⇒4⋅t≡5(mod9)⇒
t≡5⋅(4)−1≡5⋅(−2)≡−10≡8(mod9)

Подставляем найденное t и получаем искомое x:

x≡2+4⋅8≡34(mod36)≡34(mod37)

Ответ: x=34.Шаблон:Sfn

Сложность алгоритма

Если известно разложение (2), то сложность алгоритма является

O(∑i=1kαi(log2p+qi1−ri(1+log2qiri))), где 0≤ri≤1.

При этом необходимо O(log2p∑i=1k(1+piri)) бит памяти.Шаблон:Sfn

В общем случае сложность алгоритма также можно оценить как

O(∑i=1kαiqi+log⁡p).Шаблон:Sfn

Если при обработке каждого qi использовать ускоренные методы (например, алгоритм Шенкса), то общая оценка снизится до

O(∑i=1kαiqi+log⁡p).

В указанных оценках подразумевается, что арифметические операции по модулю p выполняются за один шаг. На самом деле это не так — например, сложение по модулю p требует O(log p) элементарных операций. Но поскольку аналогичные уточнения имеют место для любого алгоритма, данный множитель часто отбрасывается.

Полиномиальная сложность

Когда простые множители {qi}i=1k малы, то сложность алгоритма можно оценивать как O((log2p)2). Шаблон:Sfn

Алгоритм имеет полиномиальную сложность в общем виде O((log⁡p)c1) в случае, когда все простые множители {qi}i=1k не превосходят (log⁡p)c2,
где c1,c2 — положительные постоянные.Шаблон:Sfn

Пример

Верно для простых p вида p=2α+1,p=2α13α2+1.

Экспоненциальная сложность

Если имеется простой множитель qi такой, что qi≥pc, где c≥0.Шаблон:Sfn

Применение

Алгоритм Полига—Хеллмана крайне эффективен, если p−1 раскладывается на небольшие простые множители. Это очень важно учитывать при выборе параметров криптографических схем. Иначе схема будет ненадёжной.

Замечание

Для применения алгоритма Полига-Хеллмана необходимо знать разложение p−1 на множители. В общем случае задача факторизации — достаточно трудоёмкая, однако если делители числа — небольшие (в том смысле, о котором сказано выше), то это число можно быстро разложить на множители даже методом последовательного деления. Таким образом, в том случае, когда эффективен алгоритм Полига-Хеллмана, необходимость факторизации не усложняет задачу.

Примечания

Шаблон:Примечания

Литература

на русском языке

  1. Шаблон:Книга
  2. Шаблон:Книга Шаблон:Wayback

на английском языке

  1. Шаблон:Статья
  2. Шаблон:СтатьяШаблон:Недоступная ссылка
  3. Шаблон:Книга