blog.iakovlev.org
  10.06.2016

ECM

Факторизация с помощью эллиптических кривых (англ. elliptic curve method, сокр. ECM ) — алгоритм факторизации натурального числа с использованием эллиптических кривых. Данный алгоритм имеет субэкспоненциальное время выполнения. На практике часто используется для выявления (отбрасывания) небольших простых делителей числа. Если полученное после работы алгоритма число все еще является составным, то остальные сомножители — большие числа. При увеличении количества кривых шансы найти простой делитель возрастают.

Википедия следующим образом описывает базовый алгоритм:
Пусть дано составное число n. Нужно найти его нетривиальный делитель.
Случайным образом выбирается эллиптическая кривая:
y2 = x3 + ax + b
и некоторая точка P = ( x , y ) на ней.
Выбирается целое число k , делящееся на степени малых простых чисел.
Вычисляется произведение k * P
Вычисления проводятся до тех пор, пока при попытке найти число, обратное к 2yp не появляется число, не взаимно простое с n.

Эллиптические кривые

Эллиптическая кривая - это кубическая кривая, задаваемая уравнением 3-й степени вида
y2 + a1xy + a3y = x3 + a2x2 + a4x + a6
Эллиптические кривые можно выразить в канонической форме:
y2 = x3 + ax + b - форма Вейерштрасса
y2 = x3 + a2x2 + a4x + a6
y2 + у = x3 + ax + b - суперсингулярные кривые
y2 + xу = x3 + ax2 + b - не-суперсингулярные кривые
Есть еще т.н. форма Монтгомери:
by2z = x(x2 + axz + z2)
Число 4a3 + 27b2 называется дискриминантом кубической кривой.
На следующем рисунке видно, что в случае Д и Е кривые существенно отличаются: у первой имеется точка возврата, у второй - точка самопересечения. Эти точки являются примерами особых точек кривой, соответственно, кривые, которые имеют хотя бы одну такую точку, называются особыми. Кривые, не имеющие особых точек, называются неособыми или гладкими - это справедливо для рисунка в слуваях А, Б, В, Г :



Теорема Ньютона Для любой неособой кубической кривой существует проективная замена координат, приводящая ее в форму Вейерштрасса. Если коэффициенты упавнения исходной кривой рациональны и на кривой имеется хотя бы одна рациональная точка, то можно найти проективную замену, преобразующую исходную кривую в кривую в форме Вейерштрасса с рациональными a и b.
Неособая кривая 3-го порядка называется эллиптической кривой.
На следующем рисунке показана проективная замена переменных, приводящая кривую x3 + y3 = 1 к форме Вейерштрасса. Делаем две замены: x = s - t и y = t - получаем параллельную проекцию плоскости xy на плоскость st:

Для произвольной эллиптической кривой задача нахождения рациональных точек аналогична задаче нахождения целых точек. Метод секущих позволяет ввести на множестве рациональных точек эллиптичексой кривой некоторую структуру. Рациональные точки можно дублировать
Пусть на эллиптической кривой y2 = x3 + ax + b , которая представлена на следующем рисунке, есть рациональные точки - P и Q. Проведем прямую PQ и вычислим координату ее пересечения с кривой. Эта точка пересечения удовлетворяет системе уравнений:
y2 = x3 + ax + b
(y - yP)(xQ - xP) = (x - xP)(yQ - yP)


Если xQ ≠ xP и yQ ≠ yP, во втором уравнении выражаем x через y и подставляем в первое. В результате мы переходим к кубическому уравнению с рациональными коэффициентами. Т.о. по двум рациональным точкам мы построили третью. Еще одна точка получается путем симметрии относительно оси ox, которая еще называется суммой точек P+Q.

Что касается целых решений, то доказано, что любая эллиптическая кривая имеет конечное число целых решений.
Например, на следующем рисунке приведен график эллиптической кривой y2 + y = x3 - x , который распадается на два куска: овал и бесконечную дугу. Одно целое решение (0,0) тривиально.
Для этой кривой все целые точки отвечают условию aP1 + bP2, где a и b меньше 13.
Несколько целых решений для этого уравнения можно найти простым перебором: (1,1) , (10.5) , (13,6)





Алгоритм ECM

В википедии приводится следующий пример реализации алгоритма ECM:
Пусть нам нужно факторизовать число n = 455839.
Возьмем эллиптическую кривую и точку, лежащую на этой кривой:
y2 = x3 + 5x - 5 , P=(1,1)
Вычислим координаты точки P2 = 2!P = 2P
Тангенс угла наклона касательной в точке P равен:


Находим координаты точки P2:
x2 = s2 - 2x1 = 14 (mod n)
y2 = s(x1 - x2) - y = 4(1-14) -1 = -53 (mod n)
Проверяем, что точка 2P действительно лежит на кривой:
(-53)2 = 2809 = 143 + 5*14 - 5
Вычисляем P3 = 3!P = 6P
Тангенс угла наклона касательной в точке 2P составляет
s = (3*196 + 5) / (2(-53)) = -593/106 = 322522 (mod n)
Учитывая вычисленное s, мы можем вычислить координаты точки 2(2P), так же, как это было сделано выше:
4P = (259851, 116255). Проверяем, что точка действительно лежит на нашей эллиптической кривой.
Аналогичным образом можно вычислить P4 = 4!P, P5 = 5!P , и так далее. Когда дойдем до 8!P заметим, что требуется вычисление обратного элемента к 599 (mod 455839). Так как 455839 делится на 599, то мы нашли искомое разложение: 455839 = 599·761.



Критерий простоты, использующий эллиптические кривые, является аналогом следующего критерия простоты чисел, который еще называется критерием простоты Поклингтона:
Пусть n - натуральное число. Предположим, что имеется простой делитель q числа n-1, бОльший, чем sqrt(n)-1. Если существует такое число a, такое, что:
1. an-1 ≡ 1 (mod n)
2. НОД(a(n-1)/q = 1
то n - простое число.
Тест Поклингтона является детерминированным, а не вероятностным. Обычно достаточно взять a=2

Критерий простоты, использующий эллиптические кривые, основан на аналогичном предположении, в котором предполагается заданным уравнение y2 = x3 + ax + b , рассматриваемое по модулю n. Целые числа a и b рассматриваются как вычеты по модулю n и E обозначает множество всех пар (x,y) целых чисел, удовлетворяющих этому уравнению. При использовании эллиптических кривых прийдется складывать точки этих кривых аналогично тому, как было показано выше. При поиске точек на эллиптической кривой возможны варианты, когда мы получаем некоторое число m, которое при простом n равно числу точек эллиптической кривой E
Такое число m будет играть роль n-1. Теперь можно сформулировать аналог критерия Поклингтона для эллиптических кривых:
Пусть n - натуральное число. Пусть E - множество, определяемое уравнением y2 = x3 + ax + b по модулю n, НОД(4a3 + 27b2, n) = 1. Пусть m - целое число. Предположим, что у m есть простой делитель q, больший чем (n1/4 + 1)2. Если существует такая точка P на E, что:
1. mP = O
2. (m/q)P определена и не равна O
то n - простое число

Это предложение приводит к алгоритму для доказательства простоты данного натурального числа n. Выбираем случайно три числа a, x, y по модулю n и полагаем:
b ≡ y2 - x3 - ax (mod n)
Если при этом НОД(4a3 + 27b2, n) > 1, выбираем другую тройку.
Тогда P = (x,y) есть элемент множества E, которое определяется нашим уравнением эллиптической кривой. Используем метод Шуфа(или другой метод для подсчета числа точек на эллиптической кривой), чтобы найти число m, которое при простом n равно числу точек эллиптической кривой. Если мы не можем представить m в виде m = kq, где k>2, то выбираем другую случайную тройку и повторяем все с начала. Предположим, что мы получили эллиптическую кривую, для которой m имеет искомый вид. Тогда находим произведение mP и kP. Если мы в какой-то момент получаем неопределенное выражение, то мы сразу находим нетривиальный делитель n.

Алгоритм ECM непрост по двум основным причинам. Первая - алгоритм Шуфа достаточно сложен для практического применения. Приходится подсчитывать точки на большом количестве кривых, пока не будет найдена наконец кривая, для которой число m будет иметь искомый вид - m = kq. Есть алгоритмы, подбирающие кривые с помощью комплексного умножени (Atkin). Вторая - теоретическая. Чтобы найти кривую, у которой число точек "почти простое", нужно кое-что знать о распределении простых чисел в интервале р + 1 - 2*sqrt(p) , p + 1 + 2*sqrt(р), где в соответствии с теоремой Хассе находится число m. Дело в том, что до сих пор не доказано, что за полиномиальное число попыток в данном интервале можно найти искомое число.

Одной из разновидностью алгоритма ECM является алгоритм, найденный Ленстрой. Для того, чтобы понять, как он работает, нужно сначала вспомнить об алгоритме факторизации Полларда.
Пусть мы хотим разложить на множители составное число п и предполагаем, что р — его (еще неизвестный) простой делитель. Если р таков, что р — 1 не имеет больших простых делителей, то р можно найти следующим способом:
1. Выбираем целое число к, кратное всем или большинству целых чисел, меньших некоторой границы В. Например, в качестве к можно взять В! или общее наименьшее кратное всех целых чисел, не.превосходящих B
2. Выбираем целое число а между 2 и п — 2. Например, а может быть равно 2, 3 или случайно выбранному целому числу.
3. Вычисляем аk по модулю п повторным возведением в квадрат.
4. Вычисляем d = НОД (аk - 1, п), используя алгоритм Евклида и вычет ak (mod n) из шага 3.
5. Если d не есть нетривиальный делитель п, то повторяем все шаги с новым а и/или новым к.

Чтобы понять, при каких условиях этот алгоритм будет работать, предположим, что к делится на все натуральные числа, не превосходящие В. Далее, пусть р — простой делитель п, для которого р - 1 представляется в виде произведения степеней небольших простых чисел, причем каждый из сомножителей меньше В. Отсюда следует, что к кратно р-1 (так как оно кратно каждому из сомножителей в разложении р—1). Поэтому, по малой теореме Ферма, имеем
аk ≡ 1 (mod p).Тогда НОД (аk - 1, п) делится на р.
Таким образом, единственное препятствие, которое может помешать нам получить на шаге 4 нетривиальный делитель п — это случай, когда аk ≡ 1 (mod n)

Пример 1. Разложим указанным методом п = 540143. Выбираем В = 8 (и, следовательно, к равно 840 — общему наименьшему кратному 1,2,..., 8) и а = 2. Находим, что 2840 (mod n) — это 53047 и НОД(53046, п) = 421. Тем самым приходим к разложению 540143 = 421*1283.

Основная слабость метода Полларда, очевидно, проявляется при попытках его применения в тех случаях, когда все простые делители р числа п таковы, что р—1 делится на относительно большое простое число (или на большую степень простого числа).
Принципиальное отличие метода Ленстры состоит в том, что при использовании эллиптических кривых мы получаем много последовательностей небольшого ранга.

Пусть m — целое число и х1,х2 — два рациональных числа со знаменателями, взаимно простыми с m; будем писать x1 ≡ х2 (mod m), если числитель разности х1 — х2, записанной в виде несократимой дроби, делится на m. Для любого рационального числа x1 со знаменателем, взаимно простым с m, существует такое однозначно определенное целое х2 между 0 и m — 1 («наименьший неотрицательный вычет»), что x1 ≡ x2 (mod m). Иногда мы будем обозначать наименьший неотрицательный вычет как х1 (mod m).

Пусть даны уравнение вида y2 = x3 + ax + b , и удовлетворяющая ему точка Р = (х,у). На практике эллиптическая кривая Е вместе с точкой Р будут порождаться некоторым «случайным» образом. Например, можно выбрать три случайных целых числа а,х,у из некоторой области и положить затем b = y2 - x3 - ax . Будем предполагать, что кубический многочлен x3 + ax + b . имеет различные корни, т. е. что 4а3 + 27b2 ≠ 0; это условие выполняется почти всегда, если коэффициенты выбираются описанным выше случайным образом. Для простоты мы предполагаем также в дальнейшем, что 4а3 + 27b2 не имеет с п общих множителей; другими словами, что x3 + ax + b . не имеет кратных корней по модулю р для любого простого делителя р числа п. Практически, выбрав а, b, мы можем проверить это, найдя НОД(4а3 + 27b2, n). Если это число больше 1, то либо п кратно (4а3 + 27b2)(и тогда нам следует выбрать другие а и 6), либо мы уже обнаружили нетривиальный делитель п (и тогда задача решена). Итак, мы будем предполагать, что НОД(4а3 + 27b2, n). = 1.

Пусть нам нужно найти кратную кР для точки Р методом повторного удвоения. Есть много различных способов сделать это за O(log k) шагов, каждый из которых — либо удвоение точки, либо сложение двух различных точек. Можно, например, записать к в двоичной системе счисления: к = a0 + a1*2 + ... + a*2m-1 и затем последовательно удваивать Р, прибавляя 2jР к уже накопленной сумме, если соответствующий бит aj равен 1. Можно также разложить к в произведение простых чисел l1, l2 ,... (расположенных,скажем, в неубывающем порядке) и затем последовательно вычислять l1P, l2(l1Р) и т.д. Здесь каждая точка ljPj, где Pj = lj-1lj-2...l1P, вычисляется повторным удвоением с использованием двоичной записи чисел lj.

Лемма: Пусть Е — эллиптическая кривая с уравнением y2 = x3 + ax + b , и НОД(4а3 + 27b2, n). = 1.. Пусть Pi и Р2 — две точки на Е, у которых знаменатели координат взаимно просты с п, и Р1 ≠ -P2. Тогда Р1 + Р2 имеет координаты, у которых знаменатели взаимно просты с п, в том и только том случае, когда у п нет простого делителя р, для которого сумма точек Pj (mod р) и Р2 (mod р) на эллиптической кривой Е (mod p) была бы равна точке в бесконечности О (mod р). Здесь Е (mod p) обозначает эллиптическую кривую, полученную приведением по модулю р коэффициентов уравнения y2 = x3 + ax + b ,

Метод Ленстры. Пусть дано составное целое нечетное число п и нам нужно найти его нетривиальный делитель d, 1 < d < п. Берем сначала какую-либо эллиптическую кривую Е y2 = x3 + ax + b , с целыми a, b и точку Р = (x, у) на ней. Пару (Е,Р) можно выбирать случайным образом или использовать любой детерминистический метод, который порождает много таких пар. Мы попытаемся с помощью Е и Р разложить п способом, описанным ниже; если попытка окажется неудачной, то возьмем другую пару (Е,Р) и будем продолжать до тех пор, пока не найдем делитель d. Если вероятность неудачи равна р < 1, то вероятность того, что все h последовательно выбранных пар (Е, Р) окажутся неудачными, очень мала для больших h. Таким образом, с высокой вероятностьюмы разложим п за приемлемое число шагов.

Имея пару (Е,Р), мы выбираем целое число к, которое делится на степени малых простых чисел (т.е. не больших некоторого В), не превосходящие С. Таким образом, мы полагаем
k = ∏lαl
где αl = [(logC)/(logl)] есть такой наибольший возможный показатель, что lα < C. Далее мы пытаемся вычислить кР, выполняя все действия по модулю п. Результаты этих вычислений не представляют для нас интереса до тех пор, пока при попытке найти число, обратноек х2 — x1 , мы не столкнемся с числом, которое не взаимно просто с п. Согласно предложению. это произойдет, когда появится такая точка кР (частичная сумма в процессе вычисления кР), что к(Р (mod р)) = О (mod p) для некоторого простого делителя р, иными словами, порядок Р (mod p) в группе Е (mod p) является делителем к. Когда мы, применяя алгоритм Евклида, пытаемся обратить знаменатель, делящийся на р, мы вместо этого находим НОД числа п и этого знаменателя. Этот НОД и будет искомым собственным делителем п, если он отличен от п, т.е. если знаменатель не делится на само п. Однако такая делимость означала бы, по предложению , что кР (mod р) = О (mod p) для всех простых делителей р числа п, а это очень маловероятно, если п имеет не менее двух очень больших простых делителей. Таким образом, почти с полной гарантией при попытке вычисления кР по модулю п для к, которое делится на порядок точки Р (mod p) при некотором р, мы получим собственный делитель числа п.

Теперь пора перейти к конкретным реализациям ecm. Рассмотрим первый простой пример.
Ленстра использует эллиптические кривые, записанные в форме Вейерштрасса. В ней точка трехмерна, имеет три координаты (x, y, z), при этом z=1. Уравнение эллиптической кривой имеет каноническую форму
y2 = x3 + ax + b (mod n)
Нулевая точка имеет координату (0, 1, 0) Сложение двух точек дает в результате третью точку, при этом используется модульная инверсия. Умножение двух точек - это комбинация сложения и удвоения Фактор, который находится с помощью метода
function lenstra(n, limit)
задается с параметром ограничения limit, определяющего количество вычислений. В следующем примере дана простейшая реализация алгоритма Ленстры. В данном примере вычисляется 6-значный простой делитель 6-го числа Ферма:
Код



В следующем примере мы рассмотрим модернизированную версию Монтгомери для алгоритма Ленстры. Она работает быстрее, чем предыдущий вариант. В предыдущей версии можно обратить внимание на то, что много времени тратится на модульную инверсию. Монтгомери внес изменение - вместо использования эллиптической кривой y2 = x3 + ax + b он предложил использовать кривую вида y2 = x3 + ax2 + x . Плюс к этому из вычислений исключается координата y. Числитель и знаменатель параметра a хранятся отдельно.
Удвоение и умножение координат в случае с вариантом Монтгомери теперь выглядят так:
Эллиптическую кривую мы задаем в форме
y2 = x3 + (An/Ad -2)x2 + x (mod n)
Точка хранится как пара координат (x,z)
Для того, чтобы сложить две точки P1(x1,z1) и P2(x2,z2). нужно сначала вычислить точку P0(x0,z0)= P1 - P2
x = ((x1–z1) × (x2+z2) + (x1+z1) × (x2–z2))2 × z0 (mod n)
z = ((x1–z1) × (x2+z2) – (x1+z1) × (x2–z2))2 × x0 (mod n)
Чтобы удвоить точку P:
x = (x+z)2 × (x–z)2 × 4 × Ad (mod n)
z = (4 × Ad × (x–z)2 + t × An) × t (mod n) where t = (x+z)2 – (x–z)2
Умножение представлено как комбинация сложения и удвоения
Брент разработал метод для нахождения нужной эллиптической кривой с помощью начального параметра s :
u = s2 - 5
v = 4s
An = (v–u)3 (3u+v)
Ad = 4u3v
P = (u3, v3)
Этот алгоритм, как уже было сказано раньше, похож на алгоритм факторизации Полларда p-1:

В обоих алгоритмах фигурирует одинаковый список простых чисел. Вычисляется максимальная экспонента. Вычисляется НОД. Различие в том, что алгоритм Полларда основан на модульной арифметике, а у ecm эллиптическая арифметика. Также отличие этих алгоритмов в том, что в случае неудачи алгоритм Полларда просто останавливается, а ecm продолжается по новой.
Исходный алгоритм Ленстры проверяет НОД на каждой итерации. В версии Монтгомери мы вычисляем НОД один раз в конце. Версия Монтгомери быстрее, поскольку в ней отсутствует инверсия. Параметризация Брента также важна, поскольку она гарантирует, что ранг кривой - или число точек на ней - будет кратно 12.
В этом примере вычисляется уже 17-значный простой делитель для 7-го числа Ферма:
Код




Реализацию ecm можно найти например в питоновской библиотекв pyecm. В ней используется эллиптические кривые Монтгомери с параметризацией Шиямы.

Более подробно об алгоритме можно почитать у самого Ленстры.

Коблиц. Курс теории чисел.

Ишмухаметов. Методы факторизации натуральных чисел.

 Автор   Комментарий к данному блогу
Юлия
           Здравствуйте, спасибо за статью! Скажите, пожалуйста, а как происходит вычитание
 точек эллиптической кривой в проективных координатах? 
В методе Монтгомери сложения точек нужно найти P0 = P1 - P2. Мне не очень понятен этот момент... 
2017-03-03 13:54:34
Яковлев Сергей
           Точка P0 является стартовым параметром, она является функцией от самого числа Ферма.
В данном примере она вычисляется по алгоритму Брента, описанному здесь, 
по правилам модульной арифметики:
P0 = (x0, z0)
x0 = (An % ferma ) = (v–u)^3*(3u+v) % ferma
z0 = (Ad % ferna ) = (4u^3v) % ferma
Здесь ferma - это само число ферма
u, v - это координаты самих точек P1 и P2
Т.е. мы все время генерим эти самые случайные числа u, v
и получаем точку отсчета P0 как функцию трех переменных - u, v и самого числа ферма
Когда мы складываем две точки P1 и P2, мы получаем точку с координатами (x, z),
которые еще домножаем на (x0,z0) для того, чтобы гарантировать, 
что полученная точка будет принадлежать эллиптической кривой, 
на которой лежат точки P1 и P2

Вообще, вычитание двух точек делается аналогично сложению - 
нужно только поменять знак у второй  координаты 
2017-03-03 22:35:15
Юлия
           Спасибо!
Скажите, а можно с вами как-то связаться и обсудить данную тему подробнее? 
Мне по учёбе нужно реализовать алгоритм Ленстры в качестве курсовой работы, есть много непонятных моментов, 
но не у кого поспрашивать. 
Если у вас есть время, и, естественно, не бесплатно с моей стороны...   
2017-03-16 22:09:15
Комментарий

Ваше имя:
Комментарий:
Оба поля являются обязательными