Опубликован: 19.11.2003 | Уровень: для всех | Доступ: свободно | ВУЗ: Московский государственный университет имени М.В.Ломоносова
Лекция 6:

Алгоритмы симметричного шифрования. Часть 3. Алгоритмы Rijndael и RC6

< Лекция 5 || Лекция 6: 123 || Лекция 7 >

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

Rijndael является блочным алгоритмом шифрования с переменной длиной блока и переменной длиной ключа. Длина блока и длина ключа могут быть независимо установлены в 128, 192 или 256 бит.

Состояние, ключ шифрования и число раундов

Различные преобразования выполняются над промежуточным результатом, называемым состоянием.

Состояние можно рассматривать как двумерный массив байтов. Этот массив имеет четыре строки и различное число столбцов, обозначаемое как Nb, равное длине блока, деленной на 32. Ключ также можно рассматривать как двумерный массив с четырьмя строками. Число столбцов ключа шифрования, обозначаемое как Nk, равно длине ключа, деленной на 32.

В некоторых случаях эти блоки также рассматриваются как одномерные массивы четырехбайтных векторов, где каждый вектор состоит из соответствующего столбца. Такие массивы имеют длину 4, 6 или 8 соответственно, и индексы в диапазонах 0 \dots 3, 0 \dots 5 или 0 \dots 7. Четырехбайтные вектора иногда мы будем называть словами.

Если необходимо указать четыре отдельных байта в четырехбайтном векторе, будет использоваться нотация (a, b, c, d), где a, b, c и d являются байтами в позициях 0, 1, 2 и 3, соответственно, в рассматриваемом столбце, векторе или слове.

Пример состояния (с Nb = 6) и ключа шифрования (с Nk = 4)

Рис. 6.1. Пример состояния (с Nb = 6) и ключа шифрования (с Nk = 4)

Входы и выходы Rijndael считаются одномерными массивами из 8 байтов, пронумерованными от 0 до 4* Nb - 1. Следовательно, эти блоки имеют длину 16, 24 или 32 байта, и массив индексируется в диапазонах 0 ... 15, 0 ... 23 или 0 ... 31. Ключ считается одномерным массивом 8-битных байтов, пронумерованных от 0 до 4* Nk - 1.

Входные байты алгоритма отображаются в байты состояния в следующем порядке: А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 = \lfloor n / 4 \rfloor\\
N = i + 4*j

Более того, индекс i является также номером байта в четырехбайтном векторе или слове, j является индексом вектора или слова во вложенном блоке.

Число раундов обозначается Nr и зависит от значений Nb и Nk, что показано в следующей таблице.

Таблица 6.1. Число раундов как функция от длины блока и длины ключа
Nr Nb = 4 Nb = 6 Nb = 8
Nk = 4 10 12 14
Nk = 6 12 12 14
Nk = 8 14 14 14
Преобразование раунда

Преобразование раунда состоит из четырех различных преобразований. В нотации на псевдо С это можно записать следующим образом:

Round (State, RoundKey)
{ 
   ByteSub (State);
   ShiftRow (State);
   MixColumn (State);
   AddRoundKey (State, RoundKey); 
}

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

FinalRound (State, RoundKey)
{
   ByteSub (State);
   ShiftRow (State);
   AddRoundKey (State, RoundKey);
}

Как мы видим, заключительный раунд эквивалентен остальным, за исключением того, что отсутствует слой MixColumn.

Преобразование ByteSub

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

  1. Во-первых, берется мультипликативная инверсия в GF (28) с определенным выше представлением. ' 00 ' отображается сам в себя.
  2. Затем применяется аффинное (в GF (2)) преобразование, определяемое следующим образом:

Применение описанного S-box ко всем байтам состояния обозначается как

ByteSub (State)

На рисунке 6.2 показан результат применения преобразования ByteSub к State.

Применение ByteSub для каждого байта в State

Рис. 6.2. Применение ByteSub для каждого байта в State

Инверсия ByteSub есть применение байтовой подстановки в соответствии с инверсной таблицей. Это получается инверсией аффинного отображения и мультипликативной инверсией в GF (28).

Преобразование ShiftRow

В ShiftRow строки состояния циклически сдвигаются на различные значения. Нулевая строка не сдвигается. Строка 1 сдвигается на С1 байтов, строка 2 на С2 байтов, строка 3 на С3 байтов. Величины С1, С2 и С3 зависят от Nb. Значения приведены в следующей таблице.

Таблица 6.2. Величина сдвига в зависимости от длины блока
Nb С1 С2 С3
4 1 2 3
6 1 2 3
8 1 3 4

Операция сдвига строк на указанные значения обозначается как

ShiftRow (State)

Инверсией для ShiftRow является циклический сдвиг трех нижних строк соответственно на Nb - С1, Nb - С2 и Nb - С3 байт, чтобы байт в позиции j в строке i перемещался в позицию (j + Nb - Ci) mod Nb.

Преобразование MixColumn

В MixColumn столбцы состояния рассматриваются как полиномы в GF (28) и умножаются по модулю х4 + 1 на фиксированный полином:

c(x) = '03' x3 + '01' x2 + '01' x + '02'

Данный полином является взаимнопростым с х4 + 1 и, следовательно, инвертируем. Как было описано выше, это может быть записано в виде умножения матрицы. Пусть b(x) = c(x) \otimes a(x)


Применение данной операции ко всем столбцам состояния обозначается как

MixColumn (State)

Инверсия MixColumn является аналогичным MixColumn. Каждый столбец преобразуется умножением его на полином d(x), определяемый следующим образом:

('03' x^3 + '01' x^2 + '01' x + '02') \otimes d(x) = '01'

В результате получаем

d(x) = '0B' x3 + '0D' x2 + '09' x + '0E'

Сложение с ключом раунда

Выполняется операция побитового XOR ключа раунда с текущим состоянием. Длина ключа раунда равна длине блока Nb. Данное преобразование обозначается как

AddRoundKey (State, RoundKey)

AddRoundKey является инверсией самого себя.

Создание ключей раунда

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

  • Общее число битов ключа раунда равно длине блока, умноженной на количество раундов плюс 1. Например, для длины блока 128 бит и 10 раундов необходимо 1408 битов ключа раунда.
  • Ключ шифрования расширяется в ExpandedKey.
  • Ключи раунда получаются из этого ExpandedKey следующим способом: первый ключ раунда состоит из первых Nb слов, второй состоит из следующих Nb слов и т.д.

Расширение ключа

Expanded Key является линейным массивом четырехбайтных слов и обозначается как W [Nb * (Nr + 1)]. Первые Nk слов состоят из ключа шифрования. Остальные слова определяются рекурсивно. Функция расширения ключа зависит от значения Nk: существует версия функции для Nk, равным или меньшим 6, и версия для Nk больше 6.

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

KeyExpansion (byte Key [4*Nk] 
              word W[Nb * (Nr + 1)])
{
  for (i = 0; i < Nk; i++)
    W[i] =(Key [4*i], Key [4*i+1], 
           Key [4*i+2], Key [4*i+3]);
  for (i = Nk; i < Nb * (Nr + 1); i++) {
    temp = W [i - 1];
    if (i % Nk == 0)
      temp = SubByte (RotByte (temp)) ^ 
             Rcon [i / Nk];
    W [i] = W [i- Nk] ^ temp; 
  }
}

В данном случае SubByte (W) является функцией, которая возвращает четырехбайтное слово, в котором каждый байт является результатом применения S-box Rijndael к байту в соответствующей позиции во входном слове. Функция RotByte (W) возвращает слово, в котором байты циклически переставлены таким образом, что для входного слова (a, b, c, d) создается выходное слово (b, c, d, a).

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

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

KeyExpansion (byte Key [4*Nk] 
              word W [Nb* (Nr+1)])
{
  for (i=0; i < Nk; i++)
    W[i]= (key [4*i], key [4*i+1], 
	       key [4*i+2], key [4*i+3]);
  for (i = Nk; i < Nb * (Nr + 1); i++) {
    temp = W [i-1];
    if (i % Nk == 0)
      temp = SubByte (RotByte (temp)) ^ 
             Rcon [i / Nk];
    else if (i % Nk == 4)
      temp = SubByte (temp);
    W[i] = W[i - Nk] ^ temp;
  }
}

Отличие в схеме для Nk <= 6 состоит в том, что для i-4 кратных Nk, SubByte применяется для W[i-1] перед XOR.

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

Rcon [i] = (RC [i], '00', '00', '00')

RC [i] являются элементами в GF (28) со значением x(i-1) таким, что:

RC [1] = 1 (т.е. '01')\\
RC [i] = x (т.е. '02') \bullet (RC [i-1]) = x(i-1)

Выбор ключа раунда

Ключ раунда i получается из слов буфера ключа раунда W [Nb * i] до W [Nb * (i+1)].

Алгоритм шифрования

Алгоритм шифрования Rijndael состоит из

  • начального сложения с ключом;
  • Nr - 1 раундов ;
  • заключительного раунда.

В С-подобном представлении это выглядит так:

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 может быть специфицирован в терминах расширенного ключа.

Rijndael (State, ExpandedKey)
{
   AddRoundKey (State, ExpandedKey);
   for (i=1; i < Nr; i++)
      Round (State, ExpandedKey + Nb*i);
   FinalRound (State, ExpandedKey + Nb*Nr)
}

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

Преимущества алгоритма

Преимущества, относящиеся к аспектам реализации:

  • Rijndael может выполняться быстрее, чем обычный блочный алгоритм шифрования. Выполнена оптимизация между размером таблицы и скоростью выполнения.
  • Rijndael можно реализовать в смарт-карте в виде кода, используя небольшой RAM и имея небольшое число циклов. Выполнена оптимизация размера ROM и скорости выполнения.
  • Преобразование раунда допускает параллельное выполнение, что является важным преимуществом для будущих процессоров и специализированной аппаратуры.
  • Алгоритм шифрования не использует арифметические операции, поэтому тип архитектуры процессора не имеет значения.

Простота разработки:

  • Алгоритм шифрования полностью "самоподдерживаемый". Он не использует других криптографических компонентов, S-box 'ов, взятых из хорошо известных алгоритмов, битов, полученных из специальных таблиц, чисел типа p и тому подобных уловок.
  • Алгоритм не основывает свою безопасность или часть ее на неясностях или плохо понимаемых итерациях арифметических операций.
  • Компактная разработка алгоритма не дает возможности спрятать люки.

Переменная длина блока:

  • Длины блоков от 192 до 256 бит позволяют создавать хэш-функции без коллизий, использующие Rijndael в качестве функции сжатия. Длина блока 128 бит сегодня считается для этой цели недостаточной.

Расширения:

  • Разработка позволяет специфицировать варианты длины блока и длины ключа в диапазоне от 128 до 256 бит с шагом в 32 бита.
  • Хотя число раундов Rijndael зафиксировано в данной спецификации, в случае возникновения проблем с безопасностью он может модифицироваться и иметь число раундов в качестве параметра.

Расширения

Различная длина блока и ключа шифрования

Обработка ключа поддерживает длину ключа, которая была бы кратна 4 байтам. Единственным параметром, который необходим для определения другой длины ключа, отличной от 128, 192 или 256 бит, является число раундов алгоритма.

Структура алгоритма допускает произвольную длину блока, кратную 4 байтам, с минимумом в 16 байтов. Добавление ключа и ByteSub и MixColumn преобразования не зависят от длины блока. Единственным преобразованием, которое зависит от длины блока, является ShiftRow. Для каждой длины блока должен быть определен специальный массив С1, С2, С3.

Можно определить расширение Rijndael, которое также поддерживает длины блока и ключа между 128 и 256 битами с приращением в 32 бита. Число раундов определяется так:

Nr = max (Nk, Nb) + 6

Это расширяет правило для количества раундов для альтернативных длин блока и ключа.

Дополнительные значения С1, С2 и С3 определены в следующей таблице.

Таблица 6.3. Величина сдвига в зависимости от длины блока
Nb С1 С2 С3
5 1 2 3
7 1 2 4

Другие возможности

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

МАС

Rijndael может применяться в качестве алгоритма МАС. Для этого следует использовать блочный алгоритм в режиме СВС-МАС.

Хэш-функция

Rijndael может использоваться в качестве итерационной хэш-функции. При этом Rijndael применяется в качестве функции раунда. Существует одна возможная реализация. Рекомендуется использовать длину блока и ключа, равной 256 битам. Блок сообщения подается на вход в качестве ключа шифрования. Другим входом является переменная, выход алгоритма XORed с данной переменной, и полученное значение является новым значением этой переменной.

Генератор псевдослучайных чисел

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

Существует три операции:

Reset:

  • Ключ алгоритма шифрования и состояние устанавливаются в ноль.

Seeding (и reseeding):

  • "Seed биты" выбираются таким образом, чтобы обеспечивать минимальную энтропию. Они дополняются нулями до тех пор, пока результирующая строка не будет иметь длину, кратную 256 битам.
  • Вычисляется новый ключ шифрования шифрованием с помощью Rijndael блока битов seed, используя текущий ключ шифрования. Это выполняется рекурсивно до тех пор, пока все блоки seed не будут обработаны.
  • Состояние изменяется путем применения Rijndael с новым ключом шифрования.

Генератор псевдослучайного числа:

  • Состояние изменяется путем применения Rijndael с новым ключом шифрования. Первые 128 бит состояния рассматриваются как псевдослучайное число. Данный шаг может быть повторен много раз.
< Лекция 5 || Лекция 6: 123 || Лекция 7 >
Евгений Виноградов
Евгений Виноградов

Прошел экстерном экзамен по курсу перепордготовки "Информационная безопасность". Хочу получить диплом, но не вижу где оплатить? Ну и соответственно , как с получением бумажного документа?

Илья Сидоркин
Илья Сидоркин

Добрый день! Подскажите пожалуйста как и когда получить диплом, после сдичи и оплаты?????