Скачиваний:
21
Добавлен:
26.05.2014
Размер:
284.26 Кб
Скачать

МИНИСТЕРСТВО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ

МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ ИНСТИТУТ РАДИОТЕХНИКИ, ЭЛЕКТРОНИКИ И АВТОМАТИКИ (ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ)

ФАКУЛЬТЕТ ВЫЧИСЛИТЕЛЬНЫХ МАШИН И СИСТЕМ

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

Ф.И.О. студента Рыжов Алексей Владимирович

Группа ВИ-1-00

Москва 2004

Содержание

1

Введение.

3

2

Создание криптосистемы.

3

 

2.1

Изменения исходного криптоалгоритма. . . . . . . . . . . . . . .

3

 

2.2

Определения и обозначения. . . . . . . . . . . . . . . . . . . . .

3

 

2.3

Математическая интерпретация. . . . . . . . . . . . . . . . . . .

4

 

2.4

Спецификация алгоритма. . . . . . . . . . . . . . . . . . . . . . .

5

 

 

2.4.1 Зашифрование. . . . . . . . . . . . . . . . . . . . . . . . .

6

2.4.2Расшифрование. . . . . . . . . . . . . . . . . . . . . . . . 7

2.4.3Процедура развертывания ключа. . . . . . . . . . . . . . 7

2.5 Программная реализация. . . . . . . . . . . . . . . . . . . . . . .

8

3 Методы криптоанализа.

8

3.1Дифференциальный криптоанализ. . . . . . . . . . . . . . . . . 9

3.1.1 Описание криптоанализа. . . . . . . . . . . . . . . . . . . 9

3.1.2Дифференциальный анализ S-блока. . . . . . . . . . . . 10

3.1.3 Построение дифференциальной характеристики. . . . . . 11

3.1.4Извлечение бит подключа последнего раунда. . . . . . . 13

3.1.5Восстановление исходного ключа. . . . . . . . . . . . . . 16

3.1.6Эффективность криптоанализа. . . . . . . . . . . . . . . 16

3.1.7 Программная реализация. . . . . . . . . . . . . . . . . . . 16 3.2 Линейный криптоанализ. . . . . . . . . . . . . . . . . . . . . . . 16 3.2.1 Описание криптоанализа. . . . . . . . . . . . . . . . . . . 16

3.2.2Линейный анализ S-блока. . . . . . . . . . . . . . . . . . 18

3.2.3Построение линейного приближения. . . . . . . . . . . . 18

3.2.4Извлечение бит подключа последнего раунда. . . . . . . 21

3.2.5Восстановление исходного ключа. . . . . . . . . . . . . . 22

3.2.6Эффективность криптоанализа. . . . . . . . . . . . . . . 23

3.2.7 Программная реализация. . . . . . . . . . . . . . . . . . . 23

4 Криптосистема как генератор псевдослучайных последовательно-

 

стей.

24

4.1Введение. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

4.2 Общее описание набора тестов Руководства НИСТ. . . . . . . . 25 4.3 Описание каждого теста и их параметры. . . . . . . . . . . . . . 27

4.3.1Частотный (Монобитный) тест (Frequency). . . . . . . 27

4.3.2Частотный тест в подпоследовательностях

(Block-Frequency). . . . . . . . . . . . . . . . . . . . . 27

4.3.3Тест “дырок” (Runs). . . . . . . . . . . . . . . . . . . . . 27

4.3.4Тест “блоков” в подпоследовательностях (Long-Run). . 27

4.3.5Проверка рангов матриц (Rank). . . . . . . . . . . . . . 27

4.3.6Спектральный тест (FFT). . . . . . . . . . . . . . . . . . 28

4.3.7Проверка непересекающихся шаблонов (Aperiodic-Template). . . . . . . . . . . . . . . . . . 28

4.3.8Проверка пересекающихся шаблонов

(Periodic-Template). . . . . . . . . . . . . . . . . . . 28 4.3.9 Универсальный тест Маурера (Universal). . . . . . . . 28

1

4.3.10Проверка сжатия при помощи алгоритма Лемпела-Зива (Lempel-Ziv). . . . . . . . . . . . . . . . . . . . . . . . 28

4.3.11Проверка линейной сложности (Linear-Complexity). 29

4.3.12Проверка серий (Serial). . . . . . . . . . . . . . . . . . 29

4.3.13Проверка аппроксимированной энтропии (Apen). . . . . 29

4.3.14Проверка кумулятивных сумм (Cusum). . . . . . . . . . 29

4.3.15Проверка случайных отклонений (Random-Excursion). 30

4.3.16Проверка случайных отклонений (вариант) (Random-Excursion-V). . . . . . . . . . . . . . . . . . 30

4.4Результат тестирования генератора. . . . . . . . . . . . . . . . . 30

5 Вывод.

34

2

1 Введение.

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

На первом этапе мы создадим криптосистему на основе криптографического алгоритма Rijndael, принятого в 2001 г. в качестве американского стандарта криптографической защиты AES. AES принят на замену морально устаревшему DES — самому распространенному криптоалгоритму в мире. Этим и обусловлен наш выбор основы нашего алгоритма.

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

На третьем этапе мы рассмотрим работу нашей системы в режиме генератора псевдослучайных последовательностей (ПСП). Для оценки их качества мы выберем один из наиболее известных статистических тестов, применяемых для анализа генераторов, — Руководство по статистическому тестированию генераторов ПСП (Руководство НИСТ).

2Создание криптосистемы.

2.1Изменения исходного криптоалгоритма.

Спецификация исходного криптоалгоритма Rijndael описана в Федеральном стандарте шифрования США и легко доступна, поэтому останавливаться на подробном описании мы не будем. Остановимся только на основных его параметрах.

Алгоритм Rijndael относится к числу симметричных блочных шифров и имеет архитектуру “квадрат” (4 × 4), размер каждой ячейки 8 бит; размер блока (бит) 128, 192 или 256 (в качестве стандарта принят вариант шифра только с размером блока 128 бит); pазмер ключа (бит) 128, 192 или 256; число раундов 10, 12 или 14; pазмер ключевого элемента (бит) 128, 192 или 256 (равен размеру блока); число ключевых элементов 11, 13 или 15 (на 1 больше числа раундов).

На его основе мы создадим его упрощенный аналог. Архитектуру квадрата уменьшим до размера 2 × 2. Размер ячейки оставим прежним, но при преобразовании S-блока разделим 8 бит на две независимые группы по 4 бита. Соответственно размер блока и ключа уменьшится до 32 бит. Число раундов сократим до 3.

Более подробные детали изменений будут рассмотрены в спецификации алгоритма.

2.2 Определения и обозначения.

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

3

K

ключ шифрования (ключи зашифрования и рас-

 

шифрования совпадают)

Nb

число столбцов (16-битных слов) (равно 2)

Nk

число 16-битных слов ключа (равно 2)

Nr

число раундов (равно 3)

w[i..j]

срез массива развернутого ключа (индексация ве-

 

дется в 16-битных словах)

AddRoundKey()

функция добавления ключа

SubBytes()

функция побайтной замены

ShiftRows()

функция циклического сдвига строк

MixColumns()

функция линейной замены столбцов

InvSubBytes()

функция побайтной замены, обратная к

 

SubBytes()

KeyExpansion()

функция выработки расширенного ключа из K

Rcon[]

массив констант, используемых в функции расши-

 

рения ключа KeyExpansion()

RotWord()

функция, которая меняет местами старшие и млад-

 

шие разряды 16-битного слова

SubWord()

функция побайтной замены в 16-битном слове

 

операция сложения в поле GF(28) (операция

 

Исключающие-ИЛИ)

операция умножения в поле GF(28)

 

операция умножения двух многочленов (степень

 

каждого из которых < 2) по модулю x2 + 1

Вход и выход нашего алгоритма представляют собой последовательности из 32 бит каждая.

inp0 inp1 inp2 . . . inp30 inp31

out0 out1 out2 . . . out30 out31

Промежуточное состояние последовательности во время работы алгоритма называется state. В начале работы state = inp, а в конце out = state.

Каждая последовательность разбивается на четыре группы по 8 бит.

state = [s0 s1 s2 s3]

Эти группы образуют следующий квадрат:

s0 s2

s1 s3

2.3 Математическая интерпретация.

Каждая ячейка квадрата (последовательность 8 бит) интерпретируется как запись коэффициентов многочлена с коэффициентами над полем GF(2) (нумерация идет справа налево).

si = [b7 b6 b5 b4 b3 b2 b1 b0]

 

7

b7x7 + b6x6 + b5x5 + b4x4 + b3x3 + b2x2 + b1x1 + b0x0

P

= bixi

 

i=0

4

Например, многочлен x6 + x5 + x2 + 1 можно записать в разных формах: в двоичной — 01100101, или в шестнадцатеричной — 65. Далее в работе в основном будет использоваться последняя форма записи.

Поле GF(28) — это поле многочленов с коэффициентами над полем GF(2) по модулю m(x).

m(x) = x8 + x4 + x3 + x + 1

В данном аспекте никаких изменений в нашей криптосистеме сделано не было. Следовательно описание операций сложения и умножения в поле GF(28) нашей системы совпадает с исходной.

Но из-за изменения количества строк и столбцов квадрата, изменилась операция умножения полиномов с коэффициентами над полем GF(28). Если в исходной схеме были многочлены по модулю x4 +1, то в нашем случае модуль равен x2 + 1. Выбор такого модуля обусловлен сохранением выражения:

xi mod (x2 + 1) = xi mod 2.

Пусть даны два многочлена над полем GF(28)

a(x) = a1x + a0, и b(x) = b1x + b0.

Тогда их сумма будет равна

a(x) + b(x) = (a1 b1)x + (a0 b0),

а произведение равно

d(x) = a(x) b(x) = d1x + d0 d0 = a0 • b0 a1 • b1

d1 = a0 • b1 a1 • b0

Заметим, что если многочлен a(x) фиксирован, то умножение можно записать в матричной форме

· d1

¸ =

· a1

a0

¸ · b1

¸

d0

 

a0

a1

b0

 

2.4Спецификация алгоритма.

Приведем конкретные алгоритмы для зашифрования и расшифрования. Для начала отметим, что для обоих алгоритмов раунд состоит из четырех этапов (преобразований различного характера).

Первое преобразование — это взаимооднозначная замена одного байта на другой. Это преобразование является нелинейным, в литературе оно носит название S-блока. В программной реализации за это преобразование отвечает функция SubBytes().

Второе преобразование — это циклический сдвиг влево каждой строки на определенное число позиций. В программной реализации за это преобразование отвечает функция ShiftRows().

Третье преобразование — это преобразует каждый столбец в другой по определенному правилу. В программной реализации за это преобразование отвечает функция MixColumns(). Второе и третье преобразования вместе образуют линейное, в литературе оно носит название P-блока.

Четвертое преобразование — это сложение по модулю 2 текущего состояния и ключа раунда. В программной реализации за это преобразование отвечает функция AddRoundKey().

5

2.4.1 Зашифрование.

Полный алгоритм зашифрования описан следующим образом:

state = inp

AddRoundKey(state, w[0..1]) for round = 1 step 1 to Nr–1

SubBytes(state)

ShiftRows(state)

MixColumns(state)

AddRoundKey(state, w[round*Nb..round*Nb+1]) end for

SubBytes(state)

ShiftRows(state)

AddRoundKey(state, w[Nr*Nb..Nr*Nb+1])

out = state

Откуда видно, что последний раунд отличается от всех отсутствием преобразования MixColumns(). Кроме того, можно условно рассматривать первое преобразование AddRoundKey() как 0 раунд.

Преобразование SubBytes(). Упрощение данного преобразования является самым значимым, так как выбор определенного S-блока сильно сказывается на результатах методов криптоанализа.

Во-первых, зададим подстановку S16, которая действует на полубайте.

0

1

2

3

4

5

6

7

8

9

A B C D E F

↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓

9

B

8

E

A

C

6

4

D

F

1

3

5

7

2

0

Во-вторых, разделим байт s на старшие sH и младшие полубайты sL. Нелинейное преобразование SB[s] байта s строится следующим образом

SB[s] = SB[sH sL] = [S16(sH )S16(sL)].

Другими словами, мы заменяем каждую шестнадцатеричную цифру на другую в соответствии с подстановкой S16.

Итоговое преобразование SubBytes() заменяет каждый байт si на SB[si].

Преобразование ShiftRows(). Так как у нас всего две строки, то первая строка остается на месте (сдвиг на 0 позиций), а вторая на 1 позицию.

Преобразование MixColumns(). Каждый столбец нашей системы можно представить как полином 1 степени с коэффициентами над полем GF(28). Преобразование MixColumns() заменяет каждый столбец [s0 s1] на другой [s0 s1] по следующему правилу s(x) = a(x) s(x), где a(x) = 03x + 02:

· s1

¸ =

· 03

02

¸ · s1

¸

s0

 

02

03

s0

 

6

Преобразование AddRoundKey(). Это преобразование остается без изменений. Оно заключается в том, что каждый столбец [s0+2·c s1+2·c] складывается с 16-битным словом расширенного ключа wround·N b+c

2.4.2 Расшифрование.

Полный алгоритм расшифрования описан следующим образом:

state = inp

AddRoundKey(state, w[Nr*Nb..Nr*Nb+1]) for round = Nr-1 step -1 downto 1

ShiftRows(state)

InvSubBytes(state)

AddRoundKey(state, w[round*Nb..round*Nb+1]) MixColumns(state)

end for ShiftRows(state) InvSubBytes(state)

AddRoundKey(state, w[0..1])

out = state

Алгоритм расшифрования полностью повторяет алгоритм зашифрования в обратном порядке, за исключением одного преобразования InvSubBytes(), которое является обратным к SubBytes(). Остальные преобразования по построению оказались совпали со своими обратными.

Преобразование InvSubBytes(). Данное преобразование по построению эквивалентно своему обратному, разница в том, что вместо подстановки S16 используется обратная к ней подстановка S16−1.

0

1

2

3

4

5

6

7

8

9

A B C D E F

↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓

F

A

E

B

7

C

6

D

2

0

4

1

5

8

3

9

2.4.3 Процедура развертывания ключа.

В нашей системе ключ имеет длину 32 бита. Так как на каждом раунде применяется свой раундовый ключ, то расширенный ключ строится с помощью процедуры развертывания ключа KeyExpansion() из исходного ключа K.

Алгоритм этой процедуры следующий:

word temp

i = 0

while (i < Nk)

w[i] = word(key[2*i], key[2*i+1]) i = i+1

end while

7

i = Nk

while (i < Nb * (Nr+1)) temp = w[i-1]

if (i mod Nk = 0)

temp = SubWord(RotWord(temp)) xor Rcon[i/Nk] end if

w[i] = w[i-Nk] xor temp i = i + 1

end while

Из этого алгоритма следует, что раундовый ключ строится только по ключу предыдущего раунда, т.е. это рекуррентная процедура.

Преобразование RotWord(). Это преобразование меняет местами координаты столбца [w0 w1] на столбец [w1 w0]. Данное преобразование эквивалентно умножению на x:

w(x) = w(x) x

Преобразование SubWord(). Это преобразование повторяет преобразование SubBytes(), только в данном случае оно действует на столбец расширенного ключа.

Раундовая константа Rcon[i]. Для раунда i данная константа равняется

[xi−1 00].

2.5 Программная реализация.

Исходный код на языке C++ нашей криптосистемы приведен в Приложении 1.

3 Методы криптоанализа.

Наши методы криптоанализа проводятся при выбираемых открытых текстов X и соответствующих им шифртекстов Y = f (X, K). Их целью является восстановление неизвестного ключа K.

Зададим значение ключа равное K = [2B 7E 15 16], одинаковое для двух методов криптоанализа. Это значение и требуется определить в ходе атаки, используя разные методы.

Прежде чем перейти непосредственно к конкретным типам криптоанализа, оценим верхнюю границу их эффективности.

Длина ключа нашей системы составляет 32 бита. Соответственно методом полного перебора всего ключевого пространства мы обязательно найдем неизвестный ключ K= K. Для этого нам потребуется максимально 232 шифрований вида Y = f (X, K).

Следовательно, целью криптоанализа является не только восстановление неизвестного ключа K, но и чтобы это восстановление с вычислительной стороны было эффективнее метода полного перебора. Иначе считается, что криптосистема стойка к данным методам криптоанализа.

8

3.1 Дифференциальный криптоанализ.

3.1.1 Описание криптоанализа.

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

X = [X1 X2 . . . Xn]

и выходом

Y = [Y1 Y2 . . . Yn].

Возьмем два входа Xи X′′ c соответствующими выходами Y и Y ′′, соответственно. Разность этих двух входов задается как X = XX′′, где представляет двоичную операцию Исключающие-ИЛИ n-битных векторов и, следовательно,

X = [ΔX1 X2 . . .

Xn]

где Xi = XiXi′′. Подобным образом определяется разность двух выходов

Y.

Видеальном рандомизированном шифре, вероятность, что определенная

разница Y происходит при определенной разности X, равняется 1/2n, где n — число бит в X. Дифференциальный криптоанализ стремится найти такую ситуацию, в которой определенная разность Y происходит при определенной разности X с очень высокой вероятностью (то есть, намного большей чем 1/2n). Пара (ΔX, Y ) называется дифференциалом.

Дифференциальный криптоанализ — это атака с выбираемым открытом текстом. Это означает, что нападающий может выбирать входы и исследовать выходы в попытке получить ключ. Для дифференциального криптоанализа, нападающий выберает пары входов Xи X′′, удовлетворяющих определенной разности X, зная что для этого значения X определенное значение Y происходит с высокой вероятностью.

В этом разделе мы исследуем построение дифференциала (ΔX, Y ), состоящего из открытого текста X и входа последнего раунда системы Y . Мы будем делать это, исследуя высоковероятные дифференциальные характеристики, где дифференциальная характеристика — это последовательность разностей входа и выходов для каждого раунда такая, что разность выхода одного раунда соответствует разности входа для следующего раунда. Использование высоковероятной дифференциальной характеристики дает нам возможность использовать информацию для получения битов ключа последнего раунда.

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

9