Автор: Пользователь скрыл имя, 26 Ноября 2011 в 09:27, курсовая работа
Шифрование — способ преобразования открытой информации в закрытую и обратно. Применяется для хранения важной информации в ненадёжных источниках или передачи её по незащищённым каналам связи. Согласно ГОСТ 28147-89, шифрование подразделяется на процесс зашифровывания и расшифровывания.
В зависимости от алгоритма преобразования данных, методы шифрования подразделяются на гарантированной или временной крипто-стойкости.
Введение 2
История AES 3
Описание AES 4
Программная реализация алгоритма AES 11
Листинг программы 13
Заключение 32
Список использованной литературы 33
МИНИСТЕРСТО ОБРАЗОВАНИЯ И НАУКИ РЕСПУБЛИКИ КАЗАХСТАН
АЛМАТИНСКИЙ УНИВЕРСИТЕТ ЭНЕРГЕТИКИ И СВЯЗИ
КАФЕДРА: «Компьютерные технологии»
ДИСЦИЛИНА:
«ОИБ»
ОТЧЕТ
по курсовой работе
Тема:
«Реализация криптографического
алгоритма (AES) Rijndael»
Выполнил: ст. гр. БВТ 09-4
Рахматуллин А.А.
Проверил:
доцент Шайхин Б.М.
Алматы
2011
Содержание
Введение 2
История AES 3
Описание AES 4
Программная реализация алгоритма AES 11
Листинг программы 13
Заключение 32
Список
использованной литературы 33
Шифрование — способ преобразования открытой информации в закрытую и обратно. Применяется для хранения важной информации в ненадёжных источниках или передачи её по незащищённым каналам связи. Согласно ГОСТ 28147-89, шифрование подразделяется на процесс зашифровывания и расшифровывания.
В зависимости от алгоритма преобразования данных, методы шифрования подразделяются на гарантированной или временной крипто-стойкости.
В зависимости от структуры используемых ключей методы шифрования подразделяются на
В далеком 1998 году
NIST объявил конкурс на создание алгоритма,
удовлетворяющего выдвинутым институтом
требованиям. Он опубликовал все
несекретные данные о тестировании
кандидатов на роль AES и потребовал
от авторов алгоритмов сообщить о
базовых принципах построения используемых
в них констант. В отличие от
ситуации с DES, NIST при выборе AES не
стал опираться на секретные и, как
следствие, запрещенные к публикации
данные об исследовании алгоритмов-кандидатов.
Чтобы быть утвержденным в качестве стандарта, алгоритм должен был:
реализовать шифрование частным ключом;
представлять собой блочный шифр;
работать со
128-разрядными блоками данных и ключами
трех размеров (128, 192 и 256 разрядов).
Дополнительно кандидатам рекомендовалось:
использовать операции, легко реализуемые как аппаратно (в микрочипах), так и программно (на персональных компьютерах и серверах);
ориентироваться на 32-разрядные процессоры;
не усложнять
без необходимости структуру
шифра для того, чтобы все заинтересованные
стороны были в состоянии самостоятельно
провести независимый криптоанализ алгоритма
и убедиться, что в нем не заложено каких-либо
недокументированных возможностей.
Кроме того, алгоритм,
претендующий на роль стандарта, должен
распространяться по всему миру на
неэксклюзивных условиях и без платы
за пользование патентом.
Перед первым туром
конкурса в NIST поступило 21 предложение,
15 из которых соответствовали выдвинутым
критериям. Затем были проведены исследования
этих решений, в том числе связанные с
дешифровкой и проверкой производительности,
и получены экспертные оценки специалистов
по криптографии. В августе 1999 года NIST
объявил пять финалистов, которые получили
право на участие во втором этапе обсуждений.
2 октября 2000 года NIST сообщил о своем выборе
– победителем конкурса стал алгоритм
RIJNDAEL (произносится как «райндол») бельгийских
криптографов Винсента Раймана и
Йоана Дамана, который зарегистрирован
в качестве официального федерального
стандарта как FIPS 197 (Federal Information Processing
Standard).
Для меня остается
загадкой, зачем в российском вузе
преподают стандарты
Определения и вспомогательные процедуры
Block - последовательность бит, из которых состоит input, output, State и Round Key. Также под Block можно понимать последовательность байт
Cipher Key - секретный, криптографический ключ, который используется Key Expansion процедурой, чтобы произвести набор ключей для раундов(Round Keys); может быть представлен как прямоугольный массив байтов, имеющий четыре строки и Nk колонок.
Ciphertext - выходные данные алгоритма шифрования
Key Expansion - процедура используемая для генерации Round Keys из Cipher Key
Round Key - Round Keys получаются из Cipher Key используя процедуру Key Expansion. Они применяются к State при шифровании и расшифровании
State - промежуточный результат шифрования, который может быть представлен как прямоугольный массив байтов имеющий 4 строки и Nb колонок
S-box - нелинейная таблица замен, использующаяся в нескольких трансформациях замены байт и в процедуре Key Expansion для взаимнооднозначной замены значения байта. Предварительно рассчитанный S-box - можно увидеть ниже.
Nb - число столбцов(32-ух битных слов), составляющих State.
Для, AES Nb = 4
Nk - число 32-ух битных слов, составляющих шифроключ.
Для AES, Nk = 4,6, или 8
Nr - число раундов, которое является функцией Nk и Nb. Для AES, Nr = 10, 12, 14
Rcon[] - массив, который состоит из битов 32-х разрядного слова и является постоянным для данного раунда. Предварительно рассчитанный Rcon[] можно увидеть ниже.
S-box
Sbox = array(
0x63,0x7c,0x77,0x7b,0xf2,0x6b,
0xca,0x82,0xc9,0x7d,0xfa,0x59,
0xb7,0xfd,0x93,0x26,0x36,0x3f,
0x04,0xc7,0x23,0xc3,0x18,0x96,
0x09,0x83,0x2c,0x1a,0x1b,0x6e,
0x53,0xd1,0x00,0xed,0x20,0xfc,
0xd0,0xef,0xaa,0xfb,0x43,0x4d,
0x51,0xa3,0x40,0x8f,0x92,0x9d,
0xcd,0x0c,0x13,0xec,0x5f,0x97,
0x60,0x81,0x4f,0xdc,0x22,0x2a,
0xe0,0x32,0x3a,0x0a,0x49,0x06,
0xe7,0xc8,0x37,0x6d,0x8d,0xd5,
0xba,0x78,0x25,0x2e,0x1c,0xa6,
0x70,0x3e,0xb5,0x66,0x48,0x03,
0xe1,0xf8,0x98,0x11,0x69,0xd9,
0x8c,0xa1,0x89,0x0d,0xbf,0xe6,
);
Rcon[]
Rcon = array(
array(0x00, 0x00, 0x00, 0x00),
array(0x01, 0x00, 0x00, 0x00),
array(0x02, 0x00, 0x00, 0x00),
array(0x04, 0x00, 0x00, 0x00),
array(0x08, 0x00, 0x00, 0x00),
array(0x10, 0x00, 0x00, 0x00),
array(0x20, 0x00, 0x00, 0x00),
array(0x40, 0x00, 0x00, 0x00),
array(0x80, 0x00, 0x00, 0x00),
array(0x1b, 0x00, 0x00, 0x00),
array(0x36, 0x00, 0x00, 0x00),
);
Вспомогательные процедуры
AddRoundKey() - трансформация при шифровании и обратном шифровании, при которой Round Key XOR’ится c State. Длина RoundKey равна размеру State(те, если Nb = 4, то длина RoundKey равна 128 бит или 16 байт)
InvMixColumns() - трансформация при расшифровании которая является обратной по отношению к MixColumns()
InvShiftRows() - трансформация при расшифровании которая является обратной по отношению к ShiftRows()
InvSubBytes() - трансформация при расшифровании которая является обратной по отношению к SubBytes()
MixColumns() - трансформация при шифровании которая берет все столбцы State и смешивает их данные (независимо друг от друга), чтобы получить новые столбцы
RotWord() - функция, использующаяся в процедуре Key Expansion, которая берет 4-х байтное слово и производит над ним циклическую перестановку
ShiftRows() - трансформации при шифровании, которые обрабатывают State, циклически смещая последние три строки State на разные величины
SubBytes() - трансформации при шифровании которые обрабатывают State используя нелинейную таблицу замещения байтов(S-box), применяя её независимо к каждому байту State
SubWord() - функция,
используемая в процедуре Key Expansion, которая
берет на входе четырёх-байтное слово
и применяя S-box к каждому из четырёх байтов
выдаёт выходное слово
Шифрование
AES является стандартом,
основанным на алгоритме
В начале шифрования input копируется в массив State по правилу s[r,c] = in[r + 4c], для и . После этого к State применяется процедура AddRoundKey() и затем State проходит через процедуру трансформации (раунд) 10, 12, или 14 раз (в зависимости от длины ключа), при этом надо учесть, что последний раунд несколько отличается от предыдущих. В итоге, после завершения последнего раунда трансформации, State копируется в output по правилу out[r + 4c] = s[r,c], для и .
Отдельные трансформации
SubBytes(), ShiftRows(), MixColumns(), и AddRoundKey() — обрабатывают
State. Массив w[] — содержит key schedule.
Cipher(byte in[4*Nb], byte out[4*Nb], word w[Nb*(Nr+1)])
begin
byte state[4,Nb]
state =
in
AddRoundKey(state,
w[0, Nb-1])
for round = 1 step 1 to Nr-1
SubBytes(state)
ShiftRows(state)
MixColumns(state)
AddRoundKey(state, w[round*Nb, (round+1)*Nb-1])
end for
SubBytes(state)
ShiftRows(state)
AddRoundKey(state,
w[Nr*Nb, (Nr+1)*Nb-1])
out = state
end
SubBytes()
В процедуре SubBytes, каждый байт в state заменяется соответствующим элементом в фиксированной 8-битной таблице поиска, S; bij = S(aij).
Процедура SubBytes() обрабатывает каждый байт состояния, независимо производя нелинейную замену байтов используя таблицу замен (S-box). Такая операция обеспечивает нелинейность алгоритма шифрования. Построение S-box состоит из двух шагов. Во-первых, производится взятие обратного числа в поле Галуа . Во-вторых, к каждому байту b из которых состоит S-box применяется следующая операция: