Ρ-метод Полларда дискретного логарифмирования

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск

\Rho — метод Полларда дискретного логарифмирования — алгоритм дискретного логарифмирования в кольце вычетов по простому модулю, имеющий экспоненциальную сложность. Он был предложен Поллардом в 1978 году. Основные идеи алгоритма очень похожи на идеи ρ-метода Полларда факторизации. Данный метод рассматривается для группы ненулевых вычетов по модулю p , где p  — простое число, большее 3 .

Постановка задачи дискретного логарифмирования[править | править вики-текст]

Для заданного простого числа p и двух целых чисел a и b требуется найти целое число x , удовлетворяющее сравнению:

a^x\equiv b\;\pmod{p}, (1)

где b является элементом циклической группы G , порожденной элементом a .

Алгоритм P-метода[править | править вики-текст]

Рассматриваются последовательность пар \{u_i,\ v_i\} целых чисел по модулю p-1 и последовательность \{z_i\} целых чисел по модулю p , определенные следующим образом :

\{u_i\}, \{v_i\}, \{z_i\},\ i\in N, (2)
u_0=v_0=0,\ z_0=1;

u_{i+1} = \begin{cases}
u_i+1\;\bmod\;(p-1), & 0<z_i<\frac{p}{3};\\
2u_i\;\bmod\;(p-1), & \frac{p}{3}<z_i<\frac{2}{3}p;\\
u_i\;\bmod\;(p-1), & \frac{2}{3}p<z_i<p;
\end{cases} (3)

v_{i+1} = \begin{cases}
v_i\;\bmod\;(p-1), &  0<z_i<\frac{p}{3};\\
2v_i\;\bmod\;(p-1), & \frac{p}{3}<z_i<\frac{2}{3}p;\\
v_i+1\;\bmod\;(p-1), & \frac{2}{3}p<z_i<p;
\end{cases} (4)

z_{i+1}\equiv b^{u_{i+1}}a^{v_{i+1}} \pmod{p} = \begin{cases} bz_i\;\bmod\;p, & 0<z_i<\frac{p}{3};\\
z_i^2\;\bmod\;p, & \frac{p}{3}<z_i<\frac{2}{3}p;\\
az_i\;\bmod\;p, & \frac{2}{3}p<z_i<p;
\end{cases} (5)

Замечание: во всех выражениях рассматривается наименьшие неотрицательные вычеты.

Замечание 2: в более общем случае возможно разбиение на 3 подмножества несколько иным способом: разбиваем группу G на три примерно равных по мощности подмножества S_1, S_2, S_3 так, чтобы 1 не принадлежала подмножеству S_2.

Поскольку каждая треть отрезка, которой принадлежит элемент, вероятно, никак не связана с элементами последовательностей \{u_i, v_i\} , полученная последовательность — псевдослучайная. Поэтому могут существовать такие числа j и k , что z_k = z_j . Если удастся найти такую пару чисел, то получится:

b^{u_j}a^{v_j}\equiv b^{u_k}a^{v_k} \pmod{p}. (6)

Если число u_j - u_k взаимно простое с числом p - 1 , то это сравнение можно решить и найти дискретный логарифм:

b^{u_j - u_k}\equiv a^{v_k - v_j} \pmod{p}.

x\equiv\log_a{b}\equiv(u_j-u_k)^{-1}(v_k-v_j)\pmod{p-1}. (7)

Если же наибольший общий делитель чисел u_j - u_k и p - 1 равен числу d > 1 , то существует решение этого сравнения для x по модулю (p - 1) / d  . Пусть x = x_0   (mod (p - 1)/d) , тогда искомое число x = x_0 + m (p - 1)/d , где m может принимать значения 0, 1, ... , d - 1 . Поэтому если d  — достаточно небольшое число, то задача решается перебором всех возможных значений для m . В худшем случае — когда d = p - 1  — метод оказывается ничем не лучше полного перебора всех возможных значений для дискретного логарифма.

Для поиска индексов j и k используется алгоритм поиска циклов Флойда. При использовании данного алгоритма на i -м шаге имеются значения (z_i,\ u_i,\ v_i,\ z_{2i},\ u_{2i},\ v_{2i}) и ищется номер i , для которого z_i = z_{2i}. Наименьшее значение i , при котором выполняется данное условие, называется епактой. Если при этом (u_{2i}-u_i,\ p-1)=1, то

x\equiv\log_a{b}\equiv(u_{2i}-u_i)^{-1}(v_{i}-v_{2i})\pmod{p-1
}. (8)

P-метод для группы точек эллиптической кривой[править | править вики-текст]

Пусть задана группа точек эллиптической кривой (ЭК) E(F_p). Не ограничивая общности, можно предположить, что p > 3 и p — простое число. Обозначим подгруппу E(F_p) порядка n через G и зафиксируем порождающий элемент P. Для произвольного элемента группы Q = xP задача дискретного логарифмирования заключается в нахождении элемента  1 < x < n.

Группа G представляется в виде объединения G = S_1 \cup S_2 \cup S_3, где S_i  — произвольные множества приблизительно одинаковой мощности. Функция итерирования ~f\colon G \to G определяется как

R_{i+1} =  f(R_i) = \begin{cases} Q + R_i, & R_i \in S_1;
\\ 2R_i, & R_i \in S_2;\\
P + R_i, & R_i \in S_3;
\end{cases} (9)

Таким образом R_i = a_iP + b_iQ, где коэффициенты определяются следующим образом

a_{i+1} =  \begin{cases} a_i, & R_i \in S_1;
\\ 2a_i, & R_i \in S_2;\\
a_i + 1, & R_i \in S_3;
\end{cases} (10)

b_{i+1} =  \begin{cases} b_i + 1, & R_i \in S_1;
\\ 2b_i, & R_i \in S_2;\\
b_i, & R_i \in S_3;
\end{cases} (11)

Выбирая произвольное начальное значение R_0, строятся две последовательности R_i и R_{2i}, пока не будет обнаружена коллизия при некотором m : R_m = R_{2m}
. Исходя из формул (10) и (11), решается задача дискретного логарифмирования:

x = \frac{a_{2m} - a_m}{b_m - b_{2m}} (12)

Важно то, что полученное значение при коллизии m зависит от начального значения R_0 и определяет вычислительную сложность метода Полларда.

Сложность алгоритма[править | править вики-текст]

Основная работа алгоритма состоит в вычислении последовательностей \{x_i\}, \{x_{2i}\} . Данные вычисления требуют трех умножений по модулю для перехода к следующей итерации. Размер необходимой памяти при этом минимален, поскольку нет необходимости хранения информации о всех предыдущих элементах последовательностей. Таким образом, сложность алгоритма сводится к сложности задачи нахождения епакты, которая, в свою очередь, имеет эвристическую оценку сложности O(\sqrt p), причем для разных случаев значения константы C\sqrt p могут довольно сильно отличаться, но, как правило лежат в пределах [1;3].

Сравнение с другими алгоритмами[править | править вики-текст]

По сравнению с другими алгоритмами дискретного логарифмирования алгоритм \rho-Полларда является менее затратным как по отношению к бинарным операциям, так и по отношению к необходимому количеству памяти. Например, при достаточно больших значениях числа p данный алгоритм является более эффективным по сложности, чем алгоритм COS и алгоритм Адлемана, имеющие сложность O(exp{((\log{p}\log{\log{p}})^{1/2})}). В сравнении с алгоритмом Шенкса, также имеющим сложность O(\sqrt p), алгоритм Полларда является более выгодным по отношению к используемой памяти — для алгоритма Шенкса требуется O(p) памяти, в то время как для данного алгоритма размер требуемой памяти постоянен (при условии использования алгоритма поиска циклов Флойда).

Распараллеливание метода[править | править вики-текст]

Системы с распределенной памятью[править | править вики-текст]

Идея метода \rho-Полларда для систем с распределенной памятью состоит в разделении итерирования точек между клиентскими рабочими станциями и поиска коллизии сервером. Пусть задано множество клиентских рабочих станций S = \left \{ S_i \mid i = 1 ... r\right \}. Сервер определяет параметры, общие для системы, некоторое подмножество D \subset  G и выполняет инициализацию рабочих станций. Клиентская рабочая станция S_i
строит последовательность точек R_{ij} \subset D и отправляет поэлементно точки на сервер. Если точка не содержится в базе данных, сервер добавляет точку в базу данных, иначе вычисляет значение дискретного логарифма.

Системы с общей памятью[править | править вики-текст]

Идея такого метода состоит в распараллеливании отдельно функции итерирования и алгоритма обнаружения коллизии. Функция итерирования распараллеливается на этапе вычисления последовательностей R_i и R_{2i}.Следует отметить, что параллельное вычислениеR_{i_0} и R_{2i_0}
для фиксированного значения i_0 и последующее сравнение является неэффективным. Это объясняется тем фактом, что накладные расходы, связанные с использованием потоков, являются вычислительно более затратными, чем вычисление R_{2i_0} = f (R_{2i_{0} - 2}).Таким образом, целесообразно вычислять последовательности так, чтобы накладные расходы нивелировались. Это может быть достигнуто организацией вычислений последовательностей вида \left \{ R_{iw+j}\right \}^l_{i=0} и \left \{ R_{2(iw+j)}\right \}^l_{i=0}, где w — размер блока вычислений, 0 \leqslant j < w, l = \left \lceil \frac{m}{w} \right \rceil. Функция обнаружения коллизии в методе \rho-Полларда сравнивает значения R_m и R_{2m}. Такое сравнение можно распараллелить, если использовать алгоритм итерирования для систем с общей памятью. Результатом выполнения функции итерирования точек являются два множества точек \left \{ R_{i}\right \}^w_{i=0} и \left \{ R_{2i}\right \}^w_{i=0},сравнение которых осуществляется по блокам, то есть R_i = R_{2i}, i = 1 ...\frac{w}{2} и R_i = R_{2i}, i = \frac{w}{2} ... w в случае с двумя ядрами.

Комбинированный метод[править | править вики-текст]

Метод \rho-Полларда для систем с распределенной памятью может быть расширен для использования на многоядерных рабочих станциях. Идея метода состоит в том, что итерирование точек клиентскими рабочими станциями происходит в соответствии с определенным алгоритмом, суть которого в том, что есть клиентская рабочая станция S_i
строит последовательность точек \left \{ R_{ij}\right \}^w_{j=0}. Далее рабочая станция S_i
выбирает подмножество точек \left \{ R_{ij}\right \}^w_{j=0} \cap D и отправляет его серверу. Проверка на принадлежность подмножеству осуществляется в параллельном режиме: R_{ij} \in D, i = 1 ...\frac{w}{2} и R_{ij} \in D, i = \frac{w}{2} ... w (в случае с двумя ядрами). Сервер добавляет точки и \left \{ R_{ij}\right \}^w_{j=0} \cap D в базу данных до тех пор, пока не найдет уже существующую точку.

Модификации и оптимизации[править | править вики-текст]

Существует несколько значительных улучшений алгоритма, основанных на различных приемах.

Одно из улучшений описано в работе [Teske 1998]. Отличие приведенного в работе метода заключается в усложненной итерационной функции — она содержит 20 различных веток вместо описанных выше трех. Численные эксперименты показывают, что такое улучшение приводит к ускорению работы алгоритма случайного блуждания в среднем на 20 %.

\Lambda-метод Полларда[править | править вики-текст]

В работе по вычислению дискретных логарифмов Поллардом также был предложен \lambda-метод, названный так потому, что форма греческой буквы напоминает изображение двух путей, соединяющихся в один. Идея метода состоит в том, чтобы идти сразу двумя путями: одним от числа b, чей дискретный логарифм надо найти, другим от числа B, чей дискретный логарифм уже известен. Если эти два пути сойдутся, появляется возможность найти дискретный логарифм числа b. Поллард предложил рассматривать шаги на каждом пути как прыжки кенгуру, поэтому этот алгоритм иногда называют «методом кенгуру». Если известно, что искомый дискретный логарифм лежит в некотором коротком интервале, то можно адаптировать метод кенгуру, а именно, использовать кенгуру с более короткими прыжками.

Одним важным свойством лямбда-метода является тот факт, что он легко распределяется на несколько компьютеров. Каждый участник распределенных вычислений выбирает случайное число r и начинает делать псевдослучайные шаги от числа b^r, где b — элемент группы, для которого ищется дискретный логарифм. Каждый участник использует одну и ту же легко вычислимую псевдослучайную функцию ~f\colon G \to S, где S — относительно небольшое множество чисел со средним значением, сравнимым с размером группы G, имеющей порядок n. Степени a^s для s \in S вычисляются заранее. Тогда «блуждание», начиная с элемента b^r, принимает вид: w_0 = b^r, w_1 = w_0a^{f(w_0)}, w_2 = w_1a^{f(w_1)}, ...

Пусть другой участник, выбрав начальное число r^\prime , получил последовательность w^\prime_0, w^\prime_1, w^\prime_2, ... Если она пересекается с последовательностью w_0, w_1, w_2, ... , то есть w^\prime_i = w_j при некоторых i, j, то, учитывая, что b = a^x, выполняется:

b^{r^\prime}a^{f(w^\prime_0) + f(w^\prime_1) + ... + f(w^\prime_{i-1})} = b^r a^{f(w_0) + f(w_1) + ... + f(w_{j-1})} (13)

(r^\prime - r)x \equiv \sum^{j-1}_{\mu=0} {f(w_\mu)} - 
 \sum^{i-1}_{\nu=0} {f(w^\prime_\nu)} \pmod n (14)

Обычно этот метод используется, когда порядок группы n является простым. Так как тогда, если все выбираемые в начале вычислений числа r различны по модулю n, то сравнение (14) может быть легко решено для нахождения дискретного логарифма x. Небольшая трудность заключается в том, что совпадение может произойти внутри одной последовательности, это означает, что r = r^\prime . Однако, если количество участников вычислений достаточно велико, то вероятность совпадения между последовательностями больше, чем вероятность совпадения внутри одной последовательности.

Возможно использование псевдослучайной функции  (5). В таком случае будут полезны все совпадения: совпадение внутри одной последовательности также может быть использовано для вычисления дискретного логарифма. В случае такого совпадения \lambda-метод просто превращается в \rho-метод. Однако, если известно, что искомый дискретный логарифм лежит в коротком интервале, то можно использовать первоначальный метод. Тогда время работы будет около квадратного корня из длины интервала. В этом случае среднее значение целых чисел из множества S должно быть меньше для того, чтобы «кенгуру» прыгали только по интервалу нужной длины.

Центральный компьютер должен отслеживать все последовательности от всех участников для выявления совпадений. Согласно парадоксу дней рождения, совпадение ожидается, когда количество элементов во всех последовательностях будет порядка O(\sqrt{n})). Очевидно, что в описанном виде этот метод требует больших затрат памяти центрального компьютера. Следующая идея, описанная в работе ван Оршотом, сильно уменьшает требования к памяти и, таким образом, делает этот метод применимым к решению сложных проблем. Идея состоит в рассмотрении так называемых выделенных точек. Предполагается, что элементы группы представляются целыми числами (или, возможно, наборами целых чисел). Выделенное двоичное поле длины  k в таком числе будет состоять из одних нулей примерно 1/2k -ю часть всего времени. Случайное блуждание будет проходить через такие выделенные точки в среднем через каждые 2^k шагов. Если две случайные последовательности где-нибудь пересекутся, то они будут пересекаться и дальше и вместе попадут в следующую выделенную точку. Итак, идея состоит в отправке на центральный компьютер только этих выделенных точек, что уменьшит необходимый размер памяти в 2^k раз.

Литература[править | править вики-текст]