Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Мокроусов_ОКЗИ

.pdf
Скачиваний:
43
Добавлен:
31.05.2015
Размер:
1.1 Mб
Скачать

Для поточного многоалфавитного шифра правило зашифрования формулируется следующим образом. Пусть А – алфавит открытых сообщений, совпадающий с множествами шифрвеличин и шифробозначений, { A: A A} – совокупность из r биекций множества А, x = a1a2al – произвольный открытый текст, k K – выбранный ключ зашифрования. Пусть

k,l k

k

k N

, j 1,l

1

l

j

r

 

распределитель отвечающий данным значениям k K, l N,

где -

: K N N

 

– некоторое отображение в множе-

r

 

ство Nr = {1,2,…,r}.

 

 

Тогда правило зашифрования определяется форму-

лой

Ek(x) = y, где

 

 

y = b1 b2bl и

b

j

 

k a

j

,

 

 

j

 

 

 

 

 

 

j

1, l

.

2.5.Пример шифра – шифр Rijndael

2.5.1.Состояние, Ключ шифрования и Число Циклов

Разнообразные преобразования работают с промежуточным результатом, называемым Состоянием (State). Определение: промежуточный результат шифрования назовем Состоянием (State).

Состояние можно представить в виде прямоугольного массива байтов. Этот массив имеет 4 строки, а число столбцов обозначено как Nb и равно длине блока, деленной на 32.

Ключ шифрования также представлен в виде прямоугольного массива с четырьмя строками. Число столб-

21

цов обозначено как Nk и равно длине ключа, деленной на

32.Это показано на рис. 2.2.

Внекоторых случаях ключ шифрования показан как линейный массив 4-байтовых слов. Слова состоят из 4 байтов, которые находятся в одном столбце (при представлении в виде прямоугольного массива).

Входные данные для шифра («открытый текст», если используется режим шифрования ECB) обозначаются

как байты состояния в порядке a0,0, a1,0, a3,0, a0,1, a1,1, a3,1 ,a4,1 ... После завершения действия шифра выходные данные получаются из байтов состояния в том же порядке.

Рис. 2.2. Пример представления Состояния (Nb=6) и Ключа шифрования (Nk=4)

Число циклов обозначено как Nr и зависит от значений Nb и Nk. Оно приведено в табл. 2.1.

 

 

 

Таблица 2.1

Nr

Nb=4

Nb=6

Nb=8

Nk=4

10

12

14

Nk=6

12

12

14

Nk=8

14

14

14

22

2.5.2. Цикловое преобразование

Цикловое преобразование состоит из четырех различных преобразований. На псевдо-Си это выглядит следующим образом:

Round (State, RoundKey)

{

ByteSub(State); // замена байт ShiftRow(State); // сдвиг строк MixColumn(State); // зАмешивание столбцов

AddRoundKey(State, RoundKey); // добавление цик-

лового ключа

}

Последний цикл шифра немного отличается. Вот как он выглядит:

FinalRound(State, RoundKey)

{

ByteSub(State); // замена байт ShiftRow(State); // сдвиг строк

AddRoundKey(State, RoundKey); // добавление цик-

лового ключа

}

Вприведенной записи, «функции» – Round, ByteSub

ит.д. выполняют свои действия над массивами, указатели (т.е. State, RoundKey) на которые им передаются.

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

23

2.5.3. Замена байт (ByteSub)

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

1.Первое – получение обратного элемента относительно умножения в поле GF(28), описанного в разделе 2.1. '00' переходит сам в себя.

2.Применение афинного преобразования (над GF(2)), определённого так, как показано в табл. 2.2:

 

 

 

 

 

 

 

 

 

Таблица 2.2

 

y0

 

1

1

1

1

1

0

0

0

x0

 

 

0

y1

 

0

1

1

1

1

1

0

0

x1

 

 

1

y2

 

0

0

1

1

1

1

1

0

x2

 

 

1

y3

=

0

0

0

1

1

1

1

1

x3

+

 

0

y4

1

0

0

0

1

1

1

1

x4

 

0

y5

 

1

1

0

0

0

1

1

1

x5

 

 

0

y6

 

1

1

1

0

0

0

1

1

x6

 

 

1

y7

 

1

1

1

1

0

0

0

1

x7

 

 

1

Применение описанного S-блока ко всем байтам состояния обозначено как ByteSub(State). Рис. 2.3 иллюстрирует применение преобразования ByteSub к состоянию.

24

Рис. 2.3. ByteSub действует на каждый байт состояния

2.5.4. Преобразование сдвига строк (ShiftRow)

Последние 3 строки состояния циклически сдвигаются на различное число байт. Строка 1 сдвигается на С1 байт, строка 2 - на С2 байт и строка 3 - на С3 байт. Значения сдвигов С1, С2 и С3 зависят от длины блока Nb. Их величины приведены в табл. 2.3.

 

 

 

Таблица 2.3

Nb

C1

C2

C3

4

1

2

3

6

1

2

3

8

1

3

4

Операция сдвига последних 3 строк состояния на определенную величину обозначена как ShiftRow(State). Рис. 2.4 показывает влияние преобразования на состояние.

25

Рис. 2.4. ShiftRow действует на строки состояния

2.5.5. Преобразование замешивания столбцов

(MixColumn)

В этом преобразовании столбцы состояния рассматриваются как многочлены над GF(28) и умножаются по модулю x4+1 на многочлен c(x), выглядящий следующим образом:

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

Это может быть представлено в виде матричного умножения. Пусть b(x)=c(x)a(x) (табл. 2.4),

Таблица 2.4

B0

 

02

03

01

01

a0

b1

=

01

02

03

01

a1

B2

01

01

02

03

a2

 

B3

 

03

01

01

02

a3

Применение этой операции ко всем четырем столбцам состояния обозначено как MixColumn(State). Рис. 2.5 демонстрирует применение MixColumn к состоянию.

26

Рис. 2.5. MixColumn действует на столбцы состояния.

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

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

Преобразование, содержащее добавление посредством EXOR циклового ключа к состоянию, обозначено как AddRoundKey(State, RoundKey). Оно проиллюстриро-

вано на рис. 2.6.

27

28

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

2.5.7. Алгоритм выработки ключей (Key Schedule)

Цикловые ключи получаются из ключа шифрования посредством алгоритма выработки ключей. Он содержит два компонента: расширение ключа (Key Expansion) и выбор циклового ключа (Round Key Selection). Основополагающие принципы алгоритма выглядят следующим образом:

Общее число бит цикловых ключей равно длине блока, умноженной на число циклов плюс 1 (например, для длины блока 128 бит и 10 циклов требуется 1408 бит циклового ключа).

Ключ шифрования расширяется в Расширенный Ключ (Expanded Key).

Цикловые ключи берутся из Расширенного ключа следующим образом: первый цикловой ключ содержит первые Nb слов, второй - следующие Nb слов и т.д.

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

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

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

29

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];

}

}

30