Криптосистема Крамера – Шоупа

Эта статья находится на начальном уровне проработки, в одной из её версий выборочно используется текст из источника, распространяемого под свободной лицензией
Материал из энциклопедии Руниверсалис

Криптосистема Крамера–Шоупа (англ. Cramer–Shoup system) — алгоритм шифрования с открытым ключом. Первый алгоритм, доказавший свою устойчивость к атакам на основе адаптивно подобранного шифротекста . Разработан Рональдом Крамером и Виктором Шоупом в 1998 году. Безопасность алгоритма основана предположении Диффи–Хеллмана о различении. Является расширением схемы Эль-Гамаля, но в отличие от схемы Эль-Гамаля данный алгоритм неподатлив[англ.] (взломщик не может подменить шифротекст на другой шифротекст, который бы расшифровывался в текст, связанный с исходным, т.е. являющийся некоторой функцией от него). Эта устойчивость достигается за счет использования универсальной однонаправленной хеш-функции и дополнительных вычислений, что приводит к получению зашифрованного текста, который в два раза больше, чем в схеме Эль-Гамаля.

Атака на основе подобранного шифротекста

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

Было хорошо известно, что многие широко используемые криптосистемы были уязвимы для такой атаки, и в течение многих лет считалось, что атака нецелесообразна и представляет лишь теоретический интерес. Все начало меняться в конце 1990-х годов, особенно когда Даниэль Блайхенбахер продемонстрировал на практике атаку на основе подобранного шифротекста на серверы SSL с использованием формы шифрования RSA.

Неадаптивная атака

При неадаптивной атаке криптоаналитик не использует результаты предыдущих расшифровок, то есть шифротексты подбираются заранее. Такие атаки называют атаками в обеденное время (lunchtime или CCA1).

Адаптивная атака

В случае адаптивной атаки криптоаналитик адаптивно подбирает шифротекст, который зависит от результатов предыдущих расшифровок (CCA2).

Устойчивость к адаптивной атаке можно расммотреть на примере игры:

  • Запускается алгоритм генерации ключа в схеме шифрования с соответствующей длиной ключа, подаваемой на вход.
  • Противник выполняет серию произвольных запросов к оракулу дешифрования, таким образом дешифровывая шифротексты по его выбору.
  • Противник выбирает два сообщения [math]\displaystyle{ {m}_{0}, {m}_{1} }[/math] и отправляет их к оракулу шифрования.
  • Оракул шифрования случайно выбирает бит [math]\displaystyle{ b \in{0, 1} }[/math], затем шифрует [math]\displaystyle{ {m}_{b} }[/math], который передается противнику (подбрасывание монетки для выбора бита [math]\displaystyle{ b }[/math] скрыто от противника).
  • Противник снова выполняет серию произвольных запросов к оракулу дешифрования с одним лишь ограничением, что запрос должен отличаться от сообщения, полученного им от оракула шифрования.
  • Противник выдает бит [math]\displaystyle{ {b}_{1} \in {0, 1} }[/math] - предполагаемое значение бита [math]\displaystyle{ b }[/math], выбранного оракулом шифрования на шаге 4. Если [math]\displaystyle{ {P}_{r}({b}_{1} = b) \leq 1/2 + E }[/math], то превосходство противника считается равным [math]\displaystyle{ E }[/math].

Задача Диффи-Хеллмана о различении

Существует несколько эквивалентных формулировок задачи Диффи-Хеллмана о различении. Та, которую мы будем использовать, выглядит следующим образом.

Пусть [math]\displaystyle{ G }[/math]— группа порядка [math]\displaystyle{ q }[/math], где [math]\displaystyle{ q }[/math] — большое простое число. Также [math]\displaystyle{ {Z}_{q} }[/math] — [math]\displaystyle{ \{0,1,\dots,q-1\} }[/math]. И имеется два распределения:

  • Распределение [math]\displaystyle{ R }[/math] случайных четверок [math]\displaystyle{ ({g}_{1}, {g}_{2}, {u}_{1}, {u}_{2})\in G^4 }[/math].
  • Распределение [math]\displaystyle{ D }[/math] четверок [math]\displaystyle{ ({g}_{1}, {g}_{2}, {u}_{1}, {u}_{2}) \in G^4 }[/math] , где [math]\displaystyle{ {g}_{1}, {g}_{2} }[/math] - случайны, а [math]\displaystyle{ {u}_{1} = {g}_{1}^{r}, {u}_{2} = {g}_{2}^{r} }[/math] для случайного [math]\displaystyle{ r \in {Z}_{q} }[/math].

Алгоритмом, который решает задачу Диффи-Хеллмана, называется такой вероятностный алгоритм [math]\displaystyle{ A }[/math], который может эффективно различить перечисленные два распределения. То есть алгоритм, принимающий на вход одно из двух рапределений, должен выдать 0 или 1, а также [math]\displaystyle{ P (A(x) = 1|x \in R) - P (A(x) = 1|x \in D) }[/math] стремится к 0.

Задача Диффи-Хеллмана о различении трудна, если такого полиномиального вероятностного алгоритма не существует.

Базовая схема

Пусть у нас есть группа [math]\displaystyle{ G }[/math] порядка [math]\displaystyle{ q }[/math], где [math]\displaystyle{ q }[/math] — большое простое число. Сообщения — это элементы [math]\displaystyle{ \in G }[/math]. Также мы используем универсальное семейство односторонних хеш-функций, которое отображает длинные битовые строчки в элементы [math]\displaystyle{ {Z}_{q} }[/math], где [math]\displaystyle{ {Z}_{q} }[/math] — [math]\displaystyle{ \{0,1,\dots,q-1\} }[/math].

Генерация ключа

Алгоритм генерации ключей работает следующим образом:

  • Алиса генерирует случайные [math]\displaystyle{ g_1, g_2 \in G }[/math] и случайные элементы [math]\displaystyle{ ({x}_{1}, {x}_{2}, {y}_{1}, {y}_{2}, z) \in {Z}_{q} }[/math]
  • Алиса вычисляет [math]\displaystyle{ c = {g}_{1}^{x_1} g_{2}^{x_2}, d = {g}_{1}^{y_1} g_{2}^{y_2}, h = {g}_{1}^{z} }[/math].
  • Выбирается хеш-функция [math]\displaystyle{ H }[/math] из универсального семейства односторонних хеш-функций. Публичный ключ - [math]\displaystyle{ ({g}_{1}, {g}_{2}, {c}, {d}, {h}, {H}) }[/math], скрытый ключ - [math]\displaystyle{ ({x}_{1}, {x}_{2}, {y}_{1}, {y}_{2}, z) }[/math] .

Шифрование

Дано сообщение [math]\displaystyle{ m \in G }[/math]. Алгоритм шифрования работает следующим образом

  • Боб случайно выбирает [math]\displaystyle{ {k} \in {Z}_{q} }[/math].
  • Боб вычисляет следующие значения:
    • [math]\displaystyle{ u_1 = {g}_{1}^{k}, u_2 = {g}_{2}^{k} }[/math];
    • [math]\displaystyle{ e = h^k m }[/math];
    • [math]\displaystyle{ \alpha = H(u_1, u_2, e) }[/math], где [math]\displaystyle{ H() }[/math] - это универсальная односторонняя хеш-функция;
    • [math]\displaystyle{ v = c^k d^{k\alpha} }[/math];
  • Боб отправляет зашифрованный текст [math]\displaystyle{ (u_1, u_2, e, v) }[/math] Алисе.

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

Получив зашифрованный текст [math]\displaystyle{ (u_1, u_2, e, v) }[/math] и используя закрытый ключ [math]\displaystyle{ (x_1, x_2, y_1, y_2, z) }[/math]:

  • Алиса вычисляет [math]\displaystyle{ \alpha = H(u_1, u_2, e) \, }[/math].
  • Алиса проверяет условие [math]\displaystyle{ {u_1}^{x_1} {u_2}^{x_2} {u_1}^{{y_1}\alpha} u_{2}^{{y_2}\alpha} = v }[/math]. Если условие не выполняется, то протокол завершается с отказом дешифрования. Иначе выводится сообщение [math]\displaystyle{ m = e / {u}_{1}^{z} }[/math].

Корректность протокола

Проверим корректность шифровальной схемы (расшифровка зашифрованного сообщения выдает это самое сообщение). Учитывая, что [math]\displaystyle{ {u}_{1} = {g}_{1}^{r} }[/math] и [math]\displaystyle{ {u}_{2} = {g}_{2}^{r} }[/math], имеем [math]\displaystyle{ {u}_{1}^{x_1} u_{2}^{x_2} = {g}_{1}^{{x}_{1}{r}}{g}_{2}^{{x}_{2}{r}} = {c}^{r} }[/math]. Также [math]\displaystyle{ {u}_{1}^{y_1} {u}_{2}^{y_2} = {d}^{r} }[/math] и [math]\displaystyle{ {u}_{1}^{z} = {h}^{z} }[/math]. Поэтому проверка дешифрования проходит успешно и выводится исходное сообщение [math]\displaystyle{ m = e /{u}_{1}^{z} }[/math].

Упрощенная схема

Отличия от базовой схемы

Для достижения безопасности к неадаптивным атакам (и только им) можно значительно упростить протокол, не использовав [math]\displaystyle{ d, {y_1}, {y_2}, H() }[/math]. При шифровании мы используем [math]\displaystyle{ v = {c}^{k} }[/math], а при дешифровании проверяем, что [math]\displaystyle{ v = {u_1}^{x_1}{u_2}^{x_2} }[/math].

Пример упрощенной схемы

Пусть у нас есть группа [math]\displaystyle{ G }[/math] порядка [math]\displaystyle{ q = 13 }[/math]. Соответственно [math]\displaystyle{ {Z}_{13} }[/math] — [math]\displaystyle{ \{0,1,\dots,12\} }[/math].

Генерация ключа

Алгоритм генерации ключей работает следующим образом:

  • Алиса генерирует случайные [math]\displaystyle{ g_1 = 5, g_2 = 7 \in G }[/math] и случайные элементы [math]\displaystyle{ ({x}_{1} = 8, {x}_{2} = 4, z = 9) \in {Z}_{q} }[/math]
  • Алиса вычисляет [math]\displaystyle{ c = 5^8 * 7^4, h = 5^9 }[/math].
  • Публичный ключ - [math]\displaystyle{ ({g}_{1}, {g}_{2}, {c}, {h}) = (5, 7, 5^8 * 7^4, 5^9) }[/math] , скрытый ключ - [math]\displaystyle{ ({x}_{1}, {x}_{2}, z) = (8, 4, 9) }[/math].

Шифрование

Дано сообщение [math]\displaystyle{ 3 \in G }[/math]. Алгоритм шифрования работает следующим образом

  • Боб случайно выбирает [math]\displaystyle{ {5} \in {Z}_{q} }[/math].
  • Боб вычисляет следующие значения:
    • [math]\displaystyle{ u_1 = 5^5, u_2 = 7^5 }[/math];
    • [math]\displaystyle{ e = (5^9)^5 * 3 }[/math];
    • [math]\displaystyle{ v = (5^8 * 7^4)^5 }[/math];
  • Боб отправляет зашифрованный текст [math]\displaystyle{ (u_1, u_2, e, v) = (5^5, 7^5, (5^9)^5 * 3,(5^8 * 7^4)^5 }[/math] Алисе.

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

Получив зашифрованный текст [math]\displaystyle{ (5^5, 7^5, (5^9)^5 * 3, (5^9)^5 * 3) }[/math] и используя закрытый ключ [math]\displaystyle{ (8, 4, 9) }[/math]:

  • Алиса проверяет условие [math]\displaystyle{ (5^5)^8 * (7^5)^4 = (5^5)^8 * (7^5)^4 }[/math].
  • Условие выполняется, поэтому выводится зашифрованное Бобом сообщение [math]\displaystyle{ 3 = ((5^9)^5 * 3) / (5^5)^9 }[/math].

Доказательство безопасности

Теорема

Криптосистема Крамера-Шоупа устойчива к атакам на основе адаптивно подобранного шифротекста при выполнении следующих условий:

  • Хеш-функция [math]\displaystyle{ {H} }[/math] выбирается из универсального семейства односторонних хеш-функций.
  • Задача Диффи-Хеллмана о различении трудна для группы [math]\displaystyle{ {G} }[/math].

Доказательство: чтобы доказать теорему, мы предположим, что существует противник, который может взломать протокол, и покажем, что при выполнении условия на хеш-функцию получается противоречие с условием на задачу Диффи-Хеллмана. На вход нашему вероятностному алгоритму подается [math]\displaystyle{ ({g}_{1}, {g}_{2}, {u}_{1}, {u}_{2}) }[/math] из распределения [math]\displaystyle{ R }[/math] или [math]\displaystyle{ D }[/math]. На поверхностном уровне конструкция будет выглядеть следующим образом: мы построим симулятор, который будет выдавать совместное распределение, состоящее из видения взломщиком криптосистемы после серии атак и скрытого бита b, генерируемого оракулом генерации (не входит в видение взломщика, скрыто от него). Идея доказательства: мы покажем, что если на вход подается распределение из [math]\displaystyle{ D }[/math], то симуляция пройдет успешно, а противник будет иметь нетривиальное превосходство в угадывании случайного бита b. Также мы покажем, что если на вход подается распределение из [math]\displaystyle{ R }[/math], то видение противника не зависит от [math]\displaystyle{ b }[/math]и [math]\displaystyle{ a }[/math], и, значит, превосходство противника будет ничтожно мало (меньше обратного полинома). Отсюда можно построить различитель распределений [math]\displaystyle{ R }[/math] и [math]\displaystyle{ D }[/math]: запускаем симулятор криптосистемы (выводит [math]\displaystyle{ b }[/math]) и взломщика (выводит [math]\displaystyle{ {b}_{1} }[/math]) одновременно и выдаем [math]\displaystyle{ 1 }[/math], если [math]\displaystyle{ b = {b}_{1} }[/math] и [math]\displaystyle{ 0 }[/math]в противном случае.

Построение симулятора

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

  • На вход симулятору поступает [math]\displaystyle{ ({g}_{1}, {g}_{2}, {u}_{1}, {u}_{2}) }[/math].
  • Симулятор использует заданные [math]\displaystyle{ ({g}_{1}, {g}_{2}) }[/math].
  • Симулятор выбирает случайные величины [math]\displaystyle{ ({x}_{1}, {x}_{2}, {y}_{1}, {y}_{2}, {z}_{1}, {z}_{2}) \in {Z}_{q} }[/math].
  • Симулятор вычисляет [math]\displaystyle{ c = {g}_{1}^{{x}_{1}} {g}_{2}^{{x}_{2}}, d = {g}_{1}^{{y}_{1}}{g}_{2}^{{y}_{2}}, h = {g}_{1}^{{z}_{1}}{g}_{2}^{{z}_{2}} }[/math].
  • Симулятор выбирает случайную хеш-функцию [math]\displaystyle{ H }[/math] и выдает публичный ключ [math]\displaystyle{ ({g}_{1}, {g}_{2}, c, d, h, H) }[/math]. Скрытый ключ симулятора: [math]\displaystyle{ ({x}_{1}, {x}_{2}, {y}_{1}, {y}_{2}, {z}_{1}, {z}_{2}) }[/math].

Можно заметить, что генерация ключа симулятора отличается от генерации ключа в протоколе (там [math]\displaystyle{ {z}_{2} = 0 }[/math]).

Симуляция дешифрования. Происходит так же, как и в протоколе, с той разницей, что [math]\displaystyle{ m = e/({u}_{1}^{{z}_{1}}+{u}_{2}^{{z}_{2}}) }[/math]

Симуляция шифрования. Получая на вход [math]\displaystyle{ {m}_{0}, {m}_{1} }[/math], симулятор выбирает случайное значение [math]\displaystyle{ b \in {0, 1} }[/math], вычисляет [math]\displaystyle{ e = {u}_{1}^{{z}_{1}}{u}_{2}^{{z}_{2}}{m}_{b}, \alpha = H({u}_{1},{u}_{2}, e, v), v = {u}_{1}^{{x}_{1}+{y}_{1}\alpha}{u}_{2}^{{x}_{2}+{y}_{2}\alpha} }[/math]и выводит [math]\displaystyle{ ({u}_{1}, {u}_{2} ,v , e) }[/math]. Теперь доказательство теоремы будет следовать из следующих двух лемм.

Леммы

Лемма 1. Если на вход симулятору подается распределение из [math]\displaystyle{ D }[/math], то совместное распределение видения взломщиком криптосистемы и скрытого бита [math]\displaystyle{ b }[/math] статистически неразличимо от настоящей атаки криптосистемы.

Лемма 2. Если на вход симулятору подается распределение из [math]\displaystyle{ R }[/math], то распределение скрытого бита [math]\displaystyle{ b }[/math] не зависит от распределения видения взломщика.

Ссылки