Русская Википедия:Алгоритм исчисления порядка
Алгоритм исчисления порядка (index-calculus algorithm) — вероятностный алгоритм вычисления дискретного логарифма в кольце вычетов по модулю простого числа. На сложности нахождения дискретного логарифма основано множество алгоритмов связанных с криптографией. Так как для решения данной задачи с использованием больших чисел требуется большое количество ресурсов, предоставить которые не может ни один современный компьютер. Примером такого алгоритма является ГОСТ Р 34.10-2012.
История
Маурис Крайчик первым предложил основную идею данного алгоритма в своей книге «Théorie des Nombres» в 1922 году. После 1976 года задача дискретного логарифмирования становится важной для математики и криптоанализа. Это связано с созданием криптосистемы Диффи-Хелмана. В связи с этим в 1977 году Р.Меркле возобновил обсуждения данного алгоритма. Спустя два года он был впервые опубликован коллегами Меркеля. Наконец в 1979 году Адлерман оптимизировал его, исследовал трудоемкость и представил его в форме, которую мы знаем сейчас. В настоящее время алгоритм исчисления порядка и его улучшенные варианты дают наиболее быстрый способ вычисления дискретных логарифмов в некоторых конечных группах.
Постановка задачи дискретного логарифмирования
Для заданного простого числа <math>p </math> и двух целых чисел <math>g </math> и <math>c </math> требуется найти целое число <math>x </math>, удовлетворяющее сравнению:Шаблон:Формула
где <math>c </math> является элементом циклической группы <math>G </math>, порожденной элементом <math>g </math>.
Алгоритм
Вход: g — генератор циклической группы порядка n, a — из циклической подгруппы, p — простое число, c — параметр надёжности, обычно берут равным 10 или близкое к этому значению число (используется для реализации алгоритма на компьютере, если решает человек, то его не задают).
Задача: найти x такое, что <math>g^x \equiv c</math>.
- Выбираем факторную базу S = {p1, p2, p3, …, pt} (Если G = Z*p, то база состоит из t первых простых чисел).
- Возводим g в случайную степень k, где k такое, что <math>0 \leqslant k < n </math>. Получаем <math>g^k</math>.
- Представляем gk следующим образом:
- <math> g^k = \prod_{i=1}^{t} p^{a_i}_i,</math>
- где <math>a_i \geqslant 0</math> (то есть пытаемся разложить его по факторной базе). Если не получается, то возвращаемся ко 2-му пункту.
- Из пункта 3 следует выражение
- <math> k \equiv \sum_{i=1}^t a_i \log_g p_i \mod n,</math>
- полученное путём логарифмирования (берётся сравнение по модулю порядка группы, так как мы работаем с показателем степени, а <math>g^n \equiv 1</math> в группе G). В этом выражении неизвестны логарифмы. Их t штук. Необходимо получить таких уравнений t + c штук, если этого не возможно сделать, возвращаемся к пункту 2 (при реализации на компьютере) или получить необходимое количество уравнений, чтобы найти все неизвестные логарифмы (при решении человеком).
- Решаем получившуюся систему уравнений, с t неизвестными и t + c сравнениями.
- Выбираем случайное число k такое, что <math>0 \leqslant k < n </math>. Вычисляем <math>cg^k</math>.
- Повторяем пункт 3, только для числа <math>cg^k</math>. Если не получается, то возвращаемся к 6-му пункту.
- Аналогично пункту 4, получаем:
- <math> x = \log_gc = \sum_{i=1}^t a_i \log_g p_i - k \mod n</math>, где <math>\log_g p_i</math> (<math>1 \leqslant i \leqslant t</math>), где <math>k = \log _g g^k \mod n</math>. В этом пункте мы и решили задачу дискретного логарифма, отыскав <math> x = \log_g c</math>.
Выход: <math> x = \log_g c</math>.
Пример
Решить уравнение: <math>17 \equiv 10^x\;(mod47)</math>
Выбираем факторную базу <math> S = \{2,3,5\}</math> Пусть k = 7 Вычисляем <math>g^k</math>
<math> k = 1 \;\;\;\; 10^1 mod 47 = 10 = 2 * 5</math>
<math> k = 2 \;\;\;\; 10^2 mod 47 \equiv 6 = 2 * 3</math>
<math> k = 3 \;\;\;\; 10^3 mod 47 \equiv 13 </math>
<math> k = 4 \;\;\;\; 10^4 mod 47 \equiv 36 = 2 * 2 * 3 * 3</math>
<math> k = 5 \;\;\;\; 10^5 mod 47 \equiv 31</math>
<math> k = 6 \;\;\;\; 10^6 mod 47 \equiv 28 = 2 * 2* 7</math>
<math> k = 7 \;\;\;\; 10^7 mod 47 \equiv 45 = 3 * 3 * 5</math>
Логарифмируем и обозначаем <math>U_i = log_gp_i</math> И получаем систему уравнений <math>\left\{\begin{matrix}U_1+U_3 = 1 \\ U_1 + U_2 = 2 \\ 2U_1 + 2U_2 = 4 \\ 2U_2 + U_3 = 7\end{matrix}\right.</math>
Решаем её
<math>u_2 = \frac{8}{3} (mod46) = 8*3^{-1}(mod46) = \{\varphi(46) = \varphi(2*23)\} = 22 = 8*3^{22}(mod46)\equiv 18</math>
Действительно, <math>10^{18} mod47 \equiv 3</math>, следовательно <math>U_1 = 30</math>, <math>U_2 = 18</math>, <math>U_3 = 17</math>
Находим k такое, чтобы <math> cg^k = {\displaystyle\prod_{i=1}^{t} p^{a_i}_i}</math>
<math> 17 * 10^1 (mod47) = 29</math>
<math> 17 * 10 ^2 (mod47) = 8 = 2 * 2 * 2</math>
Следовательно <math> k = 2 </math>
Логарифмируем данное выражение и получаем
<math> log_a17 = [(log_a2 + log_a2 + log_a2) -2] mod46 = (3*30 - 2)mod 46 \equiv 42</math>
Ответ: <math> x = 42 </math>
Сложность
В данном алгоритме, количество итераций зависит, как от размера p, так и от размера факторной базы. Но факторную базу мы выбираем заранее, и её размер является фиксированным. Поэтому итоговая сложность определяется только размером простого числа и равняется: <math> O(c_1*2^{(c_2 + o(1))\sqrt{logp\;loglogp}})</math> , где <math>c_1</math>,<math>c_2</math> — некоторые константы, зависящие от промежуточных вычислений, в частности, от выбора факторной базы.
Усовершенствования
Ускоренный алгоритм исчисления порядка, суть которого состоит в том, чтобы использовать таблицу индексов.
Сложность
Вычислительная сложность снижена до <math>O(2log_2(p))</math>, по сравнению с оригинальном алгоритмом.
См. также
Ссылки
- http://refdb.ru/look/1629414-pall.html
- http://pratsi.opu.ua/app/webroot/articles/1414145386.pdf
- https://en.wikipedia.org/wiki/Index_calculus_algorithm