Это не официальный сайт wikipedia.org 01.01.2023

Алгоритм исчисления порядка — Википедия

Алгоритм исчисления порядка

(перенаправлено с «Алгоритм исчисления индексов»)

Алгоритм исчисления порядка (index-calculus algorithm) — вероятностный алгоритм вычисления дискретного логарифма в кольце вычетов по модулю простого числа. На сложности нахождения дискретного логарифма основано множество алгоритмов связанных с криптографией. Так как для решения данной задачи с использованием больших чисел требуется большое количество ресурсов, предоставить которые не может ни один современный компьютер. Примером такого алгоритма является ГОСТ Р 34.10-2012.

История Править

Маурис Крайчик первым предложил основную идею данного алгоритма в своей книге «Théorie des Nombres» в 1922 году. После 1976 года задача дискретного логарифмирования становится важной для математики и криптоанализа. Это связано с созданием криптосистемы Диффи-Хелмана. В связи с этим в 1977 году Р.Меркле возобновил обсуждения данного алгоритма. Спустя два года он был впервые опубликован коллегами Меркеля. Наконец в 1979 году Адлерман оптимизировал его, исследовал трудоемкость и представил его в форме, которую мы знаем сейчас. В настоящее время алгоритм исчисления порядка и его улучшенные варианты дают наиболее быстрый способ вычисления дискретных логарифмов в некоторых конечных группах.

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

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

g x c ( mod p ) ,  

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

Алгоритм Править

Вход: g — генератор циклической группы порядка n, a — из циклической подгруппы, p — простое число, c — параметр надёжности, обычно берут равным 10 или близкое к этому значению число (используется для реализации алгоритма на компьютере, если решает человек, то его не задают).

Задача: найти x такое, что g x c  .

  1. Выбираем факторную базу S = {p1, p2, p3, …, pt} (Если G = Z*p, то база состоит из t первых простых чисел).
  2. Возводим g в случайную степень k, где k такое, что 0 k < n  . Получаем g k  .
  3. Представляем gk следующим образом:
    g k = i = 1 t p i a i ,  
    где a i 0   (то есть пытаемся разложить его по факторной базе). Если не получается, то возвращаемся ко 2-му пункту.
  4. Из пункта 3 следует выражение
    k i = 1 t a i log g p i mod n ,  
    полученное путём логарифмирования (берётся сравнение по модулю порядка группы, так как мы работаем с показателем степени, а g n 1   в группе G). В этом выражении неизвестны логарифмы. Их t штук. Необходимо получить таких уравнений t + c штук, если этого не возможно сделать, возвращаемся к пункту 2 (при реализации на компьютере) или получить необходимое количество уравнений, чтобы найти все неизвестные логарифмы (при решении человеком).
  5. Решаем получившуюся систему уравнений, с t неизвестными и t + c сравнениями.
  6. Выбираем случайное число k такое, что 0 k < n  . Вычисляем c g k  .
  7. Повторяем пункт 3, только для числа c g k  . Если не получается, то возвращаемся к 6-му пункту.
  8. Аналогично пункту 4, получаем:
    x = log g c = i = 1 t a i log g p i k mod n  , где log g p i   ( 1 i t  ), где k = log g g k mod n  . В этом пункте мы и решили задачу дискретного логарифма, отыскав x = log g c  .

Выход: x = log g c  .

Пример Править

Решить уравнение: 17 10 x ( m o d 47 )  

Выбираем факторную базу S = { 2 , 3 , 5 }   Пусть k = 7 Вычисляем g k  

k = 1 10 1 m o d 47 = 10 = 2 5  

k = 2 10 2 m o d 47 6 = 2 3  

k = 3 10 3 m o d 47 13  

k = 4 10 4 m o d 47 36 = 2 2 3 3  

k = 5 10 5 m o d 47 31  

k = 6 10 6 m o d 47 28 = 2 2 7  

k = 7 10 7 m o d 47 45 = 3 3 5  

Логарифмируем и обозначаем U i = l o g g p i   И получаем систему уравнений { U 1 + U 3 = 1 U 1 + U 2 = 2 2 U 1 + 2 U 2 = 4 2 U 2 + U 3 = 7  

Решаем её

u 2 = 8 3 ( m o d 46 ) = 8 3 1 ( m o d 46 ) = { φ ( 46 ) = φ ( 2 23 ) } = 22 = 8 3 22 ( m o d 46 ) 18  

Действительно, 10 18 m o d 47 3  , следовательно U 1 = 30  , U 2 = 18  , U 3 = 17  

Находим k такое, чтобы c g k = i = 1 t p i a i  

17 10 1 ( m o d 47 ) = 29  

17 10 2 ( m o d 47 ) = 8 = 2 2 2  

Следовательно k = 2  

Логарифмируем данное выражение и получаем

l o g a 17 = [ ( l o g a 2 + l o g a 2 + l o g a 2 ) 2 ] m o d 46 = ( 3 30 2 ) m o d 46 42  

Ответ: x = 42  

Сложность Править

В данном алгоритме, количество итераций зависит, как от размера p, так и от размера факторной базы. Но факторную базу мы выбираем заранее, и её размер является фиксированным. Поэтому итоговая сложность определяется только размером простого числа и равняется: O ( c 1 2 ( c 2 + o ( 1 ) ) l o g p l o g l o g p )   , где c 1  , c 2   — некоторые константы, зависящие от промежуточных вычислений, в частности, от выбора факторной базы.

Усовершенствования Править

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

Сложность Править

Вычислительная сложность снижена до O ( 2 l o g 2 ( p ) )  , по сравнению с оригинальном алгоритмом.

См. также Править

Ссылки Править