MICKEY
В криптографии, MICKEY (англ. Mutual Irregular Clocking KEYstream generator) — алгоритм потокового шифрования. Существует два варианта этого алгоритма — с длиной ключа 80 бит (MICKEY) и 128 бит (MICKEY-128). Он был разработан Стивом Бэббиджем и Мэтью Доддом в 2005 году с целью использования в системах с ограниченными ресурсами. Этот алгоритм имеет простую аппаратную реализацию при высокой степени защищённости. В нём используется нерегулярное тактирование сдвиговых регистров, а также новые методы, обеспечивающие достаточно большой период и псевдослучайность ключевой последовательности и устойчивость к атакам[1]. Алгоритм MICKEY участвовал в конкурсном проекте eSTREAM, организованным сообществом eCRYPT. Текущая версия алгоритма — 2.0. Она вошла в портфолио eCRYPT, как потоковый шифр для аппаратной реализации[2].
Терминология
[править | править код]Входные параметры:
- ключ K длиной 80 бит, его биты обозначаются k0, k1 …, k79;
- инициализирующая переменная IV длиной от 0 до 80 бит, её биты обозначаются iv0, …, ivдлина IV — 1.
Ключевая последовательность обозначается z0, z1, z2 ….
Ограничения использования
[править | править код]Максимальная длина ключевой последовательности, полученной с помощью одной пары (K, IV) составляет 240 бит. Однако допускается получение 240 таких последовательностей при использовании одного K при условии, что IV выбирается разными для каждой новой последовательности.
Устройство генератора ключевой последовательности
[править | править код]Регистры
[править | править код]Генератор состоит из двух регистров R и S, каждый из которых имеет длину 100 бит.
Биты этих регистров обозначаются r0, r1, …, r99 и s0, s1, …, s99 соответственно.
Сдвиг регистра R
[править | править код]Набор входов обратной связи регистра R обозначается RTAPS.
RTAPS = { 0, 1, 3, 4, 5, 6, 9, 12, 13, 16, 19, 20, 21, 22, 25, 28, 37, 38, 41, 42, 45, 46, 50, 52, 54, 56,
- 58, 60, 61, 63, 64, 65, 66, 67, 71, 72, 79, 80, 81, 82, 87, 88, 89, 90, 91, 92, 94, 95, 96, 97 }
Операция сдвига CLOCK_R (R, INPUT_BIT_R, CONTROL_BIT_R) определяется следующей последовательностью действий:
- пусть r0, r1, …, r99 — состояние регистра до сдвига, а r'0, r'1, …, r'99 — после сдвига;
- FEEDBACK_BIT = r99 ⊕ INPUT_BIT_R;
- для 1 ≤ i ≤ 99, r'i = ri-1; r'0 = 0;
- для 0 ≤ i ≤ 99, если i ∈ RTAPS, r'i = r'i ⊕ FEEDBACK_BIT;
- если CONTROL_BIT_R = 1, то
- для 0 ≤ i ≤ 99, r'i = r'i ⊕ ri.
Сдвиг регистра S
[править | править код]Определим четыре последовательности COMP01 … COMP098, COMP11 … COMP198, FB00 … FB099, FB10 … FB99 в соответствии с таблицей:
i | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
COMP0i | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | |
COMP1i | 1 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | |
FB0i | 1 | 1 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 |
FB1i | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 0 |
i | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 |
COMP0i | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 |
COMP1i | 0 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 1 |
FB0i | 1 | 1 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 1 |
FB1i | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | 0 |
i | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 |
COMP0i | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 |
COMP1i | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 0 | 1 |
FB0i | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
FB1i | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | 1 |
i | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 |
COMP0i | 1 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | |
COMP1i | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | |
FB0i | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 0 |
FB1i | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 |
Функция сдвига регистра S CLOCK_S определяется как последовательность действий:
- пусть s0, s1, …, s99 — состояние регистра до сдвига, а s'0, s'1, …, s'99 — после сдвига. ŝ0, ŝ1, …, ŝ99 будем обозначать промежуточное состояние регистра;
- FEEDBACK_BIT = s99 ⊕ INPUT_BIT_S;
- для 1 ≤ i ≤ 98, ŝi = si-1 ⊕ ((si ⊕ COMP0i)•(si+1 ⊕ COMP1i)); ŝ0 = 0; ŝ99 = s98;
- если CONTROL_BIT_S = 0, то
- для 0 ≤ i ≤ 99, s'i = ŝi ⊕ (FB0i • FEEDBACK_BIT);
- если CONTROL_BIT_S = 1, то
- для 0 ≤ i ≤ 99, s'i = ŝi ⊕ (FB1i • FEEDBACK_BIT).
Управление тактированием всего генератора
[править | править код]Определим функцию CLOCK_KG (R, S, MIXING, INPUT_BIT) следующим образом:
- СONTROL_BIT_R = s34 ⊕ r67;
- CONTROL_BIT_S = s67 ⊕ r33;
- если MIXING = TRUE, тогда INPUT_BIT_R = INPUT_BIT ⊕ s50, а если MIXING = FALSE, тогда INPUT_BIT_R = INPUT_BIT;
- INPUT_BIT_S = INPUT_BIT;
- CLOCK_R (R, INPUT_BIT_R, CONTROL_BIT_R);
- CLOCK_S (S, INPUT_BIT_S, CONTROL_BIT_S).
Загрузка ключа и инициализация
[править | править код]Регистры инициализируются с использованием начальных параметров K и IV следующим образом:
- в регистры R и S записываются нули;
- загружается IV — для 0 ≤ i ≤ длина IV — 1,
- CLOCK_KG (R, S, MIXING = TRUE, INPUT_BIT = ivi);
- загружается K — для 0 ≤ i ≤ 79,
- CLOCK_KG (R, S, MIXING = TRUE, INPUT_BIT = ki);
- для 0 ≤ i ≤ 99,
- CLOCK_KG (R, S, MIXING =TRUE, INPUT_BIT = 0).
Генерация ключевой последовательности
[править | править код]После загрузки и инициализации можно начинать генерировать ключевую последовательность z0, z1, …, zL-1:
- для 0 ≤ i ≤ L − 1,
- zi = r0 ⊕ s0;
- CLOCK_KG (R, S, MIXING = FALSE, INPUT_BIT = 0).
Особенности
[править | править код]Нерегулярное тактирование регистра R
[править | править код]- Когда флаг CONTROL_BIT_R = 0, R представляет собой обычный регистр сдвига с линейной обратной связью Галуа-типа, с примитивным характеристическим многочленом CR = x100 + Σxi, где i ∈ RTAPS и входным битом INPUT_BIT_R, примешиваемым к обратной связи операцией XOR. Если представить элементы поля GF(2100) многочленами Σrixi, где 0 ≤ i ≤ 99 по модулю CR(x), то сдвиг регистра — это умножение на x в этом поле.
- Когда флаг CONTROL_BIT_R = 1, то помимо сдвига каждого бита происходит его сложение по модулю два с предыдущем значением бита, что соответствует умножению на x + 1 в том же поле. Характеристический многочлен CR(x) выбран таким образом, что он является делителем многочлена xJ + x + 1, где J = 250 — 157. Следовательно такт регистра R при CONTROL_BIT_R = 1 соответствует его сдвигу J раз.
Причины использования нерегулярного тактирования
[править | править код]Потоковые шифры, использующие нерегулярное тактирование, часто подвержены статистическим атакам. В них используется предположение о том, как много раз регистр был сдвинут. За возможность такой атаки отвечают определенные характеристики шифра:
- сдвиг регистра сначала m раз, а потом n раз дает тот же результат, что и сдвиг регистра сначала n раз, а потом m раз, то есть разные варианты тактирования коммутируют. Это дает преимущество криптоаналитику, так как нет необходимости определять порядок таких операций;
- также, если вариантов тактирования регистра много, то, например, пять сдвигов регистра дает одиночная и четырёхкратная операция тактирования или двукратная и трёхкратная, что ещё больше уменьшает количество комбинаций для перебора, упрощая статистическую атаку;
- n-кратный сдвиг может произойти после любого сдвига.
При разработке в основу шифра MICKEY легли следующие идеи:
- использовать нерегулярный сдвиг для защиты от многих типов атак;
- обеспечить большой период и локальную случайность;
- как можно больше уменьшить возможность статистических атак, которым подвержены шифры этого типа.
В отношении указанных свойств 1-3, ухудшающих криптостойкость, MICKEY ведёт себя следующим образом:
- верно для регистра R, так как clockJ • clock1 = clock1 • clockJ, но не верно для регистра S, операции тактирования которого не коммутируют.
- не верно для обоих регистров. Для R для любых t ≤ 240 и u существует не более одной пары n1 и nJ таких, что 0 ≤ n1,nJ ≤ t, n1 + nJ = t и n1 + nJJ = u, где n1 и nJ соответствуют однократному и J-кратному сдвигу.
- не верно для обоих регистров. Для R для любого заданного u существует не более одной тройки t, n1 и nJ таких, что t ≤ 240, 0 ≤ n1,nJ ≤ t, n1 + nJ = t и n1 + nJJ = u.
Регистр R обеспечивает неповторяемость состояния генератора и хорошие локальные статистические свойства. Влияние регистра R на S также предотвращает зацикливание S с маленьким периодом. Если J ≤ 260, то состояние регистра R не повторится при генерации ключевой последовательности длиной вплоть до 240 бит. А если J ≥ 240, то свойство (2) не верно.
Выбор битов управления тактированием
[править | править код]Биты управления для каждого регистра выбраны таким образом, что они зависят от обоих регистров. Поэтому знания состояния одного из регистров не достаточно для определения последующих состояний генератора.
Количество энтропии
[править | править код]Так как нерегулярное тактирование управляется битами из самого генератора, это может уменьшить количество энтропии в генераторе. Использование операции XOR и битов из двух регистров для получения бита управления обеспечивает отсутствие корреляции между этим битом управления и контролируемым регистром. Благодаря этому энтропия не уменьшается при работе генератора.
Примечания
[править | править код]- ↑ Steve Babbage, Matthew Dodd. The stream cipher MICKEY 2.0 Архивная копия от 27 мая 2011 на Wayback Machine (англ.)
- ↑ T. Good and M. Benaissa. Hardware results for selected stream cipher candidates Архивная копия от 2 марта 2011 на Wayback Machine (англ.)