Опубликован: 02.03.2017 | Уровень: для всех | Доступ: платный
Лекция 2:

Алгоритмы тестирования на простоту и факторизации

< Лекция 1 || Лекция 2: 123 || Лекция 3 >

2.1 Парадокс дней рождения

Теорема 2.3 Пусть \lambda>0. Для случайной выборки объёма l+1 из n элементов, где l =\sqrt{2\lambda n}, вероятность p того, что все элементы выборки будут попарно различны, допускает следующую оценку сверху:

p<e^{-\lambda}.

Следствие 2.1 (Парадокс дней рождения) Чтобы с вероятностью >0,5 обнаружить двух людей, празднующих день рождения в один день, достаточно рассмотреть всего 23 человека.

Этот парадокс допускает следующие применения в криптографии.

2.2.1 Алгоритм Полларда для факторизации натурального числа

Пусть нам требуется факторизовать натуральное число n, то есть найти любой его нетривиальный делитель. Один из простейших алгоритмов приведён ниже [1]. Алгоритм будет вычислять псевдослучайную последовательность x_0, x_1,\ldots, x_l. Вероятность p того, что НОД (|x_i - x_j|, n) > d можно оценить по теореме 2.4. Если q - минимальный делитель числа n, то множество \mathbb{Z} разбивается на q классов, причем если x_i, x_j лежат в одном классе, то НОД(x_i-x_j,n) делится на q. Итак, в теореме 2.4 находим \lambda = \dfrac{l^2}{2q}, и p<e^{-\lambda}.

Если x_i-x_j=0 ~(\mod q)$, $i<j, а 2^r - наименьшая степень двойки, большая i, то x_{2^r}-x_{j+(2^r-i)}=0~(\mod q). Поэтому вместо того, чтобы сравнивать все пары x_i, x_j с произвольными i,j, имеет смысл сравнивать пары:


    \begin{array}{ccc}
    x_2 \text{ и } x_3 & x_4 \text{ и } x_7 & ... \\ 
    x_4 \text{ и } x_5 & x_8 \text{ и } x_9 & x_{2^k} \text{ и } x_{m}\\ 
    x_4 \text{ и } x_6 & x_8 \text{ и } x_{10} & 2^k<m<2^{k+1}.
    \end{array}

Для сравнения среди таких пар достаточно хранить x_{2^k} и x_m, тогда как для поиска среди всех пар нужно хранить все пары.

Правда, такая хитрость требует увеличить длину последовательности. Допустим, наименьшие j и i, для которых НОД(x_j-x_i,n)>1, равны, соответственно, l и 0. Тогда


    \begin{array}{l}
    НОД(x_{l}-x_0,n)>1,\\
    НОД(x_{l+1}-x_1,n)>1,\\
    \ldots\\
    НОД(x_{l+2^k}-x_{2^k})>1
    \end{array}

Поскольку мы сравниваем x_{2^k} и x_{m}, где m<2^{k+1}, то у нас 2^{k+1}>l+2^k, то есть 2^{k} > l. Итак, нужно выбрать наименьшее k такое, что 2^k > l и вычислить не l+1, а m=2^k + l членов последовательности.

  1. Взять многочлен f(x) с целыми коэффициентами и случайное число x_0. Положить i=1.
  2. Вычислить x_i=f(x_{i-1}) ~(\mod n).
  3. Если i - степень двойки, положить k=x_i, i=i+1, перейти к предыдущему шагу.
  4. (Теперь i - не степень двойки). Если d=НОД(|x_i-k|,n)>1, то d - нетривиальный делитель числа n.
  5. Положить i=i+1. Если i\leq m, перейти к шагу 2.

Отметим, что при фиксированном q длина l вычисляемой последовательности пропорциональна \sqrt{n} - верхней оценке наименьшего простого делителя q. Таким образом, данный алгоритм имеет сложность, экспоненциальную по числу бит числа q.

Пример 2.2 С помощью \rho-алгоритма Полларда найти нетривиальный простой делитель числа n=2449.

На первом шаге алгоритма требуется выбрать многочлен f(x) для генерации последовательности x_i. Возьмём f(x) = x^2 + 1. Выберем длину l последовательности так, чтобы найти в ней повтор с вероятностью p\geq 0,5. q\leq\sqrt{2449}<50=q_0 - оценка сверху для наименьшего простого делителя q числа N. Итак, 0.5< p < e^{-\lambda}, откуда -\lambda > ln 0,5 = 0,693147. Тогда

l \leq \sqrt{2\lambda\cdot p_0} \approx \sqrt{70}\approx 8,36.

Допустим, в последовательности x_0,\ldots,x_9 есть повтор. Чтобы гарантированно его найти с помощью приведённого алгоритма, нужно вычислить не меньше 25 её членов. В самом деле, так как 2^3<9<2^4=16, то k=4, и необходимое число членов: 25=16+9.

Выберем x_0=10.

  • Вычисляем x_1=f(x_0) ~(\mod n)=101;
  • Вычисляем x_2=f(x_1) ~(\mod n)=406; 2 - степень двойки; запоминаем k=406.
  • Вычисляем x_3=f(x_2) ~(\mod n)=754, НОД(x_3-x_2,n)=НОД(x_3-k,n)=НОД(406-754,2449)=1.
  • Вычисляем x_4=f(x_3) ~(\mod n)=349, 4 - степень двойки; запоминаем k=349.
  • Вычисляем x_5=f(x_4) ~(\mod n)=1801, НОД(x_5-x_4,n)=НОД(x_5-k,n)=НОД(1801-349,2449)=1.
  • Вычисляем x_6=f(x_5) ~(\mod n)=1126, НОД(x_6-x_4,n)=НОД(1126-349,2449)=1.
  • Вычисляем x_7=f(x_6) ~(\mod n)=1744, НОД(x_7-x_4,n)=НОД(1744-349,2449)=31.

Итак, нам повезло найти нетривиальный делитель 31 числа 2449. Если бы мы досчитали до x_{25} и не нашли повтор, то нам лучше было бы выбрать новый x_0 (в качестве него можно взять x_{25}) и начать алгоритм сначала.

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

Изменим алгоритм предыдущего параграфа так, чтобы с его помощью решать задачу дискретного логарифмирования. Его идея остаётся прежней: мы будем вычислять последовательность x_0, x_1, \ldots и будем находить среди них пары x_i=x_j чисел. Зададим последовательность так, чтобы это равенство давало нам дискретный логарифм.

Найдём y из условия a^y = b ~(\mod p), где p - простое число.

Определим последовательности u_i, v_i, x_i следующим образом:

u_0 = v_0 = 0,\qquad x_0 = 1;

    u_{i+1}=\left\{ \begin{array}{ll}
    u_{i}+1 ~(\mod p-1),&\text{если}~0\leq x_i<p/3; \\
    2u_{i} ~(\mod p-1),&\text{если}~p/3 \leq x_i<2p/3; \\
    u_i ~(\mod p-1)&\text{иначе}.
    \end{array}\right.

    v_{i+1}=\left\{ \begin{array}{ll}
    v_{i} ~(\mod p-1),&\text{если}~0\leq x_i<p/3; \\
    2v_{i} ~(\mod p-1),&\text{если}~p/3 \leq x_i<2p/3; \\
    v_i+1 ~(\mod p-1)&\text{иначе}.
    \end{array}\right.
x_{i+1}=b^{u_{i+1}}\cdot a^{v_{i+1}}.

Тогда если x_i=x_j, то b^{u_{i}-u_{j}} = a^{v_{i}-v_{j}}, откуда

\log_a b = (u_i -u_j)^{-1} (v_i-v_j)~(\mod p-1) .

Коллизия x_i=x_j ищется тем же способом, что и в предыдущем параграфе.

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

< Лекция 1 || Лекция 2: 123 || Лекция 3 >
Евгений Шаров
Евгений Шаров

как начать заново проходить курс, если уже пройдено несколько лекций со сданными тестами?

Юлия Мышкина
Юлия Мышкина

Обучение с персональным тьютором осуществляется по Скайпу или посредством переписки?

Анна Ладик
Анна Ладик
Россия, А, Университет, 2012
Паулус Шеетекела
Паулус Шеетекела
Россия, ТГТУ, 2010