Опубликован: 02.03.2017 | Доступ: свободный | Студентов: 2512 / 557 | Длительность: 21:50:00
Лекция 7:

Современные симметричные алгоритмы шифрования

7.6 Алгоритм "Кузнечик"

См. ([3])

Структура шифра "Кузнечик" является вариантом подстановочно-перестановочной сети (SP-сети). Каждый раунд состоит из наложения ключа с помощью операции побитового XOR, нелинейной подстановки (S-блоков замен) и линейного перемешивания.

За счет преобразования всего блока данных на каждом шаге обеспечивается гораздо более быстрое перемешивание входных данных по сравнению со схемой Фейстеля. Кроме того, слой линейного преобразования конструируется таким образом, чтобы обеспечить максимально возможное рассеивание. Для этих целей используется так называемая MDS матрица --- используемая в качестве линейного преобразования f(x): F^n \rightarrow F^m матрица над конечным полем F, такая, что любые два вектора вида (x, f(x)) \in F^{n+m} имеют как минимум m + 1 различающихся компонент. То есть набор векторов вида (x, f(x)) обладает свойством максимальной разнесенности (maximum distance separable). Поэтому адекватная стойкость таких алгоритмов достигается за меньшее, по сравнению со схемой Фейстеля, число раундов.

Как и в алгоритме AES, линейное преобразование алгоритма "Кузнечик" использует операции с байтами, представляя их как элементы поля Галуа F=GF(2^8). В "Кузнечике" оно построенного с помощью неприводимого полинома m(x) = x^8 + x^7 + x^6 + x + 1. SP-сети с линейным преобразованием, состоящим из двух частей, первая из которых похожа на операцию MixColumns, а вторая --- на операцию ShiftRows алгоритма AES, называют AES-подобными (like AES).

Байты-константы нам будет удобно зававать целыми числами, двоичные разряды которых есть соответствующие коэффициенты полинома. Например, под числом 130 = 128 + 2 = 2^7 + 2^1 мы будем понимать байт x^7 + x^1 \in GF(2^8).

Шифр "Кузнечик" имеет размер входного блока данных 128 бит, длину ключа 256 бит и выполняет 10 раундов шифрования. В последнем раунде выполняется только одна операция --- наложения раундового ключа.

Первой выполняется операция наложения ключа раунда с помощью побитового XOR: X[k](a) = k\oplus a.

Затем входной 128-битовый блок a алгоритма шифрования представляется в виде последовательности 16 байтов, которые нумеруются справа налево, начиная с 0: a=a_{15} || a_{14} || \ldots || a_1 || a_0, где знаком || обозначена операция конкатенации строк.

К каждому байту применяется нелинейная подстановка, задаваемая массивом

S = (252, 238, 221, 17, 207, 110, 49, 22, 251, 196, 250, 218, 35, 197, 4, 77, 233, 119, 240, 219, 147, 46, 153, 186, 23, 54, 241. 187, 20, 205, 95, 193, 249, 24, 101, 90, 226, 92, 239, 33, 129, 28, 60, 66, 139, 1, 142, 79, 5, 132, 2, 174, 227, 106, 143, 160, 6, 11, 237, 152, 127, 212, 211, 31, 235, 52, 44, 81, 234, 200, 72, 171, 242, 42, 104, 162, 253, 58, 206, 204, 181, 112, 14, 86, 8, 12, 118, 18, 191, 114, 19, 71, 156, 183, 93, 135, 21, 161, 150, 41, 16, 123, 154, 199, 243, 145, 120, 111, 157, 158, 178, 177, 50, 117, 25, 61, 255, 53, 138, 126, 109, 84, 198, 128, 195, 189, 13, 87, 223, 245, 36, 169, 62, 168, 67, 201, 215, 121, 214, 246, 124, 34, 185, 3, 224, 15, 236, 222, 122, 148, 176, 188, 220, 232, 40, 80, 78, 51, 10, 74, 167, 151, 96, 115, 30, 0, 98, 68, 26, 184, 56, 130, 100, 159, 38, 65, 173, 69, 70, 146, 39, 94, 85, 47, 140, 163, 165, 125, 105, 213, 149, 59, 7, 88, 179, 64, 134, 172, 29, 247, 48, 55, 107, 228, 136, 217, 231, 137, 225, 27, 131, 73, 76, 63, 248, 254, 141, 83, 170, 144, 202, 216, 133, 97, 32, 113, 103, 164, 45, 43, 9, 91, 203, 155, 37, 208, 190, 229, 108, 82, 89, 166, 116, 210, 230, 244, 180, 192, 209, 102, 175, 194, 57, 75, 99, 182).

Поскольку каждый байт a_i может принимать значение от 0 до 255, массив S имеет 256 элементов. Это значит, что при a_i=0 значение a_i будет заменено на S(0)= 252, при a_i = 1 --- на S(1)=238, и так далее (все числа записаны в десятеричном виде). Для выходного блока в целом нелинейная подстановка может быть определена как

S(a)=S(a_{15}||\ldots ||a_0) = S(a_{15})||\ldots ||S(a_0).

Линейное перемешивание L шифра "Кузнечик" может быть описано с помощью линейного регистра сдвига R:

  1. Байты a_i представляются в виде полиномов из поля Галуа GF(2^8). Для простоты будем их также обозначать a_i.
  2. В поле F вычисляется байт \gamma(a_{15}, \ldots, a_0) = 148 \cdot a_{15} + 32 \cdot a_{14} + 133 \cdot a_{13} + 16 \cdot a_{12} +194 \cdot a_{11} + 192 \cdot a_{10} + 1 \cdot a_9 + 251 \cdot a_8 + 1 \cdot a_7 + 192 \cdot a_6 +194 \cdot a_5 + 16 \cdot a_4 + 133 \cdot a_3 + 32 \cdot a_2 + 148 \cdot a_1 + 1 \cdot a_0.
  3. Записываем R(a_{15}, \ldots, a_0)=(\gamma(a_{15}, \ldots, a_0) || a_{15} || a_{14} || \ldots || a_1).
  4. Шаги 1-3 повторяются 16 раз; при этом получаемая строка L(a) = R^16 (a) не содержит ни одного не преобразованного символа.

Шифрование 128-битного входного блока a описывается следующей формулой:

E(a) = X[K_{10}LSX[K_9]LSX[K_8]\ldots LSX[K_1](a).

Здесь K_i --- раундовые ключи, записанные подряд преобразования LSX[K_i] обозначают последовательное применение преобразований справа налево. То есть, сначала выполняется прибавление ключа, затем нелинейная подстановка S, затем линейное перемешивание L.

Евгений Шаров
Евгений Шаров

как начать заново проходить курс, если уже пройдено несколько лекций со сданными тестами?

Юлия Мышкина
Юлия Мышкина

Обучение с персональным тьютором осуществляется по Скайпу или посредством переписки?