Главная
Новости
Строительство
Ремонт
Дизайн и интерьер
Полезные советы



















Яндекс.Метрика





Алгоритм Гельфонда — Шенкса

Алгоритм Гельфонда — Шенкса (англ. Baby-step giant-step; также называемый алгоритмом больших и малых шагов; также очень часто можно встретить название алгоритм согласования, например в книге Василенко "Теоретико-числовые алгоритмы криптографии") — в теории групп детерминированный алгоритм дискретного логарифмирования в мульпликативной группе кольца вычетов по модулю простого числа. Был предложен советским математиком Александром Гельфондом в 1962 году и Дэниелом Шенксом в 1972 году.

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

Область применения

Задача дискретного логарифмирования представляет большой интерес для построения криптосистем с открытым ключом. На предположении о чрезвычайно высокой вычислительной сложности решения этой задачи основаны такие криптоалгоритмы как, например, RSA, DSA, Elgamal, Diffie-Hellman, ECDSA, ГОСТ Р 34.10-2001, Rabin и другие. В них криптоаналитик может получить закрытый ключ путём взятия дискретного логарифма от открытого ключа (известного всем), и с его помощью преобразовать шифротекст в текст сообщения. Однако чем сложнее его найти (чем большее количество операций нужно проделать для нахождения дискретного логарифма), тем более стойкой является криптосистема. Одним из способов повысить сложность задачи дискретного логарифмирования является создание криптосистемы, основанной на группе с большим порядком (где логарифмирование будет происходить по модулю большого простого числа). В общем случае такая задача решается полным перебором, данный же алгоритм позволяет в некоторых случаях упростить нахождения показателя степени (уменьшить количество шагов) при вычислении по модулю простого числа, в самом благоприятном случае в квадратный корень раз, но этого сокращения всё равно недостаточно для решения задачи на электронно-вычислительной машине за разумное время (вопрос о решении задачи дискретного логарифма за полиномиальное время на персональном компьютере остаётся открытым до сих пор).

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

Пусть задана циклическая группа G {displaystyle G} с образующим g {displaystyle g} , содержащая n {displaystyle n} элементов. Целое число x {displaystyle x} (в диапазоне от 0 {displaystyle 0} до n − 1 {displaystyle n-1} ) называется дискретным логарифмом элемента h ∈ G {displaystyle hin G} по основанию g {displaystyle g} , если выполняется соотношение:

g x = h . {displaystyle g^{x}=h.}

Задача дискретного логарифмирования — по заданным h {displaystyle h} , g {displaystyle g} определить x {displaystyle x} .

Формально задача дискретного логарифмирования ставится следующим образом:

{ Input: g , h , n ∈ N Output: x ∈ N :   g x ≡ h ( mod n ) {displaystyle {egin{cases}{ ext{Input:}}quad &g,h,nin mathbb {N} { ext{Output:}}quad &xin mathbb {N} : g^{x}equiv h{pmod {n}}end{cases}}}

при условии, что x {displaystyle x} может не существовать, а также n {displaystyle n} может быть как простым числом, так и составным.

Теория

Идея алгоритма состоит в выборе оптимального соотношения времени и памяти, а именно в усовершенствованном поиске показателя степени.

Пусть задана циклическая группа G {displaystyle G} порядка n {displaystyle n} , генератор группы α {displaystyle alpha } и некоторый элемент группы β {displaystyle eta } . Задача сводится к нахождению целого числа x {displaystyle x} , для которого выполняется

α x = β . {displaystyle alpha ^{x}=eta ,.}

Алгоритм Гельфонда — Шенкса основан на представлении x {displaystyle x} в виде x = i ⋅ m − j {displaystyle x=icdot m-j} , где m = ⌊ n ⌋ + 1 {displaystyle m=leftlfloor {sqrt {n}} ight floor +1} , и переборе 1 ≤ i ≤ m {displaystyle 1leq ileq m} и 0 ≤ j < m {displaystyle 0leq j<m} . Ограничение на i {displaystyle i} и j {displaystyle j} следует из того, что порядок группы не превосходит m {displaystyle m} , а значит указанные диапазоны достаточны для получения всех возможных x {displaystyle x} из полуинтервала [ 0 ; m ) {displaystyle left[0;m ight)} . Такое представление равносильно равенству

Алгоритм предварительно вычисляет α i m {displaystyle alpha ^{im}} для разных значений i {displaystyle i} и сохраняет их в структуре данных, позволяющей эффективный поиск, а затем перебирает всевозможные значения j {displaystyle j} и проверяет, если β α j {displaystyle eta alpha ^{j}} соответствует какому-то значению i {displaystyle i} . Таким образом находятся индексы i {displaystyle i} и j {displaystyle j} , которые удовлетворяют соотношению (1) и позволяют вычислить значение x = i ⋅ m − j {displaystyle x=icdot m-j} .

Алгоритм

Вход: Циклическая группа G {displaystyle G} порядка n {displaystyle n} , генератор α {displaystyle alpha } и некоторый элемент β {displaystyle eta } .

Выход: Число x {displaystyle x} , удовлетворяющее α x = β {displaystyle alpha ^{x}=eta } .

  • m {displaystyle m} ← ⌊ n ⌋ + 1 {displaystyle leftlfloor {sqrt {n}} ight floor +1}
  • Вычислить γ {displaystyle gamma } ← α m {displaystyle alpha ^{m}} .
  • Для любого i {displaystyle i} где 1 {displaystyle 1} ≤ i {displaystyle i} ≤ m {displaystyle m} :
  • Записать в таблицу ( i {displaystyle i} , γ {displaystyle gamma } ). (см. раздел «Реализация»)
  • γ {displaystyle gamma } ← γ {displaystyle gamma } • α m {displaystyle alpha ^{m}}
  • Для любого j {displaystyle j} где 0 {displaystyle 0} ≤ j {displaystyle j} ≤ m − 1 {displaystyle m-1} :
  • Вычислить β α j {displaystyle eta alpha ^{j}} .
  • Проверить, содержится ли β α j {displaystyle eta alpha ^{j}} в таблице.
  • Если да, вернуть i m {displaystyle im} — j {displaystyle j} .
  • Если нет, продолжить выполнение цикла.
  • Обоснование алгоритма

    Нужно доказать, что одинаковые элементы в таблицах обязательно существуют, то есть найдутся такие i {displaystyle i} и j {displaystyle j} , что g m i = β ⋅ g j = g x + j {displaystyle g^{mi}=eta cdot g^{j}=g^{x+j}} . Это равенство имеет место в случае m i = x + j ( mod n ) {displaystyle mi=x+j{pmod {n}}} , или x = m i − j ( mod n ) {displaystyle x=mi-j{pmod {n}}} . При 1 ≤ i ≤ m {displaystyle 1leq ileq m} , 1 ≤ j ≤ m {displaystyle 1leq jleq m} выполнено неравенство 0 ≤ m i − j ≤ m 2 − 1 {displaystyle 0leq mi-jleq m^{2}-1} . Для различных пар ( i 1 , j 1 ) {displaystyle (i_{1},j_{1})} и ( i 2 , j 2 ) {displaystyle (i_{2},j_{2})} имеем m i 1 − j 1 ≠ m i 2 − j 2 {displaystyle mi_{1}-j_{1} eq mi_{2}-j_{2}} , так как в противном случае получилось бы m ( i 1 − i 2 ) = ( j 1 − j 2 ) {displaystyle m(i_{1}-i_{2})=(j_{1}-j_{2})} , что при указанном выборе i 1 , i 2 {displaystyle i_{1},i_{2}} возможно только в случае i 1 = i 2 {displaystyle i_{1}=i_{2}} , и, следовательно, j 1 = j 2 {displaystyle j_{1}=j_{2}} . Таким образом, выражения m i − j {displaystyle mi-j} принимают все значения в диапазоне от 0 {displaystyle 0} до m 2 − 1 {displaystyle m^{2}-1} , который, в силу того, что m 2 > n {displaystyle m^{2}>n} , содержит все возможные значения x {displaystyle x} от 0 {displaystyle 0} до n − 1 {displaystyle n-1} . Значит, для некоторых i {displaystyle i} и j {displaystyle j} имеет место равенство x = m i − j ( mod n ) {displaystyle x=mi-j{pmod {n}}} .

    Оценка сложности алгоритма

    Допустим, что необходимо решить h = n g {displaystyle h=ng} , где h {displaystyle h} и g {displaystyle g} — целые положительные числа меньше 100 {displaystyle 100} . Один из способов — перебрать последовательно n {displaystyle n} от 1 {displaystyle 1} до 100 {displaystyle 100} , сравнивая величину n ⋅ g {displaystyle ncdot g} с h {displaystyle h} . В худшем случае нам потребуется 100 {displaystyle 100} шагов (когда n = 99 {displaystyle n=99} ). В среднем это займет 50 {displaystyle 50} шагов. В другом случае, мы можем представить n {displaystyle n} как n = 10 a − b {displaystyle n=10a-b} . Таким образом, задача сводится к нахождению a {displaystyle a} и b {displaystyle b} . В этом случае можно переписать задачу как h = ( 10 a − b ) g {displaystyle h=(10a-b)g} или h + b g = 10 a g {displaystyle h+bg=10ag} . Теперь мы можем перебрать все возможные значения a {displaystyle a} в правой части выражения. В данном случае это все числа от 1 {displaystyle 1} до 10 {displaystyle 10} . Это, так называемые, большие шаги. Известно, что одно из полученных значение для a {displaystyle a} — искомое. Мы можем записать все значения правой части выражения в таблице. Затем мы можем посчитать возможные значения для левой части для различных значений b {displaystyle b} . Такими являются все числа от 0 {displaystyle 0} до 9 {displaystyle 9} из которых одно является искомым, и вместе с правильным значением правой части дает искомый результат для n {displaystyle n} . Таким образом, задача сводится к перебору различных значений левой части и поиск их в таблице. Если нужное значение в таблице найдено, то мы нашли b {displaystyle b} , и, следовательно, соответствующее n = 10 a + b {displaystyle n=10a+b} . Данная иллюстрация демонстрирует скорость работы алгоритма. В среднем выполняется 1.5 n {displaystyle 1.5{sqrt {n}}} операций. В худшем случае требуется 2 n {displaystyle 2{sqrt {n}}} операций .

    Пример

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

    Пусть известно 5 x ≡ 3 ( mod 23 ) {displaystyle 5^{x}equiv 3{pmod {23}}} . В начале создадим и заполним таблицу для «больших шагов». Выберем m = 5 {displaystyle m=5} ← ( 16 + 1 {displaystyle {sqrt {16}}+1} ). Затем i {displaystyle i} пройдёт от 1 {displaystyle 1} до 5 {displaystyle 5} .

    Найдем подходящее значение j {displaystyle j} для 3 ⋅ 5 j   mod   23 {displaystyle 3cdot 5^{j} {mod { }}23} , чтобы значения в обеих таблицах совпали

    Видно, что во второй таблице для j = 4 {displaystyle j=4} , такое значение уже находится в первой таблице. Находим x = m i − j = 5 ⋅ 4 − 4 = 16 {displaystyle x=mi-j=5cdot 4-4=16} .

    Реализация

    Существует способ улучшить производительность алгоритма Гельфонда — Шенкса. Он заключается в использовании эффективной схемы доступа к таблице. Лучший способ — использование хеш-таблицы. Следует производить хеширование по второй компоненте, а затем выполнять поиск по хешу в таблице в основном цикле по γ {displaystyle gamma } . Так как доступ и добавление элементов в хеш-таблицу работает за время O ( 1 ) {displaystyle O(1)} (константа), то асимптотически это не замедляет алгоритм.

    Время работы алгоритма оценивается как O ( n ) {displaystyle O({sqrt {n}})} , что намного лучше, чем время работы O ( n ) {displaystyle O(n)} полного перебора показателей степени.

    Особенности

    • Алгоритм Гельфонда — Шенкса работает для произвольной конечной циклической группы.
    • Нет необходимости знать порядок группы G {displaystyle G} заранее. Алгоритм также работает, если n {displaystyle n} — верхняя граница порядка группы.
    • Обычно алгоритм Гельфонда — Шенкса используется для групп, у которых порядок — простое число. Если порядком является составное число, то рекомендуется использование алгоритма Полига — Хеллмана.
    • Алгоритму Гельфонда — Шенкса требуется O ( n ) {displaystyle O(n)} памяти. Возможно выбрать меньшее m {displaystyle m} на первом шаге алгоритма. Это увеличивает время работы программы до O ( n / m ) {displaystyle O(n/m)} . Также возможно использование ρ-метода Полларда для дискретного логарифмирования, который работает за то же самое время, но требует малое количество памяти.

    Имя:*
    E-Mail:
    Комментарий: