Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Введение в криптологию. В 4 частях. Ч.1. Учебное пособие.pdf
X
- •ВВЕДЕНИЕ
- •1. АРИФМЕТИКА ОСТАТКОВ, ГРУППЫ, КОНЕЧНЫЕ ПОЛЯ
- •1.1. АРИФМЕТИКА ОСТАТКОВ
- •1.1.1. МОДУЛЬ. ОПЕРАТОР МОДУЛЯ
- •1.1.2. ГРУППЫ И КОЛЬЦА
- •1.1.3. РЕШЕНИЕ УРАВНЕНИЙ ВИДА a ∙ x = b (mod N)
- •1.1.4. ФУНКЦИЯ ЭЙЛЕРА
- •1.1.5. МУЛЬТИПЛИКАТИВНЫЕ ОБРАТНЫЕ ПО МОДУЛЮ N
- •1.2.1. БОЛЕЕ ОБЩИЙ ТИП КОНЕЧНЫХ ПОЛЕЙ
- •1.2.2. РЕШЕНИЕ УРАВНЕНИЙ ВИДА a ∙ = b (mod f (x))
- •1.2.3. НЕПРИВОДИМЫЕ МНОГОЧЛЕНЫ
- •1.2. КОНЕЧНЫЕ ПОЛЯ
- •1.2.4. ИЗОМОРФИЗМ КОНЕЧНЫХ ПОЛЕЙ
- •1.2.6. ПРИМИТИВНЫЙ ЭЛЕМЕНТ КОНЕЧНОГО ПОЛЯ
- •1.3. ОСНОВНЫЕ АЛГОРИТМЫ
- •1.3.1. НАИБОЛЬШИЙ ОБЩИЙ ДЕЛИТЕЛЬ
- •1.3.2. РЕШЕТО ЭРАТОСФЕНА
- •1.3.3. АЛГОРИТМ ЕВКЛИДА ДЛЯ ЦЕЛЫХ ЧИСЕЛ
- •1.3.4. ДВОИЧНЫЙ АЛГОРИТМ ЕВКЛИДА
- •1.3.5. РАСШИРЕННЫЙ АЛГОРИТМ ЕВКЛИДА
- •1.3.6. КИТАЙСКАЯ ТЕОРЕМА ОБ ОСТАТКАХ
- •ЗАКЛЮЧЕНИЕ
- •СПИСОК ЛИТЕРАТУРЫ

51
Таблица 1.53
Степень кандидата
Многочлен
Многочлен по модулю
13 xx
12
)1( x
12x 12x
22
)1( x
14x
12 xx
32
)1( x
1
246
xxx xx
2
42
)1( x
18x
1x
52
)1( x
1
2810
xxx
2
x
62
)1( x
1
4812
xxx
x
72
)1( x
1
2468101214
xxxxxxx
1
Таблица 1.54
Степень
кандидата
Многочлен
Многочлен по модулю
13 xx
12
)( xx
xx
2
xx
2
22
)( xx
24
xx
x
32
)( xx
3456
xxxx 12 xx
42
)( xx
48
xx
2
x
52
)( xx
56910
xxxx 12x
62
)( xx
681012
xxxx
1x
72
)( xx
7891011121314
xxxxxxxx
1
Таблица 1.55
Степень
кандидата
Многочлен
Многочлен по модулю
13 xx
12
)1( xx
12 xx
12 xx
22
)1( xx
124 xx
1x
32
)1( xx
1
356
xxxx
x
42
)1( xx
148 xx
12x
52
)1( xx
1
24568910
xxxxxxxx
xx
2
62
)1( xx
1
261012
xxxx
2
x
72
)1( xx
1
3467810111314
xxxxxxxxxx
1

52
Таким образом, установлено, что любой из многочленов x,
1x
,
2
x, 12x, xx
2
,
12 xx
является примитивным элементом конечного поля
3
2
F
, определяемого
неприводимым многочленом
13 xx
.
Отметим, что целые числа по модулю p также имеют примитивный элемент, так
как
ZZ p/
=
p
F
– конечное поле.
Установим, какие из этих ненулевых элементов являются примитивными элементами поля
7
F
. Для этого каждый из отличных от единицы кандидатов на примитивный
элемент поля возведём в степень от 1 до 6 и определим остаток от деления полученного
числа на 7. Результаты этих действий представим табл. 1.56 – 1.60.
Таблица 1.56
Степень кандидата
Число
Число по модулю 7
1
2
2
2
2
2
4
4
3
2
8
1
4
2
16
2
5
2
32
4
6
2
64
1
Таблица 1.57
Степень кандидата
Число
Число по модулю 7
1
3
3
3
2
3
9
2
3
3
9 ∙ 3
6
4
3
9 ∙ 9
4
5
3
9 ∙ 9 ∙ 3
5
6
3
9 ∙ 9 ∙ 9
1

53
Таблица 1.58
Степень кандидата
Число
Число по модулю 7
1
4
4
4
2
4
16
2
3
4
16 ∙ 4
1
4
4
16 ∙ 16
4
5
4
16 ∙ 16 ∙ 4
2
6
4
16 ∙ 16 ∙ 16
1
Таблица 1.59
Степень кандидата
Число
Число по модулю 7
1
5
5
5
2
5
25
4
3
5
25 ∙ 5
6
4
5
25 ∙ 25
2
5
5
25 ∙ 25 ∙ 5
3
6
5
25 ∙ 25 ∙ 25
1
Таблица 1.60
Степень кандидата
Число
Число по модулю 7
1
6
6
6
2
6
36
1
3
6
36 ∙ 6
6
4
6
36 ∙ 36
1
5
6
36 ∙ 36 ∙ 6
6
6
6
36 ∙ 36 ∙ 36
1
Таким образом, установлено, что примитивными элементами конечного поля
7
F
являются элементы 3 и 5.

54
1.3. ОСНОВНЫЕ АЛГОРИТМЫ
1.3.1. НАИБОЛЬШИЙ ОБЩИЙ ДЕЛИТЕЛЬ
В предыдущих подразделах было отмечено, что для решения уравнения a ∙ x = b
(mod N) в целых числах или уравнения a ∙ α = b (mod f ) в многочленах необходимо найти
наибольший общий делитель. В частности, необходимо знать, имеет ли элемент
a Z / NZ (или a Fp[x] / ( f )) обратный элемент по умножению, т.е. выполнено ли равенство НОД (a, N) = 1 (или НОД (a, f) = 1).
Предположим, что известно каноническое разложение чисел m и n на простые
множители:
k
d
k
d
ppn ...
1
1
, (1.48)
k
e
k
e
ppm ...
1
1
, (1.49)
где p1, …, pk – различные простые числа; d1, …, dk и e1, …, ek – неотрицательные целые
числа, которые могут быть и нулями, если соответствующие сомножители отсутствуют в
разложении.
Тогда НОД (m, n) легко вычислить по формуле
....),( НОД
),min(
),min(
1
11
kk
ed
k
ed
ppnm
(1.50)
Например:
m = 230 895 588 646 864 = 24 ∙ 157 ∙ 4 5133,
n = 33 107 658 350 407 876 = 22 ∙ 157 ∙ 2 2693 ∙ 4 513,
НОД (m, n) = 22 ∙ 157 ∙ 4 513 = 2 834 164.
1.3.2. РЕШЕТО ЭРАТОСФЕНА
Для поиска простых чисел можно воспользоваться специальным алгоритмом,
называемым решетом Эратосфена.
Для нахождения всех простых чисел не больше заданного числа n, следуя методу
Эратосфена, нужно выполнить следующие шаги:
Шаг 1. Выписать подряд все целые числа от двух до n (2, 3, 4, …, n).
Шаг 2. Пусть переменная p изначально равна двум – первому простому числу.
Шаг 3. Зачеркнуть в списке числа от 2p до n, считая шагами по p (это будут числа
кратные p: 2p, 3p, 4p, …).

55
Шаг 4. Найти первое незачёркнутое число в списке, большее чем p, и присвоить
значению переменной p это число.
Шаг 5. Повторять шаги 3 и 4, пока возможно.
Теперь все незачёркнутые числа в списке – это все простые числа от 2 до n.
На практике алгоритм можно улучшить следующим образом. На шаге 3 числа
можно зачёркивать, начиная сразу с числа p2, потому что все составные числа меньше него уже будут зачёркнуты к этому времени. И, соответственно, останавливать алгоритм
можно, когда p2 станет больше, чем n. Также все простые числа (кроме числа 2) – нечётные числа, и поэтому для них можно считать шагами по 2p, начиная с p2.
Пример для n = 30.
Запишем натуральные числа, начиная с 2 и заканчивая 30, в ряд:
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
Первое число в списке 2 – простое. Пройдём по ряду чисел, зачёркивая (выделяя
жёлтым цветом) все числа, кратные 2 (т.е. каждое второе, начиная с 22 = 4):
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
Следующее незачёркнутое число в списке 3 – простое. Пройдём по ряду чисел, зачёркивая все числа, кратные 3 (т.е. каждое третье (или шестое), начиная с 32 = 9):
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
Следующее незачёркнутое число в списке 5 – простое. Пройдём по ряду чисел, зачеркивая все числа, кратные 5 (т.е. каждое пятое (или десятое), начиная с 52 = 25):
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
Следующее незачёркнутое число – 7. Его квадрат (49) больше, чем 30, следовательно, все составные числа уже зачёркнуты и на этом работа алгоритма завершена. Все
простые числа (выделенные зелёным цветом), не больше заданного числа 30, составляют
множество {2, 3, 5, 7, 11, 13, 17, 19, 23, 29}.
Заметим, что разложение числа на простые множители является очень сложной задачей. Поэтому для вычисления наибольшего общего делителя можно воспользоваться
алгоритмом Евклида, который работает как для целых чисел, так и для многочленов.
1.3.3. АЛГОРИТМ ЕВКЛИДА ДЛЯ ЦЕЛЫХ ЧИСЕЛ
Пусть a и b – целые числа, неравные одновременно нулю, и последовательность
чисел
a > b > r1 > r2 > r3 > … > rk > … > rn (1.51)

56
определена тем, что каждое число rk – это остаток от деления предпредыдущего числа на
предыдущее, а предпоследнее делится на последнее нацело, т.е.:
a = q0 ∙ b + r1,
b = q1 ∙ r1 + r2,
r1 = q2 ∙ r2 + r3,
…
r
k – 2
= q
k – 1
∙ r
k – 1
+ rk, (1.52)
…
r
n – 3
= q
n – 2
∙ r
n – 2
+ r
n - 1
,
r
n – 2
= q
n – 1
∙ r
n – 1
+ rn,
r
n – 1
= qn ∙ rn.
Тогда НОД (a, b) равен rn, т.е. последнему ненулевому члену этой последовательности.
Очевидно, что если некоторое число d делит как число a, так и число b, то оно делит
и все ri, начиная с r1 и заканчивая rn. Следовательно,
НОД (a, b) = НОД (b, r1) = НОД (r1, r2) = … = НОД (r
n – 1
, rn) = rn. (1.53)
Например, для a = 21, b = 12 последовательность чисел вида (1.51)
a = 21 > b = 12 > r1 = 9 > r2 = 3
определена тем, что каждое число rk – это остаток от деления предпредыдущего числа на
предыдущее, а предпоследнее делится на последнее нацело, т.е. в соответствии с формулами (1.52):
a = q0 ∙ b + r1 = 21 = 1 ∙ 12 + 9 q0 = 1, b = 12, r1 = 9,
b = q1 ∙ r1 + r2 = 12 = 1 ∙ 9 + 3 q1 = 1, r2 = 3,
r1 = q2 ∙ r2 + r3 = 9 = 3 ∙ 3 + 0 q2 = 1, r3 = 0.
Тогда НОД (a, b) = НОД (21, 12) = rn = r2 = 3 – последнему ненулевому члену этой последовательности и в соответствии с выражением (1.53)
НОД (21, 12) = НОД (12, 9) = НОД (9, 3) = 3.
В другом примере для больших чисел a и b последовательность чисел вида (1.51)
a = 33107658350407876 > b = 230895588646864 > r1 = 89589173906324 >
> r2 = 51717240834216 > r3 = 37871933072108 > r4 = 13845307762108 >

57
> r5 = 10181317547892 > r6 = 3663990214216 > r7 = 2853337119460 >
> r8 = 810653094756 > r9 = 421377835192 > r10 = 389275259564 >
> r11 = 32102575628 > r12 = 4044352028 > r13 = 3792111432 >
> r14 = 252240596 > r15 = 8502492 > r16 = 5668328 >
> r17 = 2834164
определена тем, что каждое число rk – это остаток от деления предпредыдущего числа на
предыдущее, а предпоследнее делится на последнее нацело, т.е. в соответствии с формулами (1.52):
a = q0 ∙ b + r1 = 143 ∙ 230895588646864 + 89589173906324,
b = q1 ∙ r1 + r2 = 2 ∙ 89589173906324 + 51717240834216,
r1 = q2 ∙ r2 + r3 = 1 ∙ 51717240834216 + 37871933072108,
r2 = q3 ∙ r3 + r4 = 1 ∙ 37871933072108 + 13845307762108,
r3 = q4 ∙ r4 + r5 = 2 ∙ 13845307762108 + 10181317547892,
r4 = q5 ∙ r5 + r6 = 1 ∙ 10181317547892 + 3663990214216,
r5 = q6 ∙ r6 + r7 = 2 ∙ 3663990214216 + 2853337119460,
r6 = q7 ∙ r7 + r8 = 1 ∙ 2853337119460 + 810653094756,
r7 = q8 ∙ r8 + r9 = 3 ∙ 810653094756 + 421377835192,
r8 = q9 ∙ r9 + r10 = 1 ∙ 421377835192 + 389275259564,
r9 = q10 ∙ r10 + r11 = 1 ∙ 389275259564 + 32102575628,
r10 = q11 ∙ r11 + r12 = 12 ∙ 32102575628 + 4044352028,
r11 = q12 ∙ r12 + r13 = 7 ∙ 4044352028 + 3792111432,
r12 = q13 ∙ r13 + r14 = 1 ∙ 3792111432 + 252240596,
r13 = q14 ∙ r14 + r15 = 15 ∙ 252240596 + 8502492,
r14 = q15 ∙ r15 + r16 = 29 ∙ 8502492+ 5668328,
r15 = q16 ∙ r16 + r17 = 1 ∙ 5668328+ 2834164,
r16 = q17 ∙ r17 + r18 = 2 ∙ 2834164,
r17 = 2834164,
r18 = 0.

58
Тогда НОД (a, b) = НОД (33107658350407876, 230895588646864) = rn = r17 = 2834164 –
последнему ненулевому члену этой последовательности и в соответствии с выражением
(1.53)
НОД (33107658350407876, 230895588646864) =
= НОД (230895588646864, 89589173906324) =
= НОД (89589173906324, 51717240834216) =
= НОД (51717240834216, 37871933072108) =
= НОД (37871933072108, 13845307762108) =
= НОД (13845307762108, 10181317547892) =
= НОД (10181317547892, 3663990214216) =
= НОД (3663990214216, 2853337119460) =
= НОД (2853337119460, 810653094756) =
= НОД (810653094756, 421377835192) =
= НОД (421377835192, 389275259564) =
= НОД (389275259564, 32102575628) =
= НОД (32102575628, 4044352028) =
= НОД (4044352028, 3792111432) =
= НОД (3792111432, 252240596) =
= НОД (252240596, 8502492) =
= НОД (8502492, 5668328) =
= НОД (5668328, 2834164) = 2834164.
Приведём реализацию алгоритма Евклида на языке Си, использующую рекурсивную функцию gcd (от англ. Greatest Common Divizor – наибольший общий делитель):
// Рекурсивный алгоритм Евклида вычисления НОД(a, b)
#include<stdio.h>
#include<conio.h>
void main()
{
int a=21,b=12,nod;
int gcd(int, int);

59
clrscr();
nod=gcd(a,b);
printf("NOD(%d,%d) = %d ",a,b,nod);
printf("\nPress any key...");
getch();
}
int gcd(int a, int b)
{
return b ? gcd(b,a%b) : a;
}
Результат работы:
NOD(21,12) = 3
Press any key…
Заметим, что из-за больших затрат ресурсов ЭВМ рекуррентное определение
функции может оказаться не лучшим способом действия. Поэтому алгоритм Евклида
можно реализовать не рекурсивно:
// Нерекурсивный алгоритм Евклида вычисления НОД(a, b)
#include<stdio.h>
#include<conio.h>
void main()
{
int a=21,b=12,nod;
int gcd(int, int);
clrscr();
nod=gcd(a,b);
printf("NOD(%d,%d) = %d ",a,b,nod);
printf("\nPress any key...");
getch();
}
int gcd(int a, int b)
{
int temp;
while(a != 0)
{
temp=b%a;
b=a;

60
a=temp;
}
return b;
}
Результат работы:
NOD(21,12) = 3
Press any key…
1.3.4. ДВОИЧНЫЙ АЛГОРИТМ ЕВКЛИДА
Работа алгоритма Евклида основана на том, что отображение
(a, b) (a (mod b), b) (1.54)
сохраняет наибольший общий делитель. Но реализация алгоритма с данным отображением является не очень эффективной, поскольку использует вычисление остатка от деления
на произвольное целое число.
Например, для a = 21, b = 12 производится вычисление остатка от деления на числа
12, 9 и 3:
(21, 12) (21 (mod 12), 12) = (9, 12),
(12, 9) (12 (mod 9), 9) = (3, 9),
(9, 3) (9 (mod 3), 3) = (0, 3).
Заметим, что деление на 2 равносильно простому сдвигу разрядов в двоичном
представлении делимого. В частности, при делении чётных чисел на 2 отбрасываются
двоичные нули из разряда единиц. Например, для деления 12 на 2 представим число 12 в
двоичном виде
1210 = 11002,
отбросим ноль из разряда единиц
11002 1102
и переведём полученное число в десятичный вид
1102 = 610.
В другом примере для деления 36 на 2 представим число 36 в двоичном виде
3610 = 1001002,
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
