Схема Рабина: шифрование на квадратичных вычетах

Схема Рабина - асимметричная криптосистема, придуманная Михаэлем Рабином в 1979 году. Её особенность в том, что взлом доказуемо настолько же труден, насколько трудна факторизация большого числа: если бы кто-то умел дешифровать произвольное сообщение, он автоматически умел бы и раскладывать составной модуль на простые множители. Это редкое свойство - у популярной RSA такой строгой эквивалентности нет. Разберём, как устроены ключи, почему при дешифровании появляются сразу четыре варианта и как с этой неоднозначностью бороться. Если хотите сразу прогнать конкретные числа, соберите запрос в форме ниже.
Идея: возведение в квадрат вместо степени
В большинстве асимметричных систем шифрование - это возведение открытого текста в большую степень по модулю. Схема Рабина радикально упрощает эту операцию: показатель степени всегда равен двойке. Открытый ключ - это просто составной модуль , где и - два больших секретных простых числа. Шифрование сообщения выглядит так:
Никакой публичной экспоненты , как в RSA, не нужно. Зато вся хитрость перемещается в дешифрование: чтобы восстановить , нужно извлечь квадратный корень из по модулю . А эта операция выполнима за разумное время только тому, кто знает разложение . Именно на этой асимметрии - легко возвести в квадрат, трудно извлечь корень без множителей - и держится вся схема Рабина.

Квадратичные вычеты и почему корней четыре
Чтобы понять дешифрование, нужно вспомнить понятие квадратичного вычета. Число называется квадратичным вычетом по модулю , если уравнение имеет решение. Для простого модуля таких решений ровно два: и (то есть ). Это прямое следствие того, что многочлен второй степени над полем имеет не более двух корней.
Теперь ключевой момент. Сама проверка, является ли вычетом, опирается на квадратичный закон взаимности и символ Лежандра. Модуль Рабина составной, поэтому по китайской теореме об остатках извлечение корня по модулю распадается на два независимых извлечения - по модулю и по модулю . У каждого из них по два корня, и комбинаций получается :
Каждая из четырёх пар знаков, собранная обратно по модулю , даёт свой корень. Один из них - исходное сообщение , остальные три - посторонние корни. Эта четырёхзначность и есть главная плата за простоту шифрования: получатель должен как-то понять, который из четырёх корней был отправлен.
Генерация ключей: простые специального вида
Извлекать корни проще всего, когда оба простых дают остаток 3 при делении на 4, то есть . Такие простые называют простыми Блюма, а их произведение - числом Блюма. При этом условии квадратный корень по модулю простого вычисляется одной формулой возведения в степень, без перебора:
Проверить, что это действительно корень, легко: возведя в квадрат, по малой теореме Ферма получаем обратно . Поэтому генерация ключей сводится к выбору двух больших простых вида , их перемножению и публикации произведения. Секретный ключ - пара , открытый ключ - одно число . Сравните это с устройством алгоритма Диффи-Хеллмана: там секрет прячется за дискретным логарифмом, здесь - за факторизацией.
Условие $p \equiv q \equiv 3 \pmod 4$ не обязательно для стойкости, но без него извлечение корня по модулю простого требует алгоритма Тонелли-Шенкса. С простыми Блюма всё сводится к одному быстрому возведению в степень.
Дешифрование шаг за шагом
Полный алгоритм восстановления сообщения из шифртекста при известных и выглядит так:
- Вычислить частичные корни и .
- Найти коэффициенты Безу и из расширенного алгоритма Евклида: .
- Собрать четыре корня по китайской теореме об остатках:
Все четыре числа при возведении в квадрат по модулю дают исходный . Один из них и есть отправленное сообщение. Без знания и шаги 1 и 3 выполнить нельзя - именно поэтому открытому ключу разложение недоступно.

Как снять неоднозначность четырёх корней
Проблема четырёх корней решается избыточностью в самом сообщении. Перед шифрованием в открытый текст добавляют заранее оговорённую метку - например, дублируют последние биты или приписывают фиксированный паттерн. После дешифрования получатель проверяет все четыре корня и оставляет тот единственный, в котором метка на месте. Вероятность, что посторонний корень случайно пройдёт проверку, ничтожно мала.
Альтернативный приём - символ Якоби. Сообщения ограничивают теми , у которых символ Якоби и которые меньше ; вместе эти два условия выделяют из четырёх корней ровно один. На практике в реальных реализациях (например, в стандарте IEEE P1363) почти всегда применяют именно встроенную в текст избыточность - она проще и устойчивее.
Связь стойкости с факторизацией
Главное теоретическое достоинство схемы Рабина - доказуемая редукция. Предположим, существует алгоритм, который по и возвращает какой-нибудь корень из четырёх. Тогда с вероятностью корень не равен , а значит , при том что . Из этого следует, что делит , но не делит ни один из сомножителей по отдельности. Поэтому
даёт нетривиальный делитель - то есть факторизацию. Вывод: если факторизация трудна, то трудна и дешифровка. Ни у RSA, ни у Диффи-Хеллмана такой строгой эквивалентности с конкретной классической задачей нет.
Эта же редукция оборачивается слабостью при атаке с выбором шифртекста: если позволить атакующему дешифровывать произвольные $c$, он сам сможет факторизовать $n$. Поэтому без дополнения с избыточностью и проверкой схема Рабина небезопасна против CCA.
Где схема применяется
В чистом виде криптосистема Рабина в продакшене встречается редко: четыре корня и уязвимость к атаке с выбором шифртекста делают её неудобной без аккуратной обвязки. Зато её идея - основа целого семейства. На квадратичных вычетах построена вероятностная криптосистема Гольдвассер-Микали, схема подписи Рабина-Уильямса, а также ряд протоколов с доказуемой стойкостью. В учебных курсах схема Рабина незаменима: на ней удобно показать, как из элементарной операции (квадрат по модулю) вырастает система с формальной редукцией к факторизации. Это делает её любимым примером в разделах теории чисел и криптографии.
Частые ошибки
- Считать, что у корня всегда два значения. По простому модулю - да, два. По составному модулю их четыре, и игнорирование этого ломает дешифрование.
- Путать открытый и секретный ключ. Открытый ключ - это только , без и . Никакой публичной экспоненты, как в RSA, здесь нет.
- Брать произвольные простые. Без условия простая формула корня через возведение в степень не работает - придётся применять Тонелли-Шенкса.
- Шифровать без избыточности. Без метки в тексте получатель не отличит настоящее сообщение от трёх посторонних корней и не сможет однозначно расшифровать.
- Считать схему стойкой к любым атакам. Базовая схема Рабина уязвима к атаке с выбором шифртекста - именно та редукция, что даёт стойкость, против активного атакующего работает во вред.
FAQ
Чем схема Рабина отличается от RSA? В RSA шифрование - это возведение в публичную экспоненту , а дешифрование - в секретную ; стойкость связана с факторизацией лишь косвенно. В схеме Рабина показатель всегда равен 2, публичной экспоненты нет, а взлом доказуемо эквивалентен факторизации. Платой за это становится неоднозначность из четырёх корней при дешифровании.
Почему важно условие ? При нём квадратный корень по модулю простого вычисляется одной формулой . Без этого условия извлечение корня требует более сложного алгоритма Тонелли-Шенкса. Простые такого вида называют простыми Блюма, а их произведение - числом Блюма.
Как получатель понимает, какой из четырёх корней правильный? В сообщение заранее встраивают избыточность - фиксированный паттерн или дублированные биты. После дешифрования проверяют все четыре корня и оставляют тот, где метка совпала. Реже используют ограничение по символу Якоби и величине корня, выделяющее ровно один вариант.
Коротко
Схема Рабина - асимметричная криптосистема, где шифрование сводится к возведению в квадрат по составному модулю , а дешифрование - к извлечению квадратного корня, доступному только владельцу простых множителей. Из-за составного модуля корней получается четыре, и нужный выбирают по встроенной в текст избыточности. Главное достоинство - доказуемая эквивалентность взлома и факторизации: умеющий дешифровать умеет и раскладывать . Это же свойство делает базовую схему уязвимой к атаке с выбором шифртекста, поэтому на практике её применяют только с дополнением и проверкой.
Читайте также

Алгоритм Полига-Хеллмана: дискретный логарифм по частям
Как алгоритм Полига-Хеллмана решает задачу дискретного логарифма, когда порядок группы раскладывается на малые простые: разбиение по китайской теореме об остатках, шаги и сложность.

Алгоритм Шора: зачем он ломает RSA и как работает
Разбираем, как алгоритм Шора сводит факторизацию к поиску периода и за счет квантового преобразования Фурье находит делители быстро, угрожая стойкости RSA.

Квадратичный закон взаимности: золотая теорема Гаусса
Квадратичный закон взаимности Гаусса для символов Лежандра: точная формулировка, два дополнения, восемь доказательств, обобщения Якоби, Эйзенштейна и Артина, алгоритм вычисления.