Русская Википедия:EPOC (схема шифрования)

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

EPOC (Шаблон:Lang-en; эффективное вероятностное шифрование с открытым ключом) — это вероятностная схема шифрования с открытым ключом.

EPOC был разработан в ноябре 1998 г. Т. Окамото (англ. T. Okamoto), С. Учияма (англ. S. Uchiyama) и Э. Фудзисаки (англ. E. Fujisaki) из NTT Laboratories в Японии. Он основан на модели случайного оракула, в которой функция шифрования с открытым ключом преобразуется в безопасную схему шифрования с использованием (действительно) случайной хеш-функции; результирующая схема разработана так, чтобы быть семантически защищённой от атак на основе подобранного шифротекстаШаблон:Sfn.

Виды схем

Функция шифрования EPOC — это функция OU (англ. Okamoto-Uchiyama), которую инвертировать так же сложно, как факторизировать составной целочисленный открытый ключ. Существует три версии EPOCШаблон:Sfn:

СвойстваШаблон:SfnШаблон:Sfn

EPOC обладает следующими свойствами:

  1. EPOC-1 семантически безопасен, устойчив к атакам на основе подобранного шифротекста (IND-CCA2 или NM-CCA2) в модели случайного оракулаШаблон:Sfn в предположении p-подгруппы, которое вычислительно сопоставимо с предположениями квадратичного вычета и вычетов более высокой степени.
  2. EPOC-2 с одноразовым блокнотом семантически безопасен, устойчив к атакам на основе подобранного шифротекста (IND-CCA2 или NM-CCA2) в модели случайного оракула в предположении факторизации.
  3. EPOC-2 с симметричным шифрованием семантически безопасен, устойчив к атакам на основе подобранного шифротекста (IND-CCA2 или NM-CCA2) в модели случайного оракула в рамках предположения факторизации, если базовое симметричное шифрование является безопасным против пассивных атак (атак вида, когда криптоаналитик имеет возможность только видеть предаваемые шифротексты и генерировать собственные, используя открытый ключ.).

Предыстория

Диффи и Хеллман предложили концепцию криптосистемы с открытым ключом (или односторонней функции) в 1976 году. Хотя многое криптографы и математики провели обширные исследования, чтобы реализовать концепцию криптосистем с открытым ключом в течение более чем 20 лет, было найдено очень мало конкретных методов, которые являются безопаснымиШаблон:Sfn.

Типичным классом методов является RSA-Rabin, представляющий собой комбинацию полиномиального алгоритма нахождения корня многочлена в кольце вычетов по модулю составного числаконечном поле)и неразрешимой задачи факторизации(по вычислительной сложности). Другим типичным классом методов является метод Диффи-Хеллмана, Эль-Гамаля, который представляет собой комбинацию коммутативного свойства логарифма в конечной Абелевой группе и неразрешимой задачи дискретного логарифмаШаблон:Sfn.

Среди методов RSA-Rabin и Diffie-Hellman-ElGamal для реализации односторонней функции ни одна функция, кроме функции Рабина и её вариантов, таких как её версии эллиптической кривой и Уильямса, не была доказана такой же надёжной, как примитивные задачиШаблон:Sfn(например, задачи факторизации и дискретного логарифма).

Окамото и Учияма, предложили одностороннюю функцию, названную OU (англ. Okamoto-Uchiyama), которая практична, доказуемо безопасна и обладает некоторыми другими интересными свойствамиШаблон:Sfn.

Свойства функции OUШаблон:Sfn

  1. Вероятностная функция: это односторонняя, вероятностная функция. Пусть <math>E (m, r)</math> — зашифрованный текст открытого текста <math>m</math> со случайным <math>r</math>.
  2. Односторонность функции: Доказано, что инвертирование функции так же трудно, как факторизация <math>n := p^2q</math>.
  3. Семантическая стойкость: Функция семантически безопасна, если верно следующее предположение (предположение p-подгруппы): <math>E(0, r) = h^r\text{ mod } n</math> и <math>E (1, r') = gh^{r'}\text{ mod }n</math> вычислительно неразличимы, где <math>r</math> и <math>r'</math> равномерно и независимо выбраны из <math> \mathbf{Z}/n\mathbf{Z}</math>. Это предположение о неразличимости шифротекста для атак на основе подобранного открытого текста вычислительно сравнимо с поиском квадратичного вычета и вычета более высокой степени.
  4. Эффективность: В среде использования криптосистем с открытым ключом, где криптосистема с открытым ключом используется только для распространения секретного ключа(например, длиной 112 и 128 бит) криптосистемы с секретным ключом(например, Triple DES и IDEA), скорость шифрования и дешифрования функции OU сравнима (в несколько раз медленнее) со скоростью криптосистем с эллиптической кривой.
  5. Свойство гомоморфного шифрования: Функция обладает свойством гомоморфного шифрования: <math>E(m_0,r_0)E(m_1,r_1)\text{ mod }n=E(m_0+m_1,r_3),\text{ if }m_0+m_1<p</math>(Такое свойство используется для электронного голосования и других криптографических протоколов).
  6. Неразличимость шифротекста: Даже тот, кто не знает секретного ключа, может изменить зашифрованный текст, <math>C = E(m, r)</math>, на другой зашифрованный текст, <math>C' = Ch^{r'} \text{ mod } n</math>, сохраняя при этом открытый текст m (то есть <math>C' = E(m, r)</math>), и связь между <math>C</math> и <math>C'</math> может быть скрыта (то есть <math>(C, C')</math> и <math>(C, E(m', t)</math> неразличимы). Такое свойство полезно для протоколов защиты конфиденциальности).

Доказательство безопасности схемы шифрования

Одним из важнейших свойств шифрования с открытым ключом является доказуемая безопасность. Самое сильное понятие безопасности в шифровании с открытым ключом — это понятие семантической защиты от атак на основе подобранного шифротекста.

Доказано, что семантическая защита от атак на основе адаптивно подобранного шифротекста (IND-CCA2) эквивалентна (или достаточна) самому сильному понятию безопасности (NM-CCA2)Шаблон:SfnШаблон:Sfn.

Фудзисаки и Окамото реализовали две общие и эффективные меры для преобразования вероятностной односторонней функции в защищённую схему IND-CCA2 в модели случайного оракулаШаблон:Sfn. Одна из них — это преобразование семантически безопасной (IND-CPA) односторонней функции в защищённую схему IND-CCA2. Другая, от односторонней функции (OW-CPA) и шифрования с симметричным ключом (включая одноразовый блокнот) до защищённой схемы IND-CCA2. Последнее преобразование может гарантировать полную безопасность системы шифрования с открытым ключом в сочетании со схемой шифрования с симметричным ключомШаблон:Sfn.

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

Обзор

Схема шифрования с открытым ключом EPOC, которая задаётся триплетом <math>(\mathcal{G}, \mathcal{E}, \mathcal{D})</math>, где <math>\mathcal{G}</math>-операция генерации ключа, <math>\mathcal{E}</math>-операция шифрования и <math>\mathcal{D}</math>-операция дешифрования.

Схемы EPOC: EPOC-1 и EPOC-2.

EPOC-1 предназначен для распределения ключей, а EPOC-2 предназначен для распределения ключей и передачи зашифрованных данных, а также распределения более длинного ключа при ограниченном размере открытого ключа.

Типы ключей

Существует два типа ключей: открытый ключ OU и закрытый ключ OU, оба из которых используются в криптографических схемах шифрования EPOC-1, EPOC-2Шаблон:Sfn.

OU открытый ключШаблон:Sfn

Открытый ключ OU — это набор <math>(n, g, h, pLen)</math>, компоненты которого имеют следующие значения:

  • <math>n</math> — неотрицательное целое число
  • <math>g</math> — неотрицательное целое число
  • <math>h</math> — неотрицательное целое число
  • <math>pLen</math> — секретный параметр, неотрицательное целое число

На практике в открытом ключе OU модуль <math>n</math> принимает вид <math>n := p^2q</math>, где <math>p</math> и <math>q</math> — два различных нечётных простых числа, а битовая длина <math>p</math> и <math>q</math> равна <math>pLen</math>. <math>g</math>-элемент в <math>(\mathbf{Z}/n\mathbf{Z})^*</math> такой, что порядок <math>g_p</math> в <math>(\mathbf{Z}/p^2\mathbf{Z})^*</math> равен <math>p</math>, где <math>g_p :=g^{p-1}\text{ mod }p^2</math>. <math>h</math>-элемент в <math>(\mathbf{Z}/n\mathbf{Z})^*</math>.

OU закрытый ключШаблон:Sfn

Закрытый ключ OU — это набор <math>(p, g, pLen, w)</math>, компоненты которого имеют следующие значения:

  • <math>p</math> — первый фактор, неотрицательное целое число
  • <math>h</math> — второй фактор, неотрицательное целое число
  • <math>pLen</math> — секретный параметр, неотрицательное целое число
  • <math>w</math> — значение <math>L (g_p)</math>, где <math>L (x) =\frac{x-1}p</math>, неотрицательное целое число

EPOC-1Шаблон:Sfn

Создание Ключа: G

Ввод и вывод <math>\mathcal{G}</math> следующие:

[Входные данные]: Секретный параметр <math>k</math>(<math>= pLen</math>) — положительное целое число.

[Выходные данные]: Пара открытого ключа <math>(n, g, h, H, pLen, mLen, hLen, rLen)</math> и секретного ключа <math>(p, g_p)</math>.

Операция <math>\mathcal{G}</math> со входом <math>k</math> выглядит следующим образом:

  • Выберем два простых числа <math>p</math>, <math>q</math> (<math>|p| = |q| = k</math>) и вычислим <math>n := p^2q</math>. Здесь <math>p-1 = p'u</math> и <math>q-1 = q'v</math> такое, что <math>p'</math> и <math>q'</math> — простые числа, а <math>|u|</math> и <math>|v|</math> такие, что <math>O (\log k)</math>.
  • Выберем <math>g \in (\mathbf{Z}/n\mathbf{Z})^*</math> случайным образом так, чтобы порядок <math>g_p:=g^{p-1}\text{ mod } p^2</math> был равен <math>p</math> (Заметим, что НОД(<math>p</math>, <math>q-1</math>)<math>=1</math> и НОД(<math>q</math>, <math>p-1</math>)<math>=1</math>).
  • Выберем <math>h_0</math> из <math>(\mathbf{Z}/n\mathbf{Z})^*</math> случайным образом и независимо от <math>g</math>. Вычислим <math>h := h_n^0 \text{ mod } n</math>.
  • Установить <math>pLen:=k</math>. Установите <math>mLen</math> и <math>rLen</math> такими, что <math>mLen+rLen\leq pLen-1</math>.

Примечание: <math>g_p</math> является дополнительным параметром, повышающим эффективность дешифрования, и может быть вычислен из <math>p</math> и <math>g</math>. <math>h=g^n\text{ mod }n</math>, когда <math>hLen = (2 + c_0)k</math> (<math>c_0</math>-константа <math>> 0</math>). <math>H</math> может быть зафиксирован системой и совместно использован многими пользователями.

Шифрование: E

Ввод и вывод <math>\mathcal{E}</math> следующие:

[Входные данные]: Открытый текст <math>M\in \{0, 1\}^{mLen}</math> вместе с открытым ключом <math>(n, g, h, H, pLen, mLen, hLen, rLen)</math>.

[Выходные данные]: Шифротекст С.

Операция <math>\mathcal{E}</math> со входами <math>M</math>, <math>(n, g, h, H, mLen, rLen)</math> выглядит следующим образом:

  • Выберем <math>R \in \{0, 1\}^{rLen}</math> и вычислим <math>r: = H (M\parallel R)</math>. Здесь <math>M \parallel R</math> обозначает конкатенацию <math>M</math> и <math>R</math>.
  • Вычислить <math>C</math>:

<math>C := g^{(M\parallel R)}h^r\text{ mod }n.</math>

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

Ввод и вывод <math>\mathcal{D}</math> следующие:

[Входные данные]: Шифротекст <math>C</math> наряду с открытым ключом <math>(n, g,h,H,pLen,mLen, hLen)</math> и секретным ключом <math>(p, g_p)</math>.

[Выходные данные]: Открытый текст <math>M</math> или нулевая строка.

Операция <math>\mathcal{D}</math> со входами <math>C</math>, <math>(n, g, h, H, pLen, mLen, hLen)</math> и <math>(p, g_p)</math> выглядит следующим образом:

  • Вычислим <math>C_p:=C^{p-1}\text{ mod }p^2</math>, а <math>X:=\frac{L(C_p)}{L(g_p)}\text{ mod }p</math>, где <math>L(x):=\frac{x-1}p</math>.
  • Проверим, верно ли следующее уравнение: <math>C = g^Xh^{H(X)}\text{ mod }n</math>.
  • Если выражение верно, то выведем <math>[X]^{mLen}</math> как расшифрованный открытый текст, где <math>[X]^{mLen}</math> обозначает наиболее значимые <math>mLen</math> биты в <math>X</math>. В противном случае выведем нулевую строку.

EPOC-2Шаблон:SfnШаблон:Sfn

Создание Ключа: G

Ввод и вывод <math>\mathcal{G}</math> следующие:

[Входные данные]: Секретный параметр <math>k</math>(<math>= pLen</math>).

[Выходные данные]: Пара открытого ключа <math>(n, g, h, H, G, pLen, hLen, gLen, rLen)</math> и секретного ключа <math>(p, g_p)</math>.

Операция <math>\mathcal{G}</math> со входом <math>k</math> выглядит следующим образом:

  • Выберем два простых числа <math>p</math>, <math>q</math> (<math>|p| = |q| = k</math>) и вычислим <math>n := p^2q</math>. Здесь <math>p-1 = p'u</math> и <math>q-1 = q'v</math> такое, что <math>p'</math> и <math>q'</math> — простые числа, а <math>|u|</math> и <math>|v|</math> такие, что <math>O (\log k)</math>.
  • Выберем <math>h_0</math> из <math>(\mathbf{Z}/n\mathbf{Z})^*</math> случайным образом и независимо от <math>g</math>. Вычислим <math>h := h_n^0 \text{ mod } n</math>.
  • Установить <math>pLen:=k</math>. Установите <math>mLen</math> и <math>rLen</math> такими, что <math>mLen+rLen\leq pLen-1</math>.
  • Выберем хеш-функции <math>H:\{0,1\}^*\rightarrow\{0,1\}^{hLen}</math> и <math>G:{0,1}^*\rightarrow\{0,1\}^{hLen}</math>.

Примечание: <math>g_p</math> является дополнительным параметром, повышающим эффективность дешифрования, и может быть вычислено из <math>p</math> и <math>g</math>. <math>h=g^n\text{ mod }n</math>, когда <math>hLen = (2 + c_0)k</math> (<math>c_0</math>-константа <math>> 0</math>). <math>H</math> и <math>G</math> могут быть зафиксированы системой и совместно использованы многими пользователями.

Шифрование: E

Пусть <math>SymE = (SymEnc, SymDec)</math> — пара алгоритмов шифрования и дешифрования с симметричным ключом <math>K</math>, где длина <math>K</math> равна <math>gLen</math>. Алгоритм шифрования <math>SymEnc</math> принимает ключ <math>K</math> и открытый текст <math>X</math> и возвращает зашифрованный текст <math>SymEnc(K,X)</math>. Алгоритм расшифровки <math>SymDec</math> принимает ключ <math>K</math> и зашифрованный текст <math>Y</math> и возвращает открытый текст <math>SymDec(K, Y )</math>.

Ввод и вывод <math>\mathcal{E}</math> следующие:

[Входные данные]: Открытый текст <math>M \in \{0, 1\}^{mLen}</math> вместе с открытым ключом <math>(n, g, h, H, G, pLen, hLen, gLen, rLen)</math> и <math>SymEnc</math>.

[Выходные данные]: Зашифрованный текст <math>C = (C_1, C_2)</math>.

Операция <math>\mathcal{E}</math> со входами <math>M</math>, <math>(n, g, h, H, G, pLen, hLen, gLen, rLen)</math> и <math>SymEnc</math> выглядит следующим образом:

  • Выберем <math>r \in \{0, 1\}^{rLen}</math> и вычислим <math>G (R)</math>.
  • Вычислим <math>H (M\parallel R)</math>. Здесь <math>M \parallel R</math> обозначает конкатенацию <math>M</math> и <math>R</math>.
  • <math>C_1:=g^Rh^{H(M \parallel R)}\text{ mod }n</math>; <math>C_2:=SymEnc(G(R),M)</math>

Примечание: типичный способ реализации <math>SymE</math> — это одноразовый блокнот. То есть, <math>SymEnc(K, X) := K\oplus X</math>, и <math>SymDec(X, Y) := X\oplus Y</math> , где <math>\oplus</math> обозначает операцию побитового исключающего ИЛИ.

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

Ввод и вывод <math>\mathcal{D}</math> следующие:

[Входные данные]: Шифротекст <math>C=(C_1,C_2)</math> наряду с открытым ключом <math>(n, g,h,H, G,pLen,hLen, gLen, rLen)</math>, секретным ключом <math>(p, g_p)</math> и <math>SymDec</math>.

[Выходные данные]: Открытый текст <math>M</math> или нулевая строка.

Операция <math>\mathcal{D}</math> со входами <math>C=(C_1,C_2)</math>, <math>(n, g,h,H, G,pLen,hLen, gLen)</math>, <math>(p, g_p)</math> и <math>SymDec</math> выглядит следующим образом:

  • Вычислим <math>C_p:=C^{p-1}\text{ mod }p^2</math>, а <math>R':=\frac{L(C_p)}{L(g_p)}\text{ mod }p</math>, где <math>L(x):=\frac{x-1}p</math>.
  • Вычислим <math>M':= SymDec(G(R'),C_2).</math>
  • Проверим, верно ли следующее уравнение: <math>C = g^{R'}h^{H(M'\parallel R')}\text{ mod }n</math>.
  • Если выражение верно, то выведем <math>M'</math> как расшифрованный открытый текст. В противном случае выведем нулевую строку.

Примечания

Шаблон:Примечания

Литература