Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Пособие «Защита информации» (МФТИ)

.pdf
Скачиваний:
161
Добавлен:
28.06.2014
Размер:
3.19 Mб
Скачать

Round

{

ByteSub()

ShiftRow()

MixColomn()

AddRoundKey()

}

Последний раунд не содержит операции MixColomn().

ByteSub (Замена байтов)

ShiftRow (Сдвиг строк)

MixColomn (Смешивание столбцов)

Опишем каждую из операций более подробно:

1.Замена байтов представляет собой нелинейную замену байтов, действующую на каждый байт состояния независимо. Таблица замены является обратимой и строится на основе произведения двух преобразований:

1)вычисляется “обратный байт” (обратимость понимается над полем GF(256), а 0 элемент отображается в себя).

2)К полученному байту применяется афинное преобразование:

y0

 

 

1 0 0 0 1 1 1 1 x0

 

 

1

 

 

 

 

 

 

1

 

 

 

 

 

 

y1

 

 

1 1 0 0 0 1

1 x1

 

 

1

y2

 

 

1 1 1 0 0 0 1

1 x2

 

 

0

 

 

 

 

 

 

 

 

 

 

 

 

 

y3

 

=

1 1 1 1 0 0 0 1 x3

 

+

0

 

 

 

 

 

 

 

 

 

 

 

y4

 

 

1 1 1 1 1 0

0 0 x4

 

 

0

y5

 

 

0 1 1 1 1 1

0 0 x5

 

 

1

 

 

 

 

 

1

1

 

 

 

 

 

 

y6

 

 

0 0 1 1 1

0 x6

 

 

1

y

7

 

 

0 0 0 1 1 1

1

1 x

7

 

 

0

 

 

 

 

 

 

 

 

 

 

 

a0,0

a0,1

a0,2

a0,3

a1,0

a1,1

a1,2

a1,3

a2,0

a2,1

a2,2

a2,3

a3,0

a3,1

a3,2

a3,3

S-box

b0,0 b0,1

b0,2

b0,3

b1,0

b1,1

b1,2

b1,3

b2,0

b2,1

b2,2

b2,3

b3,0 b3,1

b3,2

b3,3

Для выполнения обратной замены байтов применяется обратная таблица замены, которая получается следующим образом: сначала производится обратное афинное преобразование, а затем вычисляется обратный элемент над GF(256).

2.Под сдвигом строк понимается следующая операция:

10

Строки состояния циклически сдвигаются на различные смещения. Нулевая строка не сдвигается, первая сдвигается на 1 байт, вторая на 2 байта и третья на три байта (при других значениях длины блока значения смещений меняются).

m N o p

j K l …

d E f …

w X

y

z

No shift

Cyclic shift by 1

Cyclic shift by 2

Cyclic shift by 3

M

n

o

p

 

 

 

j

 

 

d

e

 

w

x

y

Обратной операцией является циклический сдвиг в другую сторону.

3.Смешивание столбцов происходит следующим образом:

столбец состояния рассматривается как полином над GF(256) и умножается по модулю x4 +1 на фиксированный полином c(x) , где c(x) ='03' x3 +'01' x2 +'01' x+'02'. Это преобразование обратимо, поскольку полином c(x) взаимно прост с x4 +1.

Это преобразование можно записать в матричном виде: b(x) = c(x) a(x) ,

b

 

 

02

03

01

01 a

 

 

0

 

 

 

01 02

03

 

0

 

b1

 

=

 

01 a1

 

 

 

 

01 01

02

 

 

 

b2

 

 

 

03 a2

 

b3

 

03

01

01

02 a3

Рисунок иллюстрирует действие данного преобразования:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

a0, j

 

 

 

 

 

b0, j

 

 

c(x)

 

 

a1, j

 

 

 

b1, j

 

 

 

 

 

 

 

 

 

 

a2, j

 

 

 

 

 

b2, j

a3, j

 

 

 

 

 

b3, j

Для выполнения обратного преобразования необходимо произвести умножение на полином d (x) ='0B' x3 +'0D' x2 +'09' x+'0E' .

4.Добавление ключа.

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

11

a0,0

a0,1

a0,2

a0,3

 

k0,0

 

k0,1

k0,2

k0,3

 

b0,0

b0,1

b0,2

b0,3

a1,0

a1,1

a1,2

a1,3

 

k1,0

 

k1,1

k1,2

k1,3

 

b1,0

b1,1

b1,2

b1,3

 

 

 

 

 

 

 

 

 

=

 

 

 

 

a2,0

a2,1

a2,2

a2,3

k2,0

 

k2,1

k2,2

k2,3

b2,0

b2,1

b2,2

b2,3

a3,0

a3,1

a3,2

a3,3

 

k3,0

 

k3,1

k3,2

k3,3

 

b3,0

b3,1

b3,2

b3,3

Эта

операция является обратной

к самой себе.

 

 

 

 

 

 

Получение кругового ключа.

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

Полное число битов кругового ключа, необходимго для шифрования, равно длине блока умноженной на количество раундов плюс 1, те для блока длиной 128 бит и 10 раундов необходимо 1408 бит. Первые 128 бит кругового ключа совпадают с самим ключом.

Формирование ключа происходит следующим образом: первые четыре столбца (с номерами 0-3)совпадают с самим ключом, далее столбец с номером четыре получается из третьего с помощью следующей композиции преобразований:

K 4 = SubByte(RotByte(K3 )) C1 ,

 

 

далее для столбцов 5-7 имеем:

Ki = Ki4 Ki=1 .

Дальнейший процесс

определяется рекурсивно, меняется

лишь константа С.

Здесь SubByte –

применение операции замены байт, а RotByteсдвиг, преобразующий столбец

(a,b,c,d) в (b,c,d,a).

Тогда весь процесс шифрования можно записать так:

Изначальное добавление кругового ключа N-1 раунд

Последний раунд.

III.Алгоритм дешифрования.

Выше было отмечена реализация обратного к каждому из преобразований раунда:

{

Добавление кругового ключа Обратное смешивание столбцов Обратный сдвиг строк Обратная замена байт

}

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

AddRoundKey();

12

InvShiftRow();

InvByteSub();

AddRoundKey();

InvMixColumn();

InvShiftRow();

InvByteSub();

AddRoundKey();

Легко заметить, что операции сдвига строк и замены байт можно поменять местами, т.к. замена байт действует на каждый байт независимо. Кроме того, последовательность

AddRoundKey();

InvMixColumn();

можно заменить на

InvMixColumn()

AddRoundKey(InvRoundKey); Здесь InvRoundKey обозначает результат применения операции

InvMixColumn() к ключу. Это следует из линейности операций. Тогда мы получим следующую структуру для двухраундового обратного алгоритма: AddRoundKey();

InvByteSub();

InvShiftRow();

InvMixColumn();

AddRoundKey(Inv);

InvByteSub();

InvShiftRow();

AddRoundKey();

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

IV.Реализация алгоритма.

Простая структура операций алгоритма обеспечивает легкость реализации и быстроту исполнения. Основные операции, применяемы при этомэто EXOR, применение S-box, и сдвиг. При этом особенно легко реализовать данный алгоритм на процессорах с длиной слова 32 бит и более. При этом для быстроты реализации в памяти создается таблица, содержащая значения S(a), а также еще 4 таблицы, определяемые через S(a) (всего около 4 кбайт памяти), после чего все преобразования сводятся к циклическим сдвигам и операциям XOR с этими таблицами и ключом. В силу того, что структура обратного алгоритма совпадает со структурой прямого, схема реализации не изменится, но значения элементов в таблицах будут другие, и к расширеннуму ключу необходимо применить операцию обратного смешивания столбцов при его формировании.

Скорость алгоритма (расчеты на P-200)

Длина (блока, ключа)

Ansi C, Mbit/sec

VisualC++, Mbit/sec

(128,128)

27.0

70.5

(192,128)

22.8

59.3

(256,128)

19.8

51.2

V.Стойкость алгоритма.

13

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

Приложение 1. Поле GF(28 ) .

1. Байт b , состоящий из битов b7b6b5b4b3b2b1b0 ,

рассматривается как полином с

коффициэнтами в {0,1} : b x7

+b x6

+b x5

+b x4

+b x3

+b x2

+b x1

+b .

7

6

5

4

3

2

1

0

Так байт 0x57 (01010111) примет вид : x6 + x4 + x2 + x +1.

2.Сложение. В представлении полиномов, суммой двух элементов является полином, коффициэнты которого являются суммой по модулю 2 коффициэнтов

слагаемых. Одним соловом, сложению соответствует битовая операция EXOR ( ). Очевидно, что элементы с операцией сложения образуют абелеву группу.

3.Умножение.

В Поле GF(28 ) умножение определяется следующим образом: a(x) b(x) = a(x)*b(x)mod m(x) , где m(x) = x8 + x4 + x3 + x +1.

Результатом умножения будет являтся полином степени меньше 8. В отличие от операции сложения, простой интерпретации для данной операции на байтовом уровне нет.

Умножение ассоциативно, единичным элементом является 0x01. Таким образом, 256 возможных значений байта с вышеописанными операциями сложения и

умножения образуют структуру поля GF(28 ) . 3.1 Умножение на x .

Имеем: x b(x) = (b7 x8 +b6 x7 +b5 x6 +b4 x5 +b3 x4 +b2 x3 +b1 x2 +b0 x) mod m(x)

Тогда если

b

= 0

, то x b(x) =b x7

+b x6

+b x5

+b x4

+b x3 +b x2

+b x ,

 

7

 

6

5

4

3

2

1

0

А

 

если

 

 

 

b7

=1,

то

x b(x) = (b7 x8 +b6 x7 +b5 x6 +b4 x5 +b3 x4 +b2 x3 +b1 x2 +b0 x) m(x)

Таким образом, в байтовом представлении умножение на x сводится к левому сдвигу и операции XOR c 0x1b.

4. Полиномы с коффициэнтами в GF(28 ) .

Полиномы можно определить с коффициэнтами в GF(28 ) . Тогда 4-х байтному

вектору будет соответствовать полином степени менее 4. Полиномы можно складывать просто складывая соответствующие коэффициенты. Таким образом сложением двух векторов будет простое битовое сложение по модулю 2.

4.1.Умножение полиномов.

a(x) = a3 x3 +a2 x2 +a1 x +a0 , b(x) =b3 x3 +b2 x2 +b1 x +b0 .

Тогда d (x) = a(x) b(x) , где

d0 = a0 b0 a3 b1 a2 b2 a1 b3 d1 = a1 b0 a0 b1 a3 b2 a2 b3 d2 = a2 b0 a1 b1 a0 b2 a3 b3 d3 = a3 b0 a2 b1 a1 b2 a0 b3

14

 

d

 

 

a a a a

b

 

 

d0

 

 

a0

a3

a2

a1

b0

 

или в матричной форме

1

 

=

1

0

3

2 1

 

 

 

 

 

 

 

 

 

 

d2

 

 

a2

a1

a0

a3

b2

 

 

d3

 

a3

a2

a1

a0 b3

Такое произведение не всегда обратимо, но в применении к алгоритму будут использоваться полиномы, для которых существуют обратные.

Практическое задание.

1.Перевод байта в 16 форме в 2 форму и соответствующий многочлен в

GF(256).

2.Сложение двух байтов.

3.Умножение по модулю.

4.Умножение на х, применение для умножения на произвольные

многочлены

5. Определение полиномов с коэффицентами в GF(256), сложение полиномов

6.Умножение полиномов.

VI. Режимы сцепления блоков: ECB, CBC, CFB, OFB.

1.ECB (Electronic Code Book). Блоки шифруются независимо и не сцепляются.

2. CBC (Cipher Block Chaining).

15

3. CFB (Cipher FeedBack).

4. OFB (Output FeedBack).

16

ТЕОРИЯ ПРОСТЫХ ЧИСЕЛ

10.2. Нахождение простых чисел

В связи с системой RSA возникают две математические задачи, примыкающие к компьютерной алгебре:

1.разработка методов для нахождения больших простых чисел, позволяющих каждому пользователю построить на компьютере два достаточно случайных простых числа р и q,

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

Наиболее древний алгоритм нахождения простых чисел — решето Эратосфена (III в. до н.э.) — позволяет выписать все простые числа, не превосходящие данного числа n, а также найти наименьший простой делитель числа n, если n — составное число. Алгоритм заключается в следующем: записываем последовательно все числа от 2 до n, затем в полученной таблице вычеркиваем каждое второе число после 2, каждое третье после 3, каждое пятое после 5 и т.д. При этом каждый раз считаются и уже вычеркнутые числа. После каждой процедуры вычеркивания первое, оставшееся невычеркнутым, число k является простым, а затем вычеркиваются все числа,

следующие за k и кратные k. Вычеркивания производят до тех пор, пока k n , так как, очевидно,

любое составное число а имеет делитель ≤ a .

Отсюда получается и «наивный» алгоритм проверки простоты числа n и, заодно, нахождения собственного делителя n в случае, когда n — составное число. Надо n делить с остатком на числа ≤

n (достаточно делить на нечетные числа). Однако этот алгоритм (как и решето Эратосфена) имеет экспоненциальную сложность: если n имеет длину k, т.е. n в двоичной записи содержит k бит, то надо

k

проделать порядка n 2 2 операций деления с остатком. Поэтому для больших n (порядка 10100) наивный алгоритм практически неприменим.

Асимптотический закон распределения простых чисел

Пусть π (х) — количество простых чисел, не превосходящих х. Согласно асимптотическому

закону распределения простых чисел:

π(х)

 

 

 

limx→∞

=1

 

 

х

 

 

 

 

 

 

 

 

 

 

 

 

 

 

π(х)

 

ln x

 

Величина

равна вероятности, с которой

 

наугад выбранное натуральное число, не

х

 

 

 

 

 

 

 

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

x случайных чисел от 1 до х, то очень высока вероятность, что хотя бы одно из этих чисел будет простым. Например, если n = 10100, то ln n ≈ 230, и для нахождения простого числа ≤ 10100 надо проверить на простоту 230 случайно выбранных чисел. Впрочем, достаточно рассматривать только нечетные числа, что сокращает проверку практически в два раза, и мы получаем 115 чисел для проверки на простоту. Это уже вполне посильная задача для компьютера. Отметим, что наугад выбранное число ≤ 10100 с вероятностью ≈ 0,9 имеет в своей записи 100 цифр, с вероятностью ≈ 0,99

— не менее 99 цифр, с вероятностью ≈ 0,999 — не менее 98 цифр и т.д. Поэтому с большой вероятностью среди 115 случайно выбранных нечетных чисел ≤ 10100 будет содержаться большое простое число (около 100 десятичных знаков).

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

17

Вероятностный тест на простоту Миллера-Рабина

Согласно малой теореме Ферма для любого простого n и любого а Zn+ = {1, 2, ···, n-1}

an-1 ≡ 1(mod n)

(1)

Определение. Натуральное число n называется псевдопростым по основанию а Zn+ , если

выполнено соотношение (1).

Очевидно, если n — псевдопростое по основанию а, то (а,n) = 1, значит, а U(Zn).

Если найдется а U(Zn), такое, что (1) не выполняется, т.е. n не является псевдопростым по основанию а, то число n составное. Обратное неверно. Существуют составные числа n, для которых

(1) выполняется для всех а U(Zn). Такие составные числа n называются числами Кармайкла по имени математика, исследовавшего эти числа в начале ХХ века. Первые числа Кармайкла — 561 = 3 · 11 · 17, 1105 = 5 · 13 · 17, 1729 = 7 · 13 · 19.

В 1994 г. Алфорд, Гранвилл и Померанц1 доказали, что множество чисел Кармайкла бесконечно, хотя они и достаточно редки. Среди первых ста миллионов положительных чисел имеется только 255 чисел Кармайкла.2 Число n является числом Кармайкла тогда и только тогда, когда:

1.n — произведение, по крайней мере, трех различных простых чисел,

2.n — свободно от квадратов (т.е. n не делится на число, являющееся квадратом, 3.если простое р делит n, то p-1 делит n-1 (Кармайкл, 1912).

Итак, для чисел Кармайкла проверка условия (1) не дает результата: для любого а U(Zn) (1) выполняется. Однако для простого числа n из (1) можно получить и другие сравнения.

Действительно, пусть 2s — максимальная степень 2, делящая n-1, n-1 = 2s·u. Так как an-1-1 = a2s u - 1 =(au-1) (au+1)(a2u+1)(a4u+1)··· (a2s 1 u +1)≡ 0(mod n) и кольцо Zn является полем (n — простое), то одна из скобок равна 0 в Zn. Поэтому косвенным подтверждением, что n — простое число, является выполнение для любого а Zn+ одного из следующих сравнений:

u

1(mod n), a

2r u

-1(mod n), 0

r < s.

(2)

a

 

Следовательно, если найдется число а Zn+ для которого либо не выполняется (1), либо не выполняется ни одной из соотношений (2), то число n — составное. Будем называть такие числа а Zn+ хорошими для n. Мы покажем, что для составного числа n хорошие числа существуют, и их достаточно много, чтобы использовать случайно выбранные а Zn+ для исследования числа n. Вероятностный тест на простоту Миллера-Рабина заключается в проверке соотношений (1),(2) для случайно выбранных а Zn+ .

Анализ алгоритма Миллера-Рабина

Мы покажем, что для составного числа n количество хороших а Zn+ не меньше n 21 .

Следовательно, вероятность случайного выбора плохого а не больше ½, а, значит, при t-кратном случайном выборе вероятность того, что все выбранные а являются плохими, не превосходит 2-t. Это и есть вероятность того, что при составном n алгоритм MILLER-RABIN (n, t) дает на выходе значение PRIME. Например, при t = 50 вероятность ошибки значения PRIME очень мала и не превосходит 2-50. Понятно, что такой вероятностью можно пренебречь.

Теорема. Для нечетного составного числа n количество хороших чисел а Zn+ не меньше n 21 .

1Alford W.R., Granville A., Pomerance C. There are infinitly many Carmichael numbers // Ann. Math. 140, 1994/ P/ 703-722/

2Кормен Т., Лейзерсон Ч., Ривест Р. Алгоритмы: построение и анализ. М.: МЦНМО, 1999. — 960 с.

18

ДОКАЗАТЕЛЬСТВО. Мы покажем, что число плохих а для n не превосходит

n 21 . Для плохих а

вычисляются все соотношения (1) — (2). В частности из (1) следует, что плохое число а взаимно

просто с n, т.е. а U(Zn).

Идея доказательства состоит в том, чтобы показать, что все плохие а лежат в некоторой собственной подгруппе H U(Zn). По теореме Лагранжа порядок Н является делителем n и, значит, число элементов в любой собственной подгруппе не превосходит половины элементов группы.

Таким

образом, количество плохих а Zn+ не превосходит половины элементов группы:

 

U (Zn )

 

 

<

 

Zn+

 

 

=

n 1

.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

 

 

2

 

 

2

 

 

 

 

 

 

 

 

 

Рассмотрим два случая:

1)n не является числом Кармайкла, т.е. существует а U(Zn) такое, что an-1 1(mod n). Тогда множество H = {x U(Zn) | xn-1 1(mod n)} является собственной подгруппой в U(Zn) (т.е. а

H). Так как все плохие числа лежат в Н, то утверждение справедливо.

2)Пусть n — число Кармайкла, т.е. для всех а U(Zn) выполнено сравнение (1). Покажем, что n с, pделится на два различных простых числа. Если n = p —простое, с>1, то

U (Zn ) =ϕ(n) = ( p 1) pc1 . Так как группа U(Zn) — циклическая, то ϕ(n) | n 1. Следовательно

р|n-1 = pc-1. Противоречие. Представим n в виде n = m1m2, (m1, m2) = 1, mi > 1. Запишем n-1 в виде n-1 = 2s·u, где 2s — наибольшая степень двойки, делящая n-1. Рассмотрим часть последовательности значений в Zn, которые принимает переменная d в алгоритме GOOD

NUMBER (a, n) для произвольного а Zn+ .

u

2u

4u

2s u

)

(4)

Da = (a

, a

, a , ···, a

 

Если а = -1, то au = -1 в Zn, так как n — нечетное

число. Поэтому существует b U(Zn), для

 

которого существует максимальное j с условием b2s u -1(mod n) среди всех элементов а U(Zn), для которых в последовательности Dа встречается -1.

Пусть Н = { х U(Zn) | x2s u ≡ ± 1(mod n)}. Н — подгруппа в U(Zn).

а) все плохие числа лежат в Н.

Действительно, если а — плохое число, то а U(Zn) и для a2s u = аn-1 ≡ 1(mod n), т.е. полезный элемент в последовательности Dа равен 1. Если au ≡ 1(mod n), то a2s u = 1 и а Н. Если au ≡ 1(mod n),

то среди чисел a2s u есть -1 по определению плохого числа. В силу выбора j, k j. Поэтому a2 j u ≡ ±

1(mod n) и а Н.

в) Н — собственная подгруппа в U(Zn).

Для элемента в имеем сравнение bu ≡-1(mod n). Следовательно, b2 j u ≡-1(mod m1). Применим китайскую теорему об остатках. Существует f Zn+ , такой, что f b(mod m1) и f ≡ 1(mod m2). Тогда

f 2 j u ≡ - 1(mod m1) и f 2 j u ≡ 1(mod m2).

Следовательно, f 2 j u ≡ ± 1(mod n). По построению f b(mod m1), поэтому (f, m1) = 1. Аналогично,

(f, m2) = 1. Поэтому (f, n) = 1 и f U(Zn). Итак, существует f U(Zn), такой, что f Н.

Мы снова показали, что все плохие числа лежат в собственной подгруппе группы U(Zn). Согласно более сильной оценке Рабина для n ≠ 9 вероятность случайного выбора плохого числа

не превосходит ¼ и эта оценка не улучшаема.

19