Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Основы криптологии. Учебное пособие.pdf
Скачиваний:
0
Добавлен:
11.08.2026
Размер:
570 Кб
Скачать

5. ПРОСТЫЕ ЧИСЛА. ГЕНЕРАЦИЯ ПРОСТЫХ ЧИСЕЛ

Асимметричная система шифрования широко использует простые числа большого порядка (>150 десятичных цифр). Если числа p и q оказались составными, то теорема Эйлера, положенная в основу системы шифрования RSA,

amodϕ (n)n = 1,

где

n = p ×q,ϕ(n) = ( p 1)(q 1) , в большинстве случаев не

выполняется. Поясним этот факт на простом примере. Пусть выбраны

два числа p=2, q=4. Ошибочно было принято, что q=4 – простое

число. По этим двум числам найдены n=2×4=8, φ(n)=(p-1)(q-1)=3. Выберем открытый ключ k0 = 2 и зашифруем сообщение

m = 6 c = mmodk0 n = 62mod8 = 36mod8 = 4.

Вычислим секретный ключ (k0 ×kc )modϕ (n) = 1.

Очевидно, что kc = 2 . Попытаемся расшифровать сообщение:

m1 = cmodkc n = 4mod82 = 16mod8 = 0.

Алгоритм не сработал, т. к. m1 ¹ m.

Два математика Мерсенна и Ферма попытались получить

формулы, которые могли бы генерировать простые числа:

Mp = 2p 1 − формула Мерсенна:

M2 = 22 1 = 3;

M3 = 23 1 = 7;

24

M4 = 24 1 = 15 составное число;

M5 = 25 1 = 31;

M6 = 26 1 = 63 – составное число;

M7 = 27 1 = 127 .

Fp = 22p +1

– формула Ферма:

F0 = 220 +1 = 3;

F1 = 22 +1 = 5;

F2 = 24 +1 = 17 ;

F3 = 28 +1 = 257 ;

F4 = 216 +1 = 65537 ;

F5 = 223 +1 = 4294967297 = 64 ×6700417 – составное число.

Если эти формулы не гарантируют, что полученные числа простые, то как можно генерировать большие простые числа? Одним из способов решения этой проблемы является выбор случайного большого числа (например, по тем же формулам), а затем проведение некоторых испытаний, чтобы убедиться в том, что выбранное число простое.

Испытание простоты числа. Различают детерминированные и вероятностные алгоритмы испытания простоты чисел. Детерминированные алгоритмы дают правильный ответ.

25

Вероятностные алгоритмы дают правильный ответ в большинстве случаев, но не во всех. Хотя детерминированный алгоритм идеален, он обычно менее эффективен, чем вероятностный. Простейшим примером детерминированного алгоритма является алгоритм теории делимости. В качестве делителей числа n используют числа от 3 до

n . Если хотя бы одно из этих чисел делит n нацело, то n – составное число.

Недостатком этого алгоритма являются большие затраты времени. Другим примером детерминированного алгоритма является алгоритм AKS. Он использует тот факт, что для простых чисел n

выполняется равенство

( x a) nmod n = ( xn a)mod n .

Поясним работу этого алгоритма на примере. Выберем сначала n=3 – простое число и для x=4, a=2 проверим выполнимость этого равенства:

( x a) nmod n = ( 4 2) 3mod3 = 8mod3 = 2,

с другой стороны,

( xn a) mod n = ( 43 2)mod3 = 62mod3 = 2;

n = 3 − простое число.

Возьмем теперь n=4 – составное число и вычислим:

( x a) nmod n = ( 4 2) 4mod 4 = 24mod 4 = 16mod 4 = 0,

26

( xn a) mod n = ( 44 2)mod 4 = 254mod 4 = 2.

Алгоритм не сработал, поэтому n=4 – составное число. Рассмотрим работу вероятностных алгоритмов. Эти алгоритмы

не гарантируют правильность результатов, но на их основе можно получить вероятность ошибки настолько маленькую, что это почти дает гарантию правильного ответа. Самым простым из вероятностных алгоритмов является тест Ферма: если n – простое число, то

an1mod n = 1.

Если n – составное число, то такое равенство маловероятно. Составные числа, для которых выполняется тест Ферма, называют числами Кармайкла. Одним из них является число n=561=33×17. Выберем а=2 и вычислим

a5611mod561 = 1.

Вероятность выбора простого числа n этим алгоритмом может быть повышена, если его производить на нескольких основаниях a1,a2 ,a3... .

Другим вероятностным алгоритмом является испытание квадратным корнем. Если n − простое, то уравнение

x2modn = 1 (или 1mod n = ±1)

имеет только два решения x = ±1. Докажем это утверждение. Имеем (x2 1)modn = 0 или (x 1)(x +1)modn = 0. Последнее равенство говорит о том, что n является делителем или x +1, или x 1, или того и другого

27

x = 5.

одновременно. Предположим, что n делит x +1 и x 1 одновременно. В этом случае

x +1

= k,

x 1

= l,

n

 

n

 

 

 

где k, l – целые числа.

Тогда x +1 = k ×n, x 1 = l ×n . Вычитая из первого равенства

2

= (k - j);

2

 

второе, имеем 2 = (k l)×n , или n

т. к. n > 2 , то n

− дробное

число, а k j должно быть целым, поэтому n не может делить x +1 и

x 1

одновременно. Остается, что n

может делить либо

 

 

x +1

= k Þ x = (-1+ kn)mod n

= -1

 

x 1

= l Þ x = (1+ ln)mod n = 1.

 

 

 

 

 

n

 

, либо

 

n

 

 

Замечание: обратное утверждение не всегда верно. Пусть n=6 –

составное

число. Найдем

решения

уравнения x2mod6 =1 подбором:

(1)2mod6 = 1,

(2)2mod6 = 4, (3)2mod6 = 4, (4)2mod6 = 4, (5)2mod6 = (1)2mod6 = 1.

Решениями этого уравнения являются только x = ±1, хотя n=6 –

составное число. Приведем также примеры, когда это утверждение

работает. Возьмем n=5 – простое число и найдем решения:

(1)2mod5 = 1,

 

(2)2mod5 = 4,

(4)2mod5 = (1)2mod5 = 1

(5)2mod6 = (1)2mod6 = 1

(воспользовались свойством цикличности). Имеем только два решения x = ±1. Если же взять n=8 – составное число, то имеем еще и другие решения: x = 1, x = −1, x = 3,

Сформулированное выше утверждение лучше использовать

в форме: если существуют решения уравнения x2mod n =1, отличные от

±1, то n – составное число.

28

S k 1, что

Более эффективным вероятностным тестом является тест Миллера – Рабина, который объединяет тесты Ферма и квадратного корня. Этот тест проверяет число n на простоту с большой вероятностью. Пусть n – простое число, тогда число n-1 – четное и его можно представить в виде

n -1 = m ´2k ,

где m – нечетное число, полученное от деления

Запишем тест Ферма в виде

an1

= am×2k æ

(( am ) 2 )... ö2kраз

mod n

mod n ç

¸

 

è

ø

n-1 на 2 k-раз.

= 1.

Преимущество данного теста состоит в том, что испытание

квадратным корнем для первоначального значения x = am может быть выполнено на каждом шаге по k = 1,2,3... . В начале выберем

 

T = amodm

 

m =

n 1

.

основание а и вычислим

n

2k

 

 

, в котором

 

 

Если T = ±1, то n – простое число и проверка останавливается, так как возводя это значение Т в квадрат k раз, мы в итоге получим

выполнение

теста

Ферма

amodn1 n

=1;

с

другой

стороны,

и тест

 

 

квадратного

корня

выполняется.

Если

T ¹ ±1,

то

тестирование

продолжается. Возводим Т в квадрат.

При T 2

= ±1

тест

Ферма

пройден, но тест испытания квадратным корнем не выполняется, так как на предыдущем шаге T ¹ ±1. Вывод: n – составное число. При

T 2 = -1 оба теста проходят: n – простое число. При T 2 = ±1 испытание на простоту продолжается: если существует такое S:

(am )2mod n = −1, то n – простое число, иначе n – составное.

29

Замечание: при проверке теста Миллера – Рабина необходимо использовать несколько оснований а. Рассмотрим реализацию этого теста на простейших примерах. Выберем n =11 – простое число и

представим

 

его

согласно

 

алгоритму

в

 

виде

n -1 = 10 = 5´21, m = 5, k =1.

Вычислим

T = am

 

 

 

 

 

 

 

 

 

 

 

 

 

 

mod n , выбрав в качестве

a = 2

.

T = 25mod11

= 32mod11 = -1

, затем вычисляем

T 2

= (-1)2mod11 =1.

 

 

 

 

 

 

 

 

 

 

 

 

 

Окончательно имеем amodn1 n = 210mod n =1. Тест Ферма выполняется.

Проведем испытание квадратным корнем. Уравнение

x2

= 1

должно

mod11

 

 

иметь

только

два

решения

x = ±1.

 

Ранее

найдено

 

значение

T = am

 

= -1

.

Вычислим

T 2

 

= (-1)2

 

= 1.

Таким

 

 

образом

 

mod n

 

modn

 

mod11

 

 

 

 

1mod n = -1. Испытание квадратным корнем проходит. Вывод: n – простое число.

Выберем заведомо составное число n = 15 и проверим работу теста. Вычислим n 1 = 14 = 7 ×2. T = 27mod15 = 7 ¹ ±1.

Тест продолжается. Находим amodn1 n = Tmod112 = 72mod11 = 5 ¹ 1. Тест Ферма не проходит. Вывод: n – составное число.

Разложение на простые сомножители числа n = p × q.

Разложение на множители (задача факторизации) играет важную роль в безопасности некоторых асимметричных криптосистем. Ранее на примере криптосистемы RSA было показано, что разложив на простые множители общедоступное число n, можно определить

значение функции Эйлера ϕ(n) , а затем, используя расширенный алгоритм Евклида, зная открытый ключ k0 , вычислить секретный

ключ kc . Существует несколько алгоритмов, которые позволяют разложить число n на множители, но ни один из этих методов не

30

способен провести разложение достаточно больших чисел (больше

10100 ) в разумное время. Этот факт и используется в современной криптографии.

Рассмотрим несколько методов.

Метод проверки делением. Самый простой и наименее эффективный метод. Исходное число n делится на целые числа

начиная с 2 до

n до тех пор, пока не найдется делитель. Если n

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

числа

x, y

,

что

n = x2 - y2

тогда

имеем

 

,

n = x2 - y2 = (x - y)(x + y) = p ´q .

Найти такое разложение можно по следующему алгоритму. Поскольку больший из сомножителей n больше, чем n , то начинаем

 

x = é

nù

 

é

a

ù

 

 

 

 

 

 

проверку с

ê

ú , где

 

 

 

 

 

 

 

ê

 

ú − обозначение наименьшего целого

 

 

é

3,14

ù

=

4

 

z = x

2

- n = y

2

 

 

. Затем вычисляется

 

и

числа ³ a . Например, ê

 

ú

 

 

 

 

 

 

проверяется, не является ли число z квадратом натурального числа. Если да и z = m2 , то y = m, тогда p = x y,q = x + y .

Иначе осуществляется итерационный процесс по следующей

схеме:

x = x +1, z = (x +1)2

- n = x2

+ 2x +1- n = (x2 - n) + 2x +1

, т. е.

 

 

 

 

zi+1

= zi + 2xi +1

до тех пор, пока не найдем m.

 

 

 

 

 

 

ρ -

 

 

p наименьший простой

 

 

алгоритм Полларда. Пусть

сомножитель числа n. Выберем случайным образом целые числа a, b

такие, что amod p = bmod p , т. е. имеют одинаковые остатки от деления на p, но тогда число p является делителем разности a b. В самом деле, a = t ×p + r , b = s ×p + r , где t,S − целые числа, r – остаток от деления.

31

Вычитаем a b = p(t S) или

a b = t S

 

 

p

, где t S

− целое число. В

результате

число p

может

быть

получено путем

вычисления:

pНОД=

a ( bn , ).

 

 

 

 

 

Таким

образом,

задачу

факторизации числа

n

можно свести

к задаче определения чисел a, b. Это всегда удается сделать, если

сгенерировать

некоторую числовую

последовательность

 

xk

и для

членов

этой

последовательности

 

 

x

k ,

xj

осуществлять

 

 

проверку

 

 

 

 

 

 

выполнения равенства xk mod p

= xj mod p . В качестве генератора числовой

последовательности

может

быть

 

 

взят

полином

f (x)mod n ,

тогда

 

 

x [1,n 1]

 

=

 

 

 

 

 

 

 

 

x = f (x

)

 

 

 

 

задавшись

для k

1,n

1,

вычисляем

mod n .

0

 

 

 

 

 

k

k

1

 

В

результате получим

последовательность

x1, x2...xk , при этом

 

 

 

 

 

 

 

 

последнее число xk

каждый раз необходимо проверять на выполнение

 

 

 

 

 

 

 

 

(

j =

 

)

равенства

xk mod p = xi mod p для всех

 

xj

 

 

 

 

1,k 1

 

 

 

 

 

 

 

 

 

 

 

 

 

полученных ранее

 

 

 

 

.

Следующая теорема позволяет сократить количество таких сравнений.

Теорема. Пусть

x

k ,

xj

порождены полиномом

 

 

 

 

f (x) = (

a0 xm + a1xm1 + K + am )

mod n

 

 

 

 

 

 

 

 

и существуют числа

x

 

xj

такие, что

xk mod p = xj mod p

, тогда для любого

k ,

 

 

 

a > 0 справедливо равенство: xk+a mod p

= xj+a mod p .

 

 

Докажем эту теорему для a = 1. Будем считать, что xk > xj , а

в качестве xk+1, xj+1 возьмем

x + = a xm + a xm1 + K + a ;

k 1 0 k 1 k mmod n

32

xj+1 = a0 xmj

+ a1xmj

1 + K + am mod n

.

 

 

 

Вычитая из первого равенства второе, получим

m1

 

 

xk+1 xj+1 = åai (xkmi xmj

j ).

 

i=0

 

 

Каждое слагаемое в сумме делится на xk xj , а следовательно, и

 

x +

x + .

на p, но тогда на p делится и разность k 1

j 1

Аналогичными рассуждениями можно доказать теорему для любого а. Из этой теоремы следует, что для разложения числа n на

множители достаточно

найти

 

 

пару

 

 

x

 

 

 

xj

с

нужной

разностью

 

 

 

 

k ,

 

 

 

индексов k j . Поясним данный алгоритм на простом примере.

 

 

 

Для

 

 

 

n

=

35

=

×

 

 

 

 

 

 

 

 

 

 

 

 

многочлен

f (x) = x2

+ 1

 

для

 

 

 

 

 

 

 

 

5 7 используем

 

 

 

 

 

mod35

генерации

последовательности

 

 

xk .

В

качестве

случайного числа

возьмем

x = 1

. Полагаем k

=

k

+

1 и вычисляем

x = x2

+1

 

= 2

; т. к.

 

 

 

0

 

 

 

 

 

1

 

0

 

mod35

 

k = 1

 

 

 

 

 

нечетное,

то

 

 

 

 

 

 

 

для

 

 

 

 

 

 

k = k +1 = 2

 

 

вычисляем

 

x = x2

+1

 

 

 

= 22 +1

 

 

 

= 5

.

 

 

Находим

 

 

 

нужный

 

индекс

j = k = 1

2

1

 

 

mod35

 

 

 

 

 

 

mod35

 

 

 

 

 

 

 

 

 

2

и определяем разность

 

xk xj

 

=

 

x2 x1

 

=

 

5 2

 

= 3.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Так

 

 

 

как

 

НОД (3,35) = 1,

 

процесс

 

 

 

продолжается.

Вычисляем

 

x

= x2

+ 1

 

 

 

= 52 +1

 

 

 

= 26,

 

 

 

 

 

x

= x2 +1

 

= 262

+1

 

= 12.

3

2

 

 

mod35

 

 

 

 

 

 

mod35

 

 

 

 

 

 

 

 

 

 

4

 

 

 

3

 

 

mod35

 

 

 

mod35

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

j = k

=

4 = 2

 

 

 

 

 

 

 

 

 

 

Определяем нужный индекс

 

 

 

2

 

2

 

 

 

 

 

для нахождения разности

 

 

 

 

 

 

 

 

 

 

 

 

 

 

xk xj

 

=

 

x4 x2

 

=

 

12 5

 

= 7.

 

 

Так

как

НОД(7,35) = 7

,

то процесс

 

 

 

 

 

 

 

 

останавливается p = 7,q = 5.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ρ

 

 

 

 

 

Замечание: алгоритм назван греческой буквой

потому, что

хотя последовательность xk

бесконечная, но по конечному модулю n

она является циклической, образуя нечто в виде буквы ρ (рис. 5.1).

33