Автор работы: Пользователь скрыл имя, 07 Января 2014 в 09:01, курсовая работа
Цель курсового проекта: Рассмотреть алгоритм шифрования AES (Rijndael). Рассмотреть основные математические операции. Разобрать и реализовать процедуры AddRoundKey, SubBytes, ShiftRows, MixColumns.
Задачи:
1. Рассказать о шифровании AES.
2. Понять принцип построение стандарта шифрования.
3. Разобрать алгоритм Rijndael.
Введение 2
Глава 1. Стандарт шифрования данных AES. 3
1.1 Алгоритм шифрования AES 3
1.2 Перспективный стандарт AES 8
1.3 Атака на алгоритм шифрования AES 12
Глава 2. Алгоритм Райндал (Rijndael). Основные особенности шифра Райндал. 14
2.1 Алгоритм Rijndael. Предварительные математические понятия 14
2.2 Сложение 14
2.3 Умножение 15
2.4 Умножение на Х 16
2.5 Обоснование разработки 17
2.6 Спецификация алгоритма 18
2.7 Состояние, ключ шифрования и число раундов 19
2.8 Преимущества алгоритма 20
2.9 Расширения 21
2.10 Другие возможности 22
2.11 Преимущества алгоритма шифрования Rijndael (AES) 23
Заключение 24
Литература 25
m(x) = x8 + x4 + x3 + x + 1
или '11B' в шестнадцатеричном представлении.
Пример: '57' • '83' = 'C1'
Или
(x6 + x4 + x2 + х + 1) (x7 + х + 1) = |
= x13 + x11 + x9 + x8 + x7 + x7 + x5 + x3 + x2 + x + x6 + x4 + x2 + х + 1 = |
= x13 + x11 + x9 + x8 + x6 + x5 + x4 + x3 + 1 |
(x8 + x4 + x3 + х + 1) (x5 + x3) + x7 + x6 + 1 = x13 + x11 + x9 + x8 + x6 + x5 + x4 + x3 +1
Следовательно,
x13 + x11 + x9 + x8 + x6 + x5 + x4 + x8 + 1 mod (x8 + x4 + x3 + х + 1) = x7 + x6 + 1
Ясно, что результат является двоичным полиномом не выше 8 степени. В отличие от сложения, простой операции умножения на уровне байтов не существует.
Умножение, определенное выше, является ассоциативным, и существует единичный элемент ('01'). Для любого двоичного полинома b(x) не выше 8-й степени можно использовать расширенный алгоритм Евклида для вычисления полиномов a(x) и c(x) таких, что
b(x) a(x) + m(x) c(x) = 1
Следовательно,
a(x) • b(x) mod m(x) = 1
или
b-1(x) = a(x) mod m(x)
Более того, можно показать, что
a(x) • (b(x) + c(x)) =
a(x) • b(x) + a(x) • c(x)
Из всего этого следует, что множество из 256 возможных значений байта образует конечное поле GF (28) c XOR в качестве сложения и умножением, определенным выше.
Если умножить b(x) на полином х, мы будем иметь:
b7x8 + b6x7 + b5x6 + b4x5 + b3x4 + b2x3 + b1x2 + b0x
x • b(x) получается понижением предыдущего результата по модулю m(x). Если b7 = 0, то данное понижение является тождественной операцией. Если b7 = 1, m(x) следует вычесть (т.е. XORed). Из этого следует, что умножение на х может быть реализовано на уровне байта как левый сдвиг и последующий побитовый XOR c '1B'. Данная операция обозначается как b = xtime (a).
Полиномы могут быть определены с коэффициентами из GF(28). В этом случае четырехбайтный вектор соответствует полиному степени 4.
Полиномы могут быть сложены
простым сложением
Умножение представляет собой более сложное действие. Предположим, что мы имеем два полинома в GF(28).
a(x) = a3x3 + a2x2 + a1x + a0
b(x) = b3x3 + b2x2 + b1x + b0
c(x) = a(x) b(x) определяется следующим образом:
с(x) = с6x6 + с5x5 + с4x4 + с3x3 + с2x2 +
с1x + с0
с0 = a0 • b0
с1 = a1 • b0 a0 • b1
с2 = a2 • b0 a1 • b1 a0 • b2
с3 = a3 • b0 a2 • b1 a1 • b2 a0 • b3
с4 = a3 • b1 a2 • b2 a1 • b3
с5 = a3 • b2 a2 • b3
с6 = a3 • b3
Ясно, что в таком виде с(х) не может быть представлен четырехбайтным вектором. Понижая с(х) по модулю полинома 4-й степени, результат может быть полиномом степени ниже 4. В Rijndael это сделано с помощью полинома
M(x) = x4 + 1
так как
xj mod (x4 + 1) = xj mod 4
Модуль, получаемый из а(х) и b(x), обозначаемый 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
Операция, состоящая из умножения фиксированного полинома а(х), может быть записана как умножение матрицы, где матрица является циклической. Мы имеем
Замечание: х4 + 1 не является несократимым полиномом в GF (28), следовательно, умножение на фиксированный полином необязательно обратимо. В алгоритме Rijndael выбран фиксированный полином, который имеет обратный.
При разработке алгоритма учитывались следующие три критерия:
В большинстве алгоритмов шифрования преобразование каждого раунда имеет структуру сети Фейштеля . В этом случае обычно часть битов в каждом промежуточном состоянии просто перемещается без изменения в другую половину. Преобразование раунда алгоритма Rijndael не имеет структуру сети Фейштеля. Вместо этого преобразование каждого раунда состоит из четырех различных преобразований, называемых слоями.
Каждый слой разрабатывался с учетом противодействия линейному и дифференциальному криптоанализу. В основу каждого слоя положена своя собственная функция:
Перед первым раундом применяется дополнительное забеливание с использованием ключа. Причина этого состоит в следующем. Любой слой после последнего или до первого добавления ключа может быть просто снят без знания ключа и тем самым не добавляет безопасности в алгоритм (например, начальная и конечная перестановки в DES). Начальное или конечное добавление ключа применяется также в некоторых других алгоритмах, например IDEA, SAFER и Blowfish.
Для того чтобы сделать структуру алгоритма более простой, слой линейного перемешивания последнего раунда отличается от слоя перемешивания других раундов. Можно показать, что это в любом случае не повышает и не понижает безопасность. Это аналогично отсутствию операции swap в последнем раунде DES.
Rijndael является блочным алгоритмом шифрования с переменной длиной блока и переменной длиной ключа. Длина блока и длина ключа могут быть независимо установлены в 128, 192 или 256 бит.
Различные преобразования выполняются над промежуточным результатом, называемым состоянием.
Состояние можно рассматривать как двумерный массив байтов. Этот массив имеет четыре строки и различное число столбцов, обозначаемое как Nb, равное длине блока, деленной на 32. Ключ также можно рассматривать как двумерный массив с четырьмя строками. Число столбцов ключа шифрования, обозначаемое как Nk, равно длине ключа, деленной на 32.
В некоторых случаях эти блоки
также рассматриваются как
Если необходимо указать четыре
отдельных байта в
Рис. 6 Пример состояния (с Nb = 6) и ключа
шифрования (с Nk = 4)
Входы и выходы Rijndael считаются одномерными массивами из 8 байтов, пронумерованными от 0 до 4* Nb - 1. Следовательно, эти блоки имеют длину 16, 24 или 32 байта, и массив индексируется в диапазонах 0 … 15, 0 … 23 или 0 … 31. Ключ считается одномерным массивом 8-битных байтов, пронумерованных от 0 до 4* Nk - 1. Следовательно, эти блоки имеют длину 16, 24 или 32 байта, и массив индексируется в диапазонах 0 … 15, 0 … 23 или 0 … 31.
Входные байты алгоритма отображаются в байты состояния в следующем порядке: А0,0, А1,0, А2,0, А3,0, А0,1, А1,1, А2,1, А3,1, … Байты ключа шифрования отображаются в массив в следующем порядке: K0,0, K1,0, K2,0, K3,0, K0,1, K1,1, K2,1, K3,1, … После выполнения операции шифрования выход алгоритма получается из байтов состояния аналогичным образом.
Следовательно, если одноразмерный индекс байта в блоке есть n, и двухмерный индекс есть (i,j), то мы имеем:
I = n mod 4
J = n / 4
N = i + 4*j
Более того, индекс i является также номером байта в четырехбайтном векторе или слове, j является индексом вектора или слова во вложенном блоке.
Число раундов обозначается Nr и зависит от значений Nb и Nk, что показано в следующей таблице.
Таблица 1. Число раундов как функция от длины блока и длины ключа | |||
Nr |
Nb = 4 |
Nb = 6 |
Nb = 8 |
Nk = 4 |
10 |
12 |
14 |
Nk = 6 |
12 |
12 |
14 |
Nk = 8 |
14 |
14 |
14 |
Преимущества, относящиеся к аспектам реализации:
Простота разработки:
Переменная длина блока:
Расширения:
Обработка ключа поддерживает длину ключа, которая была бы кратна 4 байтам. Единственным параметром, который необходим для определения другой длины ключа, отличной от 128, 192 или 256 бит, является число раундов алгоритма.
Структура алгоритма допускает произвольную длину блока, кратную 4 байтам, с минимумом в 16 байтов. Добавление ключа и ByteSub и MixColumn преобразования не зависят от длины блока. Единственным преобразованием, которое зависит от длины блока, является ShiftRow. Для каждой длины блока должен быть определен специальный массив С1, С2, С3.
Можно определить расширение Rijndael, которое также поддерживает длины блока и ключа между 128 и 256 битами с приращением в 32 бита. Число раундов определяется так:
Nr = max (Nk, Nb) + 6
Это расширяет правило для
Дополнительные значения С1, С2 и С3 определены в следующей таблице.
Таблица 2 Величина сдвига в зависимости от длины блока | |||
Nb |
С1 |
С2 |
С3 |
5 |
1 |
2 |
3 |
7 |
1 |
2 |
4 |
Информация о работе Алгоритм Райндал (Rijndael). Основные особенности шифра Райндал