Преобразование замешивания столбцов (MixColumn)



       Преобразование представляет собой умножение состояния на матрицу ME при шифровании или матрицу MD при дешифровании:

ME State

MD State

2 3 1 1

 

b1 b5 b9 b13
1 2 3 1 b2 b6 b10 b14
1 1 2 3 b3 b7 b11 b15
3 1 1 2 b4 b8 b12 b16

b1 = (b1 * 2) XOR (b2*3) XOR (b3*1) XOR (b4*1)

 

Умножение двух байт происходит по следующему алгоритму:

1 если один из байт равен 0, результатом будет 0

2 если один из байт равен 1, результатом будет другой байт

3 в остальных случаях происходит замена каждого байта по таблице L, заменённые байты складываются, при необходимости вычитается 255 для попадания в интервал [0, 255] и происходит замена по таблице E, что и даёт результат.

 

L = {

, 0x00, 0x19, 0x01, 0x32, 0x02, 0x1A, 0xC6, 0x4B, 0xC7, 0x1B, 0x68, 0x33, 0xEE, 0xDF, 0x03,

0x64, 0x04, 0xE0, 0x0E, 0x34, 0x8D, 0x81, 0xEF, 0x4C, 0x71, 0x08, 0xC8, 0xF8, 0x69, 0x1C, 0xC1,

0x7D, 0xC2, 0x1D, 0xB5, 0xF9, 0xB9, 0x27, 0x6A, 0x4D, 0xE4, 0xA6, 0x72, 0x9A, 0xC9, 0x09, 0x78,

0x65, 0x2F, 0x8A, 0x05, 0x21, 0x0F, 0xE1, 0x24, 0x12, 0xF0, 0x82, 0x45, 0x35, 0x93, 0xDA, 0x8E,

0x96, 0x8F, 0xDB, 0xBD, 0x36, 0xD0, 0xCE, 0x94, 0x13, 0x5C, 0xD2, 0xF1, 0x40, 0x46, 0x83, 0x38,

0x66, 0xDD, 0xFD, 0x30, 0xBF, 0x06, 0x8B, 0x62, 0xB3, 0x25, 0xE2, 0x98, 0x22, 0x88, 0x91, 0x10,

0x7E, 0x6E, 0x48, 0xC3, 0xA3, 0xB6, 0x1E, 0x42, 0x3A, 0x6B, 0x28, 0x54, 0xFA, 0x85, 0x3D, 0xBA,

0x2B, 0x79, 0x0A, 0x15, 0x9B, 0x9F, 0x5E, 0xCA, 0x4E, 0xD4, 0xAC, 0xE5, 0xF3, 0x73, 0xA7, 0x57,

0xAF, 0x58, 0xA8, 0x50, 0xF4, 0xEA, 0xD6, 0x74, 0x4F, 0xAE, 0xE9, 0xD5, 0xE7, 0xE6, 0xAD, 0xE8,

0x2C, 0xD7, 0x75, 0x7A, 0xEB, 0x16, 0x0B, 0xF5, 0x59, 0xCB, 0x5F, 0xB0, 0x9C, 0xA9, 0x51, 0xA0,

0x7F, 0x0C, 0xF6, 0x6F, 0x17, 0xC4, 0x49, 0xEC, 0xD8, 0x43, 0x1F, 0x2D, 0xA4, 0x76, 0x7B, 0xB7,

0xCC, 0xBB, 0x3E, 0x5A, 0xFB, 0x60, 0xB1, 0x86, 0x3B, 0x52, 0xA1, 0x6C, 0xAA, 0x55, 0x29, 0x9D,

0x97, 0xB2, 0x87, 0x90, 0x61, 0xBE, 0xDC, 0xFC, 0xBC, 0x95, 0xCF, 0xCD, 0x37, 0x3F, 0x5B, 0xD1,

0x53, 0x39, 0x84, 0x3C, 0x41, 0xA2, 0x6D, 0x47, 0x14, 0x2A, 0x9E, 0x5D, 0x56, 0xF2, 0xD3, 0xAB,

0x44, 0x11, 0x92, 0xD9, 0x23, 0x20, 0x2E, 0x89, 0xB4, 0x7C, 0xB8, 0x26, 0x77, 0x99, 0xE3, 0xA5,

0x67, 0x4A, 0xED, 0xDE, 0xC5, 0x31, 0xFE, 0x18, 0x0D, 0x63, 0x8C, 0x80, 0xC0, 0xF7, 0x70, 0x07

};

 

E = {

0x01, 0x03, 0x05, 0x0F, 0x11, 0x33, 0x55, 0xFF, 0x1A, 0x2E, 0x72, 0x96, 0xA1, 0xF8, 0x13, 0x35,

0x5F, 0xE1, 0x38, 0x48, 0xD8, 0x73, 0x95, 0xA4, 0xF7, 0x02, 0x06, 0x0A, 0x1E, 0x22, 0x66, 0xAA,

0xE5, 0x34, 0x5C, 0xE4, 0x37, 0x59, 0xEB, 0x26, 0x6A, 0xBE, 0xD9, 0x70, 0x90, 0xAB, 0xE6, 0x31,

0x53, 0xF5, 0x04, 0x0C, 0x14, 0x3C, 0x44, 0xCC, 0x4F, 0xD1, 0x68, 0xB8, 0xD3, 0x6E, 0xB2, 0xCD,

0x4C, 0xD4, 0x67, 0xA9, 0xE0, 0x3B, 0x4D, 0xD7, 0x62, 0xA6, 0xF1, 0x08, 0x18, 0x28, 0x78, 0x88,

0x83, 0x9E, 0xB9, 0xD0, 0x6B, 0xBD, 0xDC, 0x7F, 0x81, 0x98, 0xB3, 0xCE, 0x49, 0xDB, 0x76, 0x9A,

0xB5, 0xC4, 0x57, 0xF9, 0x10, 0x30, 0x50, 0xF0, 0x0B, 0x1D, 0x27, 0x69, 0xBB, 0xD6, 0x61, 0xA3,

0xFE, 0x19, 0x2B, 0x7D, 0x87, 0x92, 0xAD, 0xEC, 0x2F, 0x71, 0x93, 0xAE, 0xE9, 0x20, 0x60, 0xA0,

0xFB, 0x16, 0x3A, 0x4E, 0xD2, 0x6D, 0xB7, 0xC2, 0x5D, 0xE7, 0x32, 0x56, 0xFA, 0x15, 0x3F, 0x41,

0xC3, 0x5E, 0xE2, 0x3D, 0x47, 0xC9, 0x40, 0xC0, 0x5B, 0xED, 0x2C, 0x74, 0x9C, 0xBF, 0xDA, 0x75,

0x9F, 0xBA, 0xD5, 0x64, 0xAC, 0xEF, 0x2A, 0x7E, 0x82, 0x9D, 0xBC, 0xDF, 0x7A, 0x8E, 0x89, 0x80,

0x9B, 0xB6, 0xC1, 0x58, 0xE8, 0x23, 0x65, 0xAF, 0xEA, 0x25, 0x6F, 0xB1, 0xC8, 0x43, 0xC5, 0x54,

0xFC, 0x1F, 0x21, 0x63, 0xA5, 0xF4, 0x07, 0x09, 0x1B, 0x2D, 0x77, 0x99, 0xB0, 0xCB, 0x46, 0xCA,

0x45, 0xCF, 0x4A, 0xDE, 0x79, 0x8B, 0x86, 0x91, 0xA8, 0xE3, 0x3E, 0x42, 0xC6, 0x51, 0xF3, 0x0E,

0x12, 0x36, 0x5A, 0xEE, 0x29, 0x7B, 0x8D, 0x8C, 0x8F, 0x8A, 0x85, 0x94, 0xA7, 0xF2, 0x0D, 0x17,

0x39, 0x4B, 0xDD, 0x7C, 0x84, 0x97, 0xA2, 0xFD, 0x1C, 0x24, 0x6C, 0xB4, 0xC7, 0x52, 0xF6, 0x01

};

 

Добавление циклового ключа

       В данной операции цикловой ключ добавляется к состоянию посредством простого EXOR. Цикловой ключ вырабатывается из ключа шифрования посредством алгоритма выработки ключей (key schedule). Длина циклового ключа равна длине блока Nb.

Рисунок 5: При добавлении ключа цикловой ключ складывается посредством EXOR с состоянием.

 

При шифровании части расширенного ключа выбираются от начала к концу, при дешифровании – от конца к началу.

 

Расширение ключа (Key Expansion)

       Расширенный ключ представляет собой линейный массив 4-ех байтовых слов и обозначен как W[Nb*(Nr+1)]. Первые Nk слов содержат ключ шифрования. Все остальные слова определяются рекурсивно из слов с меньшими индексами. Алгоритм выработки ключей зависит от величины Nk: ниже приведена версия для Nk равного или меньшего 6 и версия для Nk большего 6.

 

Для Nk<6 или Nk=6 мы имеем:

 

KeyExpansion(CipherKey,W)

{

       for (i = 0; i < Nk; i++) W[i] = CipherKey[i];

                   for (j = Nk; j < Nb*(Nk+1); j+=Nk)

                   {

                               W[j] = W[j-Nk] ^ SubByte( Rotl( W[j-1] ) ) ^ Rcon[j/Nk];

                               for (i = 1; i < Nk && i+j < Nb*(Nr+1); i++)

                               W[i+j] = W[i+j-Nk] ^ W[i+j-1];

                   }

}

 

       Как можно заметить, первые Nk слов заполняются ключом шифрования. Каждое последующее слово W[i] получается посредством EXOR предыдущего слова W[i-1] и слова на Nk позиций ранее W[i-Nk]. Для слов, позиция которых кратна Nk, перед EXOR применяется преобразование к W[i-1], а затем еще прибавляется цикловая константа. Преобразование содержит циклический сдвиг байтов в слове, обозначенный как Rotl, затем следует SubByte - применение замены байт.

 

Для Nk>6 мы имеем:

 

KeyExpansion(CipherKey,W)

{

       for (i=0; i<Nk; i++) W[i]=CipherKey[i];

                   for (j=Nk; j<Nb*(Nk+1); j+=Nk)

                   {

                               W[j] = W[j-Nk] ^ SubByte(Rotl(W[j-1])) ^ Rcon[j/Nk];

                               for (i=1; i<4; i++) W[i+j] = W[i+j-Nk] ^ W[i+j-1];

                               W[j+4] = W[j+4-Nk] ^ SubByte(W[j+3]);

                               for (i=5; i<Nk; i++) W[i+j] = W[i+j-Nk] ^ W[i+j-1];

                   }

}

       Отличие для схемы при Nk>6 состоит в применении SubByte для каждого 4-го байта из Nk.

 

Цикловая константа независит от Nk и определяется следующим образом:

Rcon[i] = ( RC[i], '00' , '00' , '00' ), где

RC[0]='01'

RC[i]=xtime(Rcon[i-1])

 

Шифр

Шифр Rijndael состоит из:

1 Начального добавления циклового ключа;

2 Nr-1 циклов;

3 Заключительного цикла.

 

На псевдо-Си это выглядит следующим образом:

 

Rijndael (State, CipherKey)

{

       KeyExpansion(CipherKey, ExpandedKey); // Расширение ключа

       AddRoundKey(State, ExpandedKey); // Добавление циклового ключа

       For ( i=1 ; i<Nr ; i++) Round(State,ExpandedKey+Nb*i); // циклы

       FinalRound(State, ExpandedKey+Nb*Nr); // заключительный цикл

}

 

       Если предварительно выполнена процедура расширения ключа, то процедура будет выглядеть следующим образом:

 

Rijndael (State, CipherKey)

{

       AddRoundKey(State, ExpandedKey);

       For ( i=1 ; i<Nr ; i++) Round(State,ExpandedKey+Nb*i);

       FinalRound(State, ExpandedKey+Nb*Nr);

}

 

 


2. Описание демонстрационной программы

 

       Программа выполнена на языке C# и состоит из двух элементов – файла Rijndael.dll, содержащего реализацию алгоритма шифрования, и демонстрационного приложения RijndaelDemo.exe. Для работы приложения необходима ОС Windows с установленным .NET Framework v1.1.

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

Основное окно программы

 

Окно демонстрации расширенного ключа

 

 

       Также есть возможность подробно рассмотреть действие всех цикловых преобразований (ByteSub, ShiftRow, MixColumn, AddRoundKey) как при шифровании, так и при дешифровании.

 

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

 

 


 

 

Порядок выполнения работы

Цель лабораторной работы

Ознакомление с принципами шифрования, используемыми в алгоритме симметричного шифрования AES RIJNDAEL .

 

        

Порядок выполнение работы

 

1. На диске D : создать дерево директорий следующего вида:

 

     
 

D:\            Криптография и стеганография_# группы

 

                   Фамилия студента

ЛР # 3_ AES RIJNDAEL. doc

 

2. Ознакомиться со сведениями о программе RijndaelDemo , изложенными в разделе 2. Запустить программу RijndaelDemo .

3. Изучить на примере обычных текстовых файлов способы шифрования и дешифрования с помощью алгоритма Rijndael. Подробно рассмотреть действие всех цикловых преобразований (ByteSub, ShiftRow, MixColumn, AddRoundKey), как при шифровании, так и дешифровании.

Исходный текст для шифрования может быть подготовлен заранее и сохранен в файле *. txt.

4. Сохранить в отчете экранные формы, демонстрирующие процесс шифрования и дешифрования информации.

 

5. Включить в отчет о лабораторной работе ответы на контрольные вопросы, выбранные в соответствии с номером варианта из приложения 1.

 

Примечание. Для ответов на контрольные вопросы можно воспользоваться п.1 описания лабораторной работы  и сведениями из прилагаемой статьи gost _ aes .

 

6. Добавить к отчету о выполнении лабораторной работы титульный лист, содержащий:

· название университета,

· факультета (Информационных технологий),

· кафедры (Информационной безопасности),

· учебной дисциплины,

· номер и название лабораторной работы,

· фамилию и инициалы студента,

· город и год выполнения лабораторной работы.

Пронумеровать страницы отчета.

7. Сохранить отчет о выполнении лабораторной работы в папке, созданной при выполнении п. 1.

8. Завершить работу с ОС Windows.

 

 

                                                                                                             

 

                                                                                                             

Приложение 1

 

Номер варианта Контрольные вопросы
1 2
  1,5,7,26   Сравните основные характеристики алгоритмов Rijndael и ГОСТ 28147-89.
2,4,6 Сравните основные характеристики алгоритмов Rijndael и DES.
11,13 Опишите структуру сети Фейстеля.
12,14,16   Приведите обобщенные схемы шифрования данных с помощью алгоритма Rijndael и ГОСТ 28147-89. Дайте их сравнительный анализ.
3,9,18,29 Сравните один раунд шифрования данных с помощью алгоритма Rijndael и ГОСТ 28147-89.
20,22,24   Сравните эквивалентность прямого и обратного преобразований в алгоритмах Rijndael и ГОСТ 28147-89.
10,17,19 Сравните выработку ключевой информации в алгоритмах Rijndael и ГОСТ 28147-89.
21,23,25 Сравните алгоримы Rijndael и ГОСТ 28147-89 по показателям диффузии.  
8, 28,27 Сравните алгоримы Rijndael и ГОСТ 28147-89 по показателям стойкости.  
12,15,30 Сравните алгоримы Rijndael и ГОСТ 28147-89 по показателям производительности и удобству реализации.

 


Дата добавления: 2019-07-15; просмотров: 908; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!