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 является одной из старейших конструкций проекта 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 между извлеченными битами и текстом/шифротекстом для шифрования/дешифрования.
где и обозначают -й блок шифротекста и текста соответственно.
Установку ключа можно разделить на три этапа: расширение ключа, система итераций, модификация счетчика.
Rabbit предоставляет 128-битную защиту против атакующих, чья цель — один уникальный ключ. Если же атака происходит на несколько ключей за раз, и всё равно, который из них взломают, то защищённость снижается до 96 бит[5].
После того, как ключ задан, биты счётчика и состояния строго и очень нелинейно зависят от бит ключа. Это усложняет взлом для атак на основе угадывания части ключа, даже если биты счётчика были известны после модификации счётчика. Конечно, знание счётчиков делает другие виды взломов легче.
В шифре Rabbit используется неоднозначное отображение, разные ключи потенциально могут привести к той же гамме. Эта проблема в основном сводится к вопросу о том, что разные ключи приводят к одним и тем же значениям счётчика, так как различные значения счётчика почти наверняка приведут к разным генерациям гаммы. Надо обратить внимание, что расширение ключа и система итераций были разработаны таким образом, что каждый ключ приводит к уникальным значениям счетчика. Тем не менее, модификация счётчика может привести к равным значениям счетчика для двух различных ключей. Полагая, что после четырёх начальных итераций внутреннее состояние, по существу, случайное и не коррелирует с системой счётчиков, вероятность коллизий задается «парадоксом дней рождения», то есть для всех ключей одна коллизия ожидается в 256-битным счетчиком[уточнить]. Таким образом, коллизия системы счетчиков не должна вызывать проблем на практике.
Атака основана на использовании свойств симметрии в функциях следующего состояния и установки ключа. Рассмотрим, например, два ключа и связанные соотношением для всех . Это приводит к соотношению и . Теперь рассмотрим, когда и — один и тот же ключ. Если условие выполнено, то функция следующего состояния сохранила бы свойство симметрии. Но можно легко проверить, что константы , выбраны так, что . Таким образом, функция следующего состояния не подвержена атаке на основе связанного ключа.
Такая атака станет возможной, если выходные биты можно будет предсказать с помощью небольшого набора битов внутреннего состояния. Злоумышленник должен отгадать соответствующую часть переменных состояния, предсказать выходные биты и сравнить их с непосредственно наблюдаемыми битами на выходе, чтобы удостовериться в правильности своей догадки. Злоумышленник должен угадать, по крайней мере, 2*12 входных байт для различных g-функций для проверки в отношении одного байта. Это равносильно угадыванию 192 битов, что сложнее, чем полный перебор всех ключей.
Суть этого метода заключается в том, что надо угадать несколько неизвестных переменных шифра и, используя их, вывести оставшиеся неизвестные. После этого систему прогоняют несколько раз, и то что получилось на выходе сравнивают с реальным выходными данными шифра для проверки предположения. Злоумышленник пытается воссоздать 512 бит внутреннего состояния, то есть он наблюдает 4 последовательных 128-битных данных на выходе шифра и делает следующее:
Эффективность такого подхода зависит от количества угаданных переменных. Это количество ограниченно снизу 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 двух соседних битов. Построение по этим данным шифра со вторым порядком аппроксимации дает, в лучшем случае, коэффициент корреляции порядка . Данное значение коэффициента корреляции является недостаточным для атаки. Если ещё учитывать счетчики, то анализ намного усложняется.