SHARK

Материал из testwiki
Перейти к навигации Перейти к поиску

Шаблон:Карточка блочного шифра SHARK (Шаблон:Lang-en — безопасный хеширующий алгоритм с воссоздающимися ключами) — симметричный алгоритм блочного шифрования, разработанный группой криптографов, среди которых Винсент Рэймен, — автор шифра AES. В теории позволяет использовать блоки и ключи различной длины, однако авторская реализация использует 128-битный ключ и 64-битные блоки. Структура схожа со структурой подстановочно-перестановочной сети.

История SHARK

Шифр SHARK — первый в серии алгоритмов, разработанных в ходе исследования по созданию безопасных и эффективных алгоритмов блочного шифрования на основе метода Wide Trail design strategy[1]. Результатом исследования позже стало создание стандартного шифра AES[2].

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

  • высокая производительность — небольшое число раундов. Для сравнения, в шифре DES использовалось 16 раундов. По словам автором, им удались достичь более чем четырёхкратного ускорения по сравнению с шифрами SAFER и IDEA;
  • неуязвимость для линейного и дифференциального криптоанализа, для которых был уязвим DES[3].

Хотя до этого уже существовали шифры на основе SP-сети (MMB, SAFER, 3-Way), SHARK впервые использовал MDS-коды[4] для линейного преобразования, а именно коды Рида-Соломона[3].

Существует два варианта шифра SHARK: SHARK-A (Шаблон:Lang-en) и SHARK-E (Шаблон:Lang-en), получившие название благодаря различным способам введения раундовых ключей[5].

Дизайн алгоритма

Концептуальная схема шифра SHARK

Алгоритм SHARK состоит из трех компонентов:

  • нелинейный слой — основан на S-блоках;
  • слой диффузии — основан на MDS-кодах[4];
  • расписание ключей для получения раундовых ключей из исходного ключа[3].

Каждый компонент алгоритма рассматривается отдельно и каждый должен обладать определёнными свойствами. Так, слой диффузии должен обладать равномерными и хорошими диффузионными свойствами. Нелинейный слой также должен обладать равномерными нелинейными свойствами, причем компоненты алгоритма независимы в следующем смысле: при изменении реализации, например, нелинейного слоя (одни S-блоки заменяются другими S-блоками c такими же характеристиками), защищенность алгоритма остается неизменной. Такая стратегия является вариантом Wide trail strategy[1], описанной в докторской диссертации Йоана Даймена[3].

SHARK состоит из R раундов, дополнительного слоя добавления ключа и дополнительно слоя инвертированной диффузии. Каждый раунд, в свою очередь, состоит из добавления ключа, нелинейной замены и слоя диффузии. Дополнительный слой добавления ключа нужен для того, чтобы злоумышленник не смог отделить последний раунд. Дополнительный слой инвертированной диффузии необходим для упрощения операции дешифрования[3].

Слой нелинейный замены состоит из n S-блоков, каждый из которых представляет собой m-битную перестановку. Таким образом, алгоритм способен шифровать блоки длиной mn[3].

Слой диффузии

На вход слою диффузии приходят n m-битных чисел, которые можно рассматривать как элементы над полем GF(2m). Рассматриваемый слой необходим для создания лавинного эффекта. Этот эффект проявляется в линейном и разностном контекстах:

  • Линейный контекст — нет корреляции между линейной комбинации небольшого набора m-битных входных данных и линейной комбинации небольшого набора (m-битных) выходных данных.
  • Разностный контекст — небольшое изменение входных данных влечет значительное изменение данных на выходе, и наоборот, для небольшого изменения выходных данных нужно значительно изменить входные данные[3].

Пусть θ — обратимое линейное преобразование, a — элемент поля GF(2m), wh(a) — расстояние Хэмминга, тогда количественно лавинный эффект оценивается числом скачка (Шаблон:Lang-en) B(θ)=mina0(wh(a)+wh(θ(a)))[3].

Если wh(a)=1, то Bn+1. B=n+1 называют оптимальным числом скачка (Шаблон:Lang-en). В основной статье авторы показали, что с помощью MDS-кодов можно сконструировать обратимое линейное преобразование с оптимальном числом скачка. В реализации используются (2n,n,n+1) коды Рида-Соломона[3].

Нелинейный слой (блоки подстановок)

Нелинейные S-блоки обеспечивают защиту от линейного и дифференциального криптоанализов. Одним из важных численных характеристик безопасности шифра служит матрица эксклюзивных ИЛИ (Шаблон:Lang-en) E отображения γ, элементы которой определяются по формуле Eij=(x|γ(x)γ(ix)=j), где  — обозначает число удовлетворяющих условию элементов, x,i,j — элементы поля GF(2m). Большие значения элементов матрицы могут привести к восприимчивости шифра к дифференциальной атаке[3].

Авторами были выбраны S-блоки, основанные на отображении F(x)=x1 над полем GF(2m). В этом случае при четном m матрица E обладает следующими свойствами:

  • Дифференциальная 4-стабильность — все элементы матрицы не превосходят 4. В действительности, в каждой строке такой матрицы присутствует ровно один элемент, равный 4, а остальные равны 2 либо 0.
  • Минимальное расстояние аффинной функции равно 2m/2.
  • Нелинейный порядок любой линейной комбинации выходных битов равен m+1[3].

Для того чтобы удалить фиксированные точки 00 и 11, используется обратимое аффинное преобразование выходных бит[3].

Расписание ключей

Расписание ключей (Шаблон:Lang-en) позволяет расширить исходный ключ K, получив R+1 раундовых ключей Ki. Хорошее планирование позволяет получить раундовые ключи с максимальной энтропией. Авторами предлагаются два способа ввести раундовый ключ:

  1. Exor — простое исключающее ИЛИ с входными данными в каждом раунде. Соответствующий алгоритм — SHARK-E.
  2. Affine Transformation — aффинное преобразование входных данных, зависящее от ключа. Соответствующий алгоритм — SHARK-A[3].

Exor

Вычисляется простое исключающее ИЛИ mn входных бит раунда и mn подключа. Преимущества метода — быстрота и стабильность: никакой ключ не является сильнее или слабее другого. Недостаток метода — энтропия раундового ключа не превосходит mn[3].

Affine Transformation

Пусть ki — невырожденная матрица n×n над полем GF(2m), зависящая от ключа K (точнее, от его расширения). Введем ключевую операцию над входными данными следующим образом: Y(X)=kiXKi. Это линейная операция, потому она не вводит слабых ключей. Кроме того, энтропия раундовых ключей увеличивается до O(mn2). Однако, это довольно дорогая в смысле производительности операция, поэтому авторами предлагается ограничить ki на подпространстве диагональных матриц. В этом случае энтропия раундовых ключей становится близкой к 2mn[3].

Генерация подключей

В алгоритме SHARK, генерация раундовых ключей осуществляется следующим образом:

  1. R+1 раундовых mn-битных ключей Ki инициализируются первыми R+1 записями в таблице замещений (Шаблон:Lang-en).
  2. Матрицы ki инициализируются единичными матрицами.
  3. Выбранный пользователем ключ конкатенируется сам с собой до тех пор, пока не будет иметь длину 2(R+1)mn бит.
  4. К полученной в п. 3 последовательности применяется алгоритм SHARK в режиме CFB.
  5. Первые (R+1)mn бит выходных данных используются для формирования раундовых ключей Ki.
  6. Последние (R+1)mn бит выходных данных интерпретируются как (R+1)n элементов поля GF(2m), и формируют диагональные элементы матриц ki. Если какой-нибудь элемент равен нулю, то он отбрасываются, а все следующие элементы сдвигаются вниз на единицу. Дополнительные зашифрованные нулевые строки добавляются в конец, чтобы заполнить оставшиеся диагональные элементы[3].

Механизм генерации подключей в принципе позволяет использовать ключ длины 2(R+1)mn бит, но авторы рекомендуют использовать ключ, не превышающий 128 бит[3].

Заметки по реализации

Таблицы замещений

Для того, чтобы добиться высокой производительности, слой диффузии и блоки подстановок объединяются в одну операцию[3]. Пусть X1,...,Xn обозначают входные данные раунда; Y1,...,Yn — выходные данные; S1,...,Sn — матрицы перестановок (S-блоки); A — матрица, определяющая слой диффузии; и  — обозначают сложение и умножение над полем GF(2n). Тогда

(Y1...Yn)=A(S1[X1]...Sn[Xn])=(a11...an1)S1[X1]...(a1n...ann)Sn[Xn]=(a11S1[X1]...an1S1[X1])...(a1nSn[Xn]...annSn[Xn])

Используя расширенные таблицы замещений Ti размерности m×mn, определяемые по формуле Ti[X]=(a1iSi[Xi]...aniSi[Xi]), можно записать преобразование в простом виде: (Y1...Yn)=T1[X1]T2[X2]...Tn[Xn]

Таким образом, один раунд требует n поисков по таблице и n1 бинарных операций. Однако, из-за того что при длине блока 8n бит таблицы занимают n2×256 байт, алгоритм для блоков длины 128 бит и более оказывался неэффективным для большинства процессоров того времени (1996 год), отсюда происходит существующее ограничение на длину блока в 64 бит (n=8,m=8)[2].

Матрица MDS-кода

Для n=8 можно построить матрицу, определяющую слой диффузии, на основе кода Рида-Соломона[2].

A=(CEE7B9D05287740B95FEDA9DA928513157054D26073A157F82D2D12C6C5ACF868A529E5DB9F409BE19C1179F8F33A405B088836D700B628301F18675176C0934)

Дешифрование

Для описания дешифрования рассмотрим 2-х раундовую версию SHARK[3]. Пусть l — линейная операция, s — нелинейная замена, aki — операция добавления ключа для раундового ключа ki. Функция шифрования, в таком случае, равна Y=(l1ak3lsak2lsrak1)(X), где r — комбинированная из слоя диффузии и S-блоков операция. Так как операция добавления ключа и операция диффузии — линейные операции, их порядок можно поменять местами[3]:

(lak)(X)=A(kXK)=(AkX)(AK)=((AkA1)(AX))(AK)=(akl)(X),

где введено обозначение ak(X)=kXK=(AkA1)X(AK)

Применим полученную формулу к l1ak3[3]:

Y=(ak3l1lsak2rak1)(X)=(ak3sak2rak1)(X)

Теперь покажем, что операция дешифрования имеет ту же структуру. Для этого сначала обратим операцию шифрования[3]:

X=(ak11s1l1ak21s1l1ak31l)(Y)

Меняя местами операцию добавления ключа и операцию диффузии, получаем ту же структуру, что и в операции шифрования[3]:

X=(ak11s1ak21l1s1rak31)(Y)

Известные атаки

На текущий момент не обнаружено уязвимостей у классической реализации алгоритма. Существуют атаки только на вариации алгоритма:

  • В 1997 году Шаблон:Iw и Ларс Кнудсен показали, что 64-битная реализация SHARK-E (SHARK с exor стратегией введения раундового ключа) теоретически уязвима для интерполяционной атаки при ограничении на количество раундов до 5, а также 128-битная реализация — при ограничении до 8 раундов. Но они также показали, что для достаточной безопасности необходимо по крайней мере 6 раундов[6].
  • В 2013 году Янг Ши (Шаблон:Lang-en) и Хонгвей Фан (Шаблон:Lang-en) показали, что White-Box реализация[7] SHARK недостаточно безопасна и может быть взломана с фактором работы примерно 1.5 * (2 ^ 47)[8].

Примечания

Шаблон:Примечания

Литература

Ссылки

Шаблон:Симметричные криптосистемы

  1. 1,0 1,1 Шаблон:Статья
  2. 2,0 2,1 2,2 Ошибка цитирования Неверный тег <ref>; для сносок :1 не указан текст
  3. 3,00 3,01 3,02 3,03 3,04 3,05 3,06 3,07 3,08 3,09 3,10 3,11 3,12 3,13 3,14 3,15 3,16 3,17 3,18 3,19 3,20 3,21 3,22 Ошибка цитирования Неверный тег <ref>; для сносок :0 не указан текст
  4. 4,0 4,1 MDS-коды — коды с наибольшим кодовым расстоянием
  5. Шаблон:Cite web
  6. Шаблон:Cite web
  7. White-box attack context — злоумышленник имеет полный доступ к программной реализации шифра.
  8. Шаблон:Cite web