SHARK: различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[непроверенная версия][непроверенная версия]
Содержимое удалено Содержимое добавлено
Добавлено описание дешифрования
Добавлены атаки и ссылки
Строка 99: Строка 99:
Используя расширенные таблицы замещений <math>T_i</math> размерности <math>m \times mn </math>, определяемые по формуле <math>T_i[X] = \begin{pmatrix} a_{1i}\cdot S_i[X_i] \\ ... \\ a_{ni}\cdot S_i[X_i] \end{pmatrix} </math>, можно записать преобразование в простом виде: <math>\begin{pmatrix} Y_1 \\ ... \\ Y_n \end{pmatrix} = T_1[X_1]\oplus T_2[X_2]\oplus ... \oplus T_n[X_n] </math>
Используя расширенные таблицы замещений <math>T_i</math> размерности <math>m \times mn </math>, определяемые по формуле <math>T_i[X] = \begin{pmatrix} a_{1i}\cdot S_i[X_i] \\ ... \\ a_{ni}\cdot S_i[X_i] \end{pmatrix} </math>, можно записать преобразование в простом виде: <math>\begin{pmatrix} Y_1 \\ ... \\ Y_n \end{pmatrix} = T_1[X_1]\oplus T_2[X_2]\oplus ... \oplus T_n[X_n] </math>


Таким образом, один раунд требует <math>n</math> поисков по таблице и <math>n - 1</math> бинарных операций. Однако, из-за того что при длине блока <math>8n</math> бит таблица занимает <math>n^2 \times 256 </math> байт<ref name=":1" />, алгоритм для блоков длины 128 бит и более оказывался неэффективным на большинстве процессоров того времени (1996 год), отсюда происходит существующее ограничение на длину блока в 64 бит (<math>n = 8, m = 8</math>).
Таким образом, один раунд требует <math>n</math> поисков по таблице и <math>n - 1</math> бинарных операций. Однако, из-за того что при длине блока <math>8n</math> бит таблица занимает <math>n^2 \times 256 </math> байт<ref name=":1" />, алгоритм для блоков длины 128 бит и более оказывался неэффективным для большинства процессоров того времени (1996 год), отсюда происходит существующее ограничение на длину блока в 64 бит (<math>n = 8, m = 8</math>).


===Матрица MDS-кода ===
===Матрица MDS-кода ===
Строка 125: Строка 125:
<math>X = (a_{k_1^{-1}} \circ s^{-1} \circ a_{k_2^{-1'}} \circ \underbrace{l^{-1} \circ s^{-1}}_{r'} \circ a_{k_3^{-1'}})(Y)</math>
<math>X = (a_{k_1^{-1}} \circ s^{-1} \circ a_{k_2^{-1'}} \circ \underbrace{l^{-1} \circ s^{-1}}_{r'} \circ a_{k_3^{-1'}})(Y)</math>


==Известные атаки ==
==Безопасность ==

Существуют атаки лишь на модифицированный вариант шифра с 5 раундами. Сам алгоритм на данный момент можно считать безопасным.

Данный алгоритм получил развитие и стал основой нового, более безопасного шифра KHAZAD. Алгоритм [[Rijndael]] так же можно считать основанным на идеях шифра SHARK и его потомком.


На текущий момент не обнаружено уязвимостей у классической реализации алгоритма. Существуют атаки только на вариации алгоритма:
* В 1997 году [[:en:Thomas_Jakobsen|Томас Якобсен]] и [[Кнудсен, Ларс|Ларс Кнудсен]] показали, что 64-битная реализация SHARK-E ('''SHARK''' с exor стратегией введения раундового ключа) теоретически уязвима к [[Интерполяционная атака|интерполяционной атаке]] при ограничении на количество раундов до 5, а также 128-битная реализация — при ограничении до 8 раундов. Но они также показали, что для достаточной безопасности необходимо по крайней мере 6 раундов.<ref name=":4">{{
cite web
| author = [[:en:Thomas_Jakobsen|Томас Якобсен]], [[Кнудсен, Ларс|Ларс Кнудсен]]
| title = The Interpolation Attack on Block Ciphers
| url = https://link.springer.com/chapter/10.1007/BFb0052332
}}</ref>
* В 2013 году Янг Ши ({{lang-en|Yang Shi}}) и Хонгвей Фан ({{lang-en|Hongfei Fan}}) показали, что White-Box реализация '''SHARK''' недостаточно безопасна и может быть взломана с фактором работы примерно 1.5 * (2 ^ 47).<ref name=":5">{{
cite web
| author = Yang Shi, Hongfei Fan
| title = On Security of a White-Box Implementation of SHARK
| url = https://link.springer.com/chapter/10.1007/978-3-319-23318-5_25
}}</ref>
==См. также ==
==См. также ==



Версия от 01:04, 14 декабря 2017

SHARK
Создатель Винсент Рэймен, Йоан Даймен, Барт Пренель, Антун Боссэлерс и Эрик де Вин
Создан 1996 г.
Опубликован 1996 г.
Размер ключа 128 бит
Размер блока 64 бит
Число раундов 6[1](8[2])
Тип Подстановочно-перестановочная сеть

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

История SHARK

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Пусть — обратимое линейное преобразование, — элемент поля , расстояние Хэмминга, тогда количественно лавинный эффект оценивается числом скачка (англ. branch number)

Если , то . называют оптимальным числом скачка (англ. optimal branch number). В основной статье[1] авторы показали, что с помощью MDS-кодов можно сконструировать обратимое линейное преобразование с оптимальном числом скачка. В реализации используется коды Рида-Соломона.

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

Нелинейные S-блоки обеспечивают защиту от линейного и дифференциального криптоанализов. Одним из важных численных характеристик безопасности шифра служит матрица эксклюзивных ИЛИ (англ. exor table) отображения , элементы которой определяются по формуле , где — обозначает число удовлетворяющих условию элементов, — элементы поля . Большие значения элементов матрицы могут привести к восприимчивости шифра к дифференциальной атаке.

Авторами были выбраны S-блоки, основанные на отображении над полем . В этом случае при четном матрица обладает следующими свойствами:

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

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

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

Расписание ключей (англ. key scheduling) позволяет расширить исходный ключ , получив раундовых ключей . Хорошее планирование позволяет получить раундовые ключи с максимальной энтропией. Авторами предлагаются два способа ввести раундовый ключ:

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

Exor

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

Affine Transformation

Пусть — невырожденная матрица над полем , зависящая от ключа (точнее, от его расширения). Введем ключевую операцию над входными данными следующим образом: . Это линейная операция, потому она не вводит слабых ключей. Кроме того, энтропия раундовых ключей увеличивается до . Однако, это довольно дорогая в смысле производительности операция, поэтому авторами предлагается ограничить на подпространстве диагональных матриц. В этом случае энтропия раундовых ключей становится близкой к .

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

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

  1. раундовых -битных ключей инициализируются первыми записями в таблице замещений (англ. substitution table) (см. раздел Заметки по реализации).
  2. Матрицы инициализируются единичными матрицами.
  3. Выбранный пользователем ключ конкатенируется сам с собой до тех пор, пока не будет иметь длину бит.
  4. К полученной в п. 3 последовательности применяется алгоритм SHARK в режиме CFB.
  5. Первые бит выходных данных используются для формирования раундовых ключей .
  6. Последние бит выходных данных интерпретируются как элементов поля , и формируют диагональные элементы матриц . Если какой-нибудь элемент равен нулю, то он отбрасываются, а все следующие элементы сдвигаются вниз на единицу. Дополнительные зашифрованные нулевые строки добавляются в конец, чтобы заполнить оставшиеся диагональные элементы.

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

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

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

Для того, чтобы добиться высокой производительности, слой диффузии и блоки подстановок объединяются в одну операцию. Пусть обозначают входные данные раунда; — выходные данные; — матрицы перестановок (S-блоки); — матрица, определяющая слой диффузии; и — обозначают сложение и умножение над полем . Тогда

Используя расширенные таблицы замещений размерности , определяемые по формуле , можно записать преобразование в простом виде:

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

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

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

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

Для описания дешифрования рассмотрим 2-х раундовую версию SHARK. Пусть — линейная операция, — нелинейная замена, — операция добавления ключа для раундового ключа . Функция шифрования, в таком случае, равна , где — комбинированная из слоя диффузии и S-блоков операция. Так как операция добавления ключа и операция диффузии — линейные операции, их порядок можно поменять местами:

,

где введено обозначение

Применим полученную формулу к :

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

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

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

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

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

См. также

Примечания

Ссылки