
Кодирование и шифрование информации в радиоэлектронных системах передачи информации
..pdf
541
in0 |
in4 |
in8 |
in12 |
|
s00 |
s01 |
s02 |
s03 |
|
out0 |
out4 |
out8 |
out12 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
in1 |
in5 |
in9 |
in13 |
|
s10 |
s11 |
s12 |
s13 |
|
out1 |
out5 |
out9 |
out13 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
in2 |
in6 |
in10 |
in14 |
|
s20 |
s21 |
s22 |
s23 |
|
out2 |
out6 |
out10 |
out14 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
in3 |
in7 |
in11 |
in15 |
|
s30 |
s31 |
s32 |
s33 |
|
out3 |
out7 |
out11 |
out15 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Входной блок |
Промежуточное состояние |
Выходной блок |
Рис. 7.34. Входной и выходной блоки данных, промежуточное состояние Ключ шифрования также представляется в виде прямоугольного массива с четырьмя
строками (рисунок 2). Число столбцов Nk этого массива равно длине ключа в битах, деленной на 32. В стандарте определены ключи всех трех размеров – 128 бит, 192 бита и 256 бит, то есть соответственно 4, 6 и 8 32-разрядных слова (или столбца – в табличной форме представления). В некоторых случаях ключ шифрования рассматривается как линейный массив 4-байтовых слов. Слова состоят из 4 байтов, которые находятся в одном столбце (при представлении в виде прямоугольного массива).
k00 |
k01 |
k02 |
k03 |
|
|
|
|
k10 |
k11 |
k12 |
k13 |
|
|
|
|
k20 |
k21 |
k22 |
k23 |
|
|
|
|
k30 |
k31 |
k32 |
k33 |
|
|
|
|
Рис. 7.35. Формат представления ключа шифрования
Для алгоритма AES длина входного и выходного блоков, а также блока состояния – 128
битов, т.е. Nb = 4. Длина ключа шифрования равна 128, 192 или 256 битов, т.е. Nk = 4, 6 или 8.
Количество раундов, которые будут выполнены в течение выполнения алгоритма, зависит от размера ключа. Число раундов обозначается Nr, где Nr = 10 при Nk = 4, Nr = 12 при Nk = 6 и Nr
=14 при Nk = 8.
Идля шифрования, и для расшифрования, алгоритм AES использует раундовую функцию, которая составлена из четырех различных преобразований над байтами: 1) замена байта, используя таблицу замены (S-блок), 2) сдвиг строк массива состояния на различные смещениями, 3) смешивание данных в пределах каждого столбца массива состояния, и 4)
добавление раундового ключа к состоянию. Эти преобразования (и их инверсии) описаны
ниже.

542
Функция зашифрования
Перед зашифрованием входные данные копируются в массив состояния. После начального добавления раундового ключа, массив состояния преобразуется с помощью раундовой функции 10, 12 или 14 раз (в зависимости от длины ключа). Заключительный раунд немного отличается от первых Nr – 1 раундов. Затем полученное состояние копируется в выходной массив.
Раундовая функция состоит из 4 различных преобразований: SubBytes, ShiftRows,
MixColumns и AddRoundKey. Все Nr раундов идентичны за исключением последнего,
который не включает преобразование MixColumns (рисунок 7.36).
Входной блок
AddRoundKey round = 1 .. 9
SubBytes
ShiftRows
MixColumns
AddRoundKey
SubBytes
ShiftRows
AddRoundKey
Выходной блок
Рис. 7.36. Схема функции зашифрования (Nb = 4, Nk = 4)
Преобразование SubBytes – нелинейная замена байта, которая работает независимо на каждом байте состояния, используя таблицу замены (S-блок). Эта таблица замен создается с использованием двух преобразований:
1. получение обратного элемента относительно умножения в поле
GF(28), нулевой элемент переходит сам в себя;
2. применение преобразования над GF(2), определенного сле-
дующим образом:
b'i = bi b(i+4)mod8 b(i+5)mod8 b(i+6)mod8 b(i+7)mod8 ci,
где c0 = c1 = c5 = c6 = 1, c2 = c3 = c4 = c7 = 0, bi и b'i – соответственно исходное и преобразованное значение i-го бита, i = 0, …, 7.
В преобразовании ShiftRows байты в последних трех строках состояния циклически сдвигаются влево на различное число байт. Первая строка (r = 0) не сдвигается. Вторая
543
строка (r = 1) сдвигается на 1 байт, третья строка (r = 2) – на 2 байта, четвертая строка (r = 3)
– на 3 байта.
Преобразование MixColumns работает с состоянием столбец за столбцом, обрабатывая каждый столбец как 4-элементный полином. Столбцы рассматриваются как полиномы над
GF(28) и умножаются по модулю x4 + 1 на фиксированный полином a(x), приведенный ниже a(x) = {03}x3 + {01}x2 + {01}x + {02}.
Это может быть представлено в матричном виде:
|
0c |
|
|
|
|
|
0c |
||
|
s |
|
|
02 03 |
01 |
01 |
s |
|
|
s |
|
|
01 02 |
03 |
01 s |
|
|||
|
1c |
|
|
|
|
|
|
1c |
, 0 c 3. |
s |
|
01 01 |
02 |
03 s |
2c |
|
|||
|
2c |
|
03 01 |
|
02 s |
|
|||
s |
|
01 |
3c |
|
|||||
|
3c |
|
|
|
|
|
|
|
Врезультате этого умножения байты столбца заменяются следующими: s'0c = ({02} • s0c) ({03} • s1c) s2c s3c,
s'1c = s0c ({02} • s1c) ({03} • s2c) s3c, s'2c = s0c s1c ({02} • s2c) ({03} • s3c), s'3c = ({03} • s0c) s1c s2c ({02} • s3c).
Впреобразовании AddRoundKey раундовый ключ добавляется к состоянию простой
поразрядной операцией XOR. Каждый раундовый ключ состоит из Nb 4-байтовых слов развернутого ключа. Сложение раундового ключа и состояния производится следующим образом:
[s'0c, s'1c, s'2c, s'3c] = [s0c, s1c, s2c, s3c] [wround Nb+c], 0 ≤ с < Nb,
где [wi] – слова развернутого ключа, описанного ниже, round – номер раунда, 0 ≤ round ≤ Nr. При зашифровании, перед первым применением раундовой функции, происходит начальное добавление раундового ключа (round = 0). Применение преобразования
AddRoundKey в Nr раундах зашифрования происходит при 1 ≤ round ≤ Nr.
Расширение ключа
В алгоритме AES для получения раундовых ключей используется алгоритм расширения ключа. Расширенный ключ представляет собой линейный массив w[i] из Nb(Nr + 1) 4-
байтовых слов, i = 0, …, Nb(Nr + 1). Алгоритм выработки ключей зависит от величины Nk.
Первые Nk слов расширенного ключа заполняются ключом шифрования. Каждое последующее слово w[i] получается посредством XOR предыдущего слова w[i–1] и слова на Nk позиций ранее w[i – Nk]
w[i] = w[i – 1] w[i – Nk].
544
Для слов, позиция которых кратна Nk, перед применением операции XOR слово w[i–l]
подвергается воздействию двух дополнительных функций: RotWord, осуществляющей побайтовый сдвиг 32-разрядного слова по формуле {a0 a1 a2 a3} {a1 a2 a3 a0}, и SubWord,
осуществляющей побайтовую замену с использованием S-блока функции SubBytes. Затем к полученному значению прибавляется раундовая константа Rcon[j] = 2j–1. В итоге значение w[i] равно
w[i] = SubWord(RotWord(w[i – 1])) Rcon[i/Nk] w[i – Nk].
i-ый раундовый ключ получается из слов массива раундового ключа от w[Nbi] и до w[Nb(i+1)].
Функция расшифрования
Если преобразования, используемые в функции зашифрования, инвертировать и затем применить в обратном порядке, то можно произвести обратное расшифрование. При расшифровании используются следующие преобразования: InvShiftRows, InvSubBytes,
InvMixColumns и AddRoundKey (рисунок 4а).
InvShiftRows – инверсия преобразования ShiftRows. Байты в последних трех строках состояния циклически сдвигаются вправо на различное число байт. Первая строка (r = 0) не сдвигается. Вторая строка (r = 1) сдвигается на 1 байт, третья строка (r = 2) – на 2 байта,
четвертая строка (r = 3) – на 3 байта.
InvSubBytes – инверсия преобразования замены байта, в котором к каждому байту состояния применяется обратный S-блок.
InvMixColumns – инверсия преобразования MixColumns. InvMixColumns оперирует состоянием столбец за столбцом, обрабатывая каждый столбец как 4-элементный полином,
как описано в ранее. Столбцы рассматривают как полиномы над GF(28) и умножаются по модулю x4 + 1 на фиксированный полином a–1(x)
a–1(x) = {0b}x3 + {0d}x2 + {09}x + {0e}.
Это может быть представлено в матричном виде:
|
0c |
|
|
|
|
|
0c |
||
|
s |
|
|
0e 0b |
0d 09 |
|
s |
|
|
s |
|
|
09 0e |
0b 0d |
s |
|
|||
|
1c |
|
|
|
|
|
|
1c |
, 0 c 3. |
s |
|
0d 09 |
0e 0b |
s |
2c |
|
|||
|
2c |
|
|
|
|
s |
|
||
s |
|
|
0b 0d |
09 0e |
3c |
|
|||
|
3c |
|
|
|
|
|
|
|
В результате на выходе получаются следующие байты: s'0c = ({0e} • s0c) ({0b} • s1c) ({0d} • s2c) ({09} • s3c), s'1c = ({09} • s0c) ({0e} • s1c) ({0b} • s2c) ({0d} • s3c), s'2c = ({0d} • s0c) ({09} • s1c) ({0e} • s2c) ({0b} • s3c),

545
s'3c = ({0b} • s0c) ({0d} • s1c) ({09} • s2c) ({0e} • s3c).
Преобразование AddRoundKey является собственной инверсией, т.к. использует только операцию XOR.
В функции обратного расшифрования (рисунок 4а) последовательность преобразований отличается от последовательности преобразований при зашифровании, в то время как форма расширенных ключей для зашифрования и расшифрования остается той же самом. Однако,
несколько свойств алгоритма AES позволяют функции расшифрования иметь ту же самую последовательность преобразований как и при зашифровании (с преобразованиями,
замененными их инверсиями) (рисунок 2.37б). Это достигается при внесении изменений в расширенный ключ.
|
|
Входной блок |
|
|
Входной блок |
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
AddRoundKey |
|
|
AddRoundKey |
||||
|
|
|
|
|
|
|
|
|
|
round = 1 .. 9 |
|
|
round = 1 .. 9 |
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
InvShiftRows |
|
|
InvSubBytes |
||||
|
|
|
|
|
|
|
|
|
|
|
|
InvSubBytes |
|
|
InvShiftRows |
||||
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
AddRoundKey |
|
|
InvMixColumns |
||||
|
|
|
|
|
|
|
|
|
|
|
|
InvMixColumns |
|
|
AddRoundKey |
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
InvShiftRows |
|
|
InvSubBytes |
||||
|
|
|
|
|
|
|
|
||
|
|
InvSubBytes |
|
|
InvShiftRows |
||||
|
|
|
|
||||||
|
|
|
|
|
|
|
|
||
|
|
AddRoundKey |
|
|
AddRoundKey |
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Выходной блок |
|
|
Выходной блок |
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
а) |
|
|
|
б) |
Рис. 7.37. Схемы функций обратного (а) и прямого (б) расшифрования
Существует два свойства, которые делают возможным использование функции прямого расшифрования:
1.Преобразования SubBytes и ShiftRows можно переставлять местами, т.е. можно сначала применить преобразование SubBytes, а затем ShiftRows, и наоборот – сначала ShiftRows, а
затем SubBytes. То же самое верно и для их инверсий InvSubBytes и InvShiftRows.
2.Операции смешивания столбцов MixColumns и InvMixColumns являются линейными относительно входных данных, т.е.
InvMixColumns(State XOR Round Key) =
= InvMixColumns(State) XOR InvMixColumns(Round Key).
Эти свойства позволяют изменить порядок преобразований InvSubBytes и InvShiftRows.
Порядок преобразований AddRoundKey и InvMixColumns также может быть полностью
546
изменен, при условии, что предварительно, используя преобразование InvMixColumns, будут изменены столбцы (слова) развернутого ключа расшифрования.
Режим обратной связи по шифртексту (CFB)
В режиме обратной связи по шифртексту (CFB) выходные блоки зашифрованного текста за счет обратной связи становятся входными блоками для последующего шифрования.
Чтобы получить зашифрованный текст, открытый текст складывается, с помощью операции
XOR, со сгенерированными выходными блоками. В качестве начального входного блока в режиме CFB используется значение вектора инициализации IV. Значение IV может быть открытым, но при этом должно быть непредсказуемым.
В режиме CFB используется целочисленный параметр s, 1 ≤ s ≤ b, где b – размер блока (в
байтах) открытого и зашифрованного текстов. Значение s иногда включается в название режима, например, 1-битовый режим CFB, 8-битовый режим CFB, 64-битовый режим CFB,
или 128-битовый режим CFB.
При зашифровании в режиме CFB первым входным блоком является значение IV (рисунок 2.38). Чтобы произвести первый входной блок к значению IV применяется операция шифрования. Первая доля зашифрованного текста производится операцией XOR
между первой долей открытого текста и s старшими битами первого выходного блока.
Оставшиеся (b–s) бит первого выходного блока отбрасываются. Затем (b–s) младших бита значения IV соединяются операцией конкатенации с s битами первой доли зашифрованного текста, для формирования второго входного блока. Другими словами для формирования второго входного блока биты первого входного блока циклически сдвигаются на s позиции влево, и затем доля зашифрованного текста заменяет s младших бит.

548
s старших бит выходного блока складывается, с помощью операции XOR, с
соответствующими долями зашифрованного текста.
При зашифровании в режиме CFB входной блок для каждой функции шифрования
(кроме первого) зависит от результата предыдущей функции шифрования, поэтому многократные операции шифрования не могут быть выполнены параллельно. При расшифровании в режиме CFB, необходимые операции шифрования могут быть выполнены параллельно, если из значения IV и зашифрованного текста сначала создать
(последовательно) входные блоки.
Режим обратной связи по выходу (OFB)
В режиме обратной связи по выходу (OFB) последовательность выходных блоков генерируется путем последовательного применения операции шифрования к значению IV.
Чтобы получить зашифрованный текст открытый текст складывается с помощью операции
XOR со сгенерированными выходными блоками и наоборот. Для данного режима шифрования значения IV должны быть случайными, т.е. IV должны быть уникальными для каждого применения режима OFB на данном ключе.
Для зашифрования в режиме OFB, чтобы произвести первый выходной блок, значение IV
преобразовывается функцией шифрования. Чтобы произвести первый блок зашифрованного текста первый выходной блок складывается, с помощью операции XOR, с первым блоком открытого текста. Затем, чтобы произвести второй выходной блок, функция шифрования применяется к первому выходному блоку. Второй выходной блок складывается с помощью операции XOR со вторым блоком открытого текста, чтобы произвести второй блок зашифрованного текста. Затем ко второму выходному блоку применяется функция шифрования, чтобы произвести третий выходной блок. Таким образом, последовательные выходные блоки производятся путем применения функции шифрования к предыдущим выходным блокам, а затем выходные блоки складывается с помощью операции XOR с
соответствующими блоками открытого текста, чтобы произвести блоки зашифрованного текста. В последнем блоке (который может быть неполным блоком из u бит) для операции
XOR используются старшие u бит последнего выходного блока. Оставшиеся (b–u) бит последнего выходного блока отбрасываются.
При расшифровании в режиме OFB чтобы произвести первый выходной блок значение
IV преобразовывается функцией шифрования (рисунок 2.39). Чтобы получить первый блок открытого текста первый выходной блок складывается, с помощью операции XOR, с первым блоком зашифрованного текста. Затем первый выходной блок преобразовывается функцией шифрования, чтобы произвести второй выходной блок. Второй выходной блок складывается с помощью операции XOR со вторым блоком зашифрованного текста, чтобы произвести

550
Для режима OFB требует уникальное значение IV для каждого сообщения, которое когда-либо будет зашифровано на данном ключе. Если, вопреки этому требованию,
используется то же самое значение IV для зашифровывания более, чем одного сообщения, то конфиденциальность этих сообщений может быть поставлена под угрозу. В частности если известен блок открытого текста любого из этих сообщений, скажем, j-й блок открытого текста, то выход j-й функции шифрования может быть определен легко из j-го блока зашифрованного текста сообщения. Эта информация позволяет легко восстановить j-й блок открытого текста любого другого сообщения, зашифрованного с использованием того же самого значения IV, из соответствующего j-го блока зашифрованного текста этого сообщения.
Конфиденциальность может быть аналогичным образом поставлена под угрозу, если любой из входных блоков функции шифрования определяется как IV для зашифрования другого сообщения на данном ключе.
Режим счетчика (Counter mode)
В режиме счетчика (CTR) для производства последовательности выходных блоков операция шифрования применяется к набору выходных блоков, называемых счетчиками.
Чтобы получить зашифрованный текст открытый текст складывается с помощью операции
XOR со сгенерированными выходными блоками и наоборот. Все блоки в последовательности счетчика должны отличаться друг от друга. Это условие не ограничивается одним сообщением, т.е. для всех сообщений, которые зашифровываются на данном ключе, все счетчики должны быть различными.
При зашифровании в режиме CRT функция шифрования применяется к каждому блоку счетчика (рисунок 2.40). Полученные выходные блоки складываются с помощью операции
XOR с соответствующими блоками открытого текста, для того чтобы произвести блоки зашифрованного текста. В последнем блоке (который может быть неполным блоком из u
битов) для операции XOR используются старшие u бит последнего выходного блока.
Оставшиеся (b–u) бит последнего выходного блока отбрасываются.