Rabbit — Википедия

Схема работы алгоритма

Rabbit — высокоскоростной поточный шифр впервые представленный[1] в феврале 2003 года на 10-м симпозиуме FSE. В мае 2005, он был отправлен на конкурс eStream, целью которого было создание европейских стандартов для поточных систем шифрования.

Разработчиками Rabbit являются Martin Boesgaard, Mette Vesterager, Thomas Pedersen, Jesper Christiansen и Ove Scavenius.

Rabbit используют 128-битный ключ и 64-битный инициализирующий вектор. Шифр был разработан с целью использования в программном обеспечении, как обладающий высокой скоростью шифрования. При этом скорость шифрования могла достигать 3.7 циклов в байт(CPB) для процессора Pentium 3 и 10.5 циклов в байт для ARM7. Тем не менее, шифр также оказался быстрым и компактным при реализации в аппаратном обеспечении.

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

Авторы шифра предоставили полный набор технических описаний на домашней странице Cryptico[2]. Шифр также описан в RFC 4503. Cryptico обладала патентом на шифр, и многие годы для использования шифра в коммерческих целях требовалась лицензия. Однако, 6 октября 2008 шифр разрешили использовать для любых целей бесплатно[3].

Поточные симметричные шифры проекта eSTREAM составляют два профиля. В Профиль 1 входят шифры, ориентированные на программную реализацию, а в Профиль 2 — шифры, ориентированные на аппаратную реализацию.

Лучшие шифры проекта:

Профиль 1 Профиль 2
HC-128 F-FCSR-H v2
Rabbit Grain v1
Salsa20/12 MICKEY v2
Sosemanuk Trivium

В Профиль 1 вошли поточные симметричные шифры с хорошей программной реализацией. Настолько хорошей, что должны были превосходить по скоростным показателям блочный симметричный алгоритм шифрования AES в режимах генерации гаммы. Основным требованием к этому профилю было обеспечение уровня безопасности в 128 бит.

Достоинства и недостатки шифра Rabbit

[править | править код]

Rabbit является одной из старейших конструкций проекта eSTREAM. Данный поточный шифр не был подвержен каким-либо модификациям или дополнениям. Его спецификация оставалась неизменной с 2003 года и по данный момент. Шифр пережил все три этапа проекта и ни на одном не был подвержен криптоаналитическим атакам. Кроме всего прочего, данный алгоритм очень хорошо реализуется на новых процессорах семейства Intel. Как недостаток можно заметить тот факт, что шифр Rabbit обеспечивает уровень безопасности только в 128 бит.

Результаты заключительного голосования проекта eSTREAM по Профилю 1.

Профиль 1 очки
Rabbit 2.80
Salsa20 2.80
Sosemanuk 1.20
HC-128 0.60
NLS v2 −0.60
LEX v2 −1.20
CryptMT v3 −1.40
Dragon −1.60

Внутреннее состояние поточного шифра содержит 513 битов. 512 из них поделены на восемь 32-битных переменных состояний и восемь 32-битных счётчиков , где  — переменная состояния подсистемы при итерации , а  — обозначает соответствующий счётчик переменных. 513-й бит — бит переноса , который необходимо хранить между итерациями. Этот бит инициализируется нулём. 8 переменных состояний и 8 счётчиков зависят от ключа при инициализации.

Схема установки состояния

[править | править код]

Алгоритм инициализируется расширением 128-битного ключа на 8 переменных состояния и 8 счётчиков так, что существует взаимно однозначное соответствие между ключом, начальными переменными состояний, , и начальными счётчиками, . Ключ поделён на 8 подключей: , , … , , переменные состояний и счётчики инициализируются при помощи подключей

где  — операция конкатенации.

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

для предотвращения восстановления ключа путём инверсии системы счётчиков.

Функция следующего состояния

[править | править код]

Здесь все сложения по модулю 232. Функции и возвращают, соответственно, младшие и старшие четыре байта 64-разрядного числа ,  — циклический сдвиг влево.

Система счетчиков

[править | править код]

Уравнения, задающие изменение системы счетчиков:

где счетчик бита переноса задаётся как

Кроме того, константы определяются как

Схема извлечения

[править | править код]

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

где  — 128-битный блок шифрующего потока на -й итерации.

Схема шифрования и расшифрования

[править | править код]

Выполняется операция XOR между извлеченными битами и текстом/шифротекстом для шифрования/дешифрования.

где и обозначают -й блок шифротекста и текста соответственно.

Свойства схемы установки ключа

[править | править код]

Установку ключа можно разделить на три этапа: расширение ключа, система итераций, модификация счетчика.

  • Этап расширения ключа гарантирует взаимно однозначное соответствие между ключом состояния и ключом счётчика, который предотвращает избыток ключей. Он также распределяет биты ключа оптимальным образом для итераций.
  • Система итераций гарантирует, что после одной итерации функции следующего состояния каждый бит ключа повлияет на все восемь переменных состояния. Это также гарантирует, что после второй итерации функции следующего состояния все биты ключа повлияют на все биты состояния с вероятностью 0,5. Для надёжности шифрования итерацию проделывают четыре раза.
  • Даже если счетчики будут известны злоумышленнику, модификация счётчика сильно усложняет восстановление ключа путём инвертирования счётчика системы, так как потребуются сведения о переменных состояния, также это нарушает взаимно однозначное соотношение между ключом и счетчиком.

Безопасность

[править | править код]

Rabbit предоставляет 128-битную защиту против атакующих, чья цель — один уникальный ключ. Если же атака происходит на несколько ключей за раз, и всё равно, который из них взломают, то защищённость снижается до 96 бит[5].

Атаки на функцию установления ключа

[править | править код]

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

Атака, основанная на коллизии

[править | править код]

В шифре Rabbit используется неоднозначное отображение, разные ключи потенциально могут привести к той же гамме. Эта проблема в основном сводится к вопросу о том, что разные ключи приводят к одним и тем же значениям счётчика, так как различные значения счётчика почти наверняка приведут к разным генерациям гаммы. Надо обратить внимание, что расширение ключа и система итераций были разработаны таким образом, что каждый ключ приводит к уникальным значениям счетчика. Тем не менее, модификация счётчика может привести к равным значениям счетчика для двух различных ключей. Полагая, что после четырёх начальных итераций внутреннее состояние, по существу, случайное и не коррелирует с системой счётчиков, вероятность коллизий задается «парадоксом дней рождения», то есть для всех ключей одна коллизия ожидается в 256-битным счетчиком[уточнить]. Таким образом, коллизия системы счетчиков не должна вызывать проблем на практике.

Атака со связанным ключом

[править | править код]

Атака основана на использовании свойств симметрии в функциях следующего состояния и установки ключа. Рассмотрим, например, два ключа и связанные соотношением для всех . Это приводит к соотношению и . Теперь рассмотрим, когда и  — один и тот же ключ. Если условие выполнено, то функция следующего состояния сохранила бы свойство симметрии. Но можно легко проверить, что константы , выбраны так, что . Таким образом, функция следующего состояния не подвержена атаке на основе связанного ключа.

Атака на основе частичного угадывания ключа

[править | править код]

Guess-and-Verify Attack

[править | править код]

Такая атака станет возможной, если выходные биты можно будет предсказать с помощью небольшого набора битов внутреннего состояния. Злоумышленник должен отгадать соответствующую часть переменных состояния, предсказать выходные биты и сравнить их с непосредственно наблюдаемыми битами на выходе, чтобы удостовериться в правильности своей догадки. Злоумышленник должен угадать, по крайней мере, 2*12 входных байт для различных g-функций для проверки в отношении одного байта. Это равносильно угадыванию 192 битов, что сложнее, чем полный перебор всех ключей.

Guess-and-Determine Attack

[править | править код]

Суть этого метода заключается в том, что надо угадать несколько неизвестных переменных шифра и, используя их, вывести оставшиеся неизвестные. После этого систему прогоняют несколько раз, и то что получилось на выходе сравнивают с реальным выходными данными шифра для проверки предположения. Злоумышленник пытается воссоздать 512 бит внутреннего состояния, то есть он наблюдает 4 последовательных 128-битных данных на выходе шифра и делает следующее:

  1. Разделяет 32-битный счётчик и 32-битную переменную состояния на 8-битовые переменные.
  2. Составляет систему уравнений, которая моделирует изменение счётчиков и переменных состояния, и выходные данные. В итоге получается 160 уравнений и 160 неизвестных.
  3. Решает эту систему, угадывая как можно больше неизвестных.

Эффективность такого подхода зависит от количества угаданных переменных. Это количество ограниченно снизу 8-битовой подсистемой с наименьшим количеством входных переменных. Если пренебречь счетчиками, каждый байт функции следующего состояния зависит от 12 входных байт. Если учитывать счётчики, каждый байт на выходе подсистемы зависит уже от 24 входных байт. Следовательно, злоумышленник должен угадать более чем 128 бит, таким образом, делая нападение невыполнимым.

Алгебраические атаки

[править | править код]

Дана Булева функция , АНФ является представлением как многомерного полинома(то есть сумма одночленов от входных переменных). Большое количество одночленов и их хорошее распределение по степеням — важные свойства нелинейных блоков в шифре.

Для случайной Булевой функции в 32 переменных среднее число одночленов равняется , а среднее число одночленов, включающие все данные переменные — . Если мы рассмотрим 32 такие функции, выбранные случайным образом, то среднее число одночленов, которых нет ни в одной из 32 функций, равно 1, и соответствующая дисперсия также равна 1.

Для g-функции в шифре Rabbit, АНФ для 32 булевых подфункций имеют, по крайней мере, степень 30. Число одночленов варьируется от до , где для случайной функции оно должно быть . Распределение одночленов как функции степени представлено на рисунке. В идеале, основная часть должна была находиться промежутке между пунктирными линиями, которые показывают отклонения от среднего для идеальной случайной функции. Некоторые Булевы функции значительно расходятся с результатами для случайной функции, однако, все они имеют большое число одночленов высокой степени.

К тому же, исследовалось частичное совпадение 32 функций. Общее число одночленов, которые встречаются один раз, равно , в то время как число одночленов, которые не встречаются вовсе — . Если сравнить со случайной функцией, то это довольно большие отклонения. Эта информация может быть полезна для анализа шифра в будущем.

Практически невозможно рассчитать АНФ для всех битов на выходе для полного шифра. Но уменьшение размера ключа с 128 бит до 32 бит делает это возможным для изучения 32 булевых функций на выходе как функцию от 32 битного ключа.

Для урезанной версии шифра Rabbit была исследована функция установки для различного числа итераций. АНФ определяется после 0, 1, 2, 3, 4 итераций и одной дополнительной в схеме извлечения. Для 0+1 итераций число одночленов было примерно равно 2^31, как предполагалось для случайной функции. Но после двух итераций результат стабилизировался. Это означает, что больше нет колебаний на выходе. Количество отсутствующих полиномов 0, 1, 2, 3, 1 в итерациях (0+1), …, (4+1) соответственно. Очевидно, что эти данные соответствуют результатам для случайных функций.

Корреляционные атаки

[править | править код]

Линейная атака подразумевает нахождение лучшего линейного приближения между битами на входе функции следующего состояния и битами на выходе схемы извлечения. Для этого используют Преобразование Уолша — Адамара, полагая, что все входные данные линейно независимы. Было установлено, что наилучшая линейная корреляция имеет коэффициент корреляции порядка , что подразумевает генерацию выходных данных от итераций, чтобы сравнить со случайной функцией.

Аппроксимация второго порядка

[править | править код]

Отсекание из АНФ для g-функции членов выше второго порядка значительно улучшает аппроксимацию при правильных условиях.

Обозначим через аппроксимацию второго порядка АНФ для . По результатам эксперимента коэффициент корреляции между и составляет менее , а коэффициент корреляции между и примерно равен . Это означает, что некоторые члены более высокой степени отсекаются при сложении по модулю 2 двух соседних битов. Построение по этим данным шифра со вторым порядком аппроксимации дает, в лучшем случае, коэффициент корреляции порядка . Данное значение коэффициента корреляции является недостаточным для атаки. Если ещё учитывать счетчики, то анализ намного усложняется.

Примечания

[править | править код]
  1. M. Boesgaard, M. Vesterager, T. Pedersen, J. Christiansen, O. Scavenius. Rabbit: A High-Performance Stream Cipher. Proc. FSE 2003. Springer LNCS 2887, pp. 307—329 (PDF)
  2. M. Boesgaard, T. Pedersen, M. Vesterager, E. Zenner. The Rabbit Stream Cipher — Design and Security Analysis. Proc. SASC 2004. (PDF Архивная копия от 17 мая 2011 на Wayback Machine)
  3. Phorum :: ECRYPT forum :: Rabbit becomes public domain. Дата обращения: 18 декабря 2010. Архивировано 30 июня 2009 года.
  4. The eSTREAM Portfolio Steve Babbage, Christophe De Canni`ere, Anne Canteaut, Carlos Cid, Henri Gilbert, Thomas Johansson, Matthew Parker, Bart Preneel, Vincent Rijmen and Matthew Robshaw6 (PDF Архивная копия от 13 августа 2012 на Wayback Machine)
  5. Christophe De Cannière, Joseph Lano, and Bart Preneel, «Comments on the Rediscovery of Time Memory Data Tradeoffs», 2005. (PDF Архивная копия от 6 июля 2015 на Wayback Machine)