EPOC (схема шифрования)

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

EPOC (англ. Efficient Probabilistic Public Key Encryption; эффективное вероятностное шифрование с открытым ключом) — это вероятностная схема шифрования с открытым ключом.

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

Виды схем

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

  • EPOC-1, использующий одностороннюю функцию(англ. trapdoor function) и случайную функцию (хеш-функцию)[3].;
  • EPOC-2, использующий одностороннюю функцию, две случайные функции (хеш-функции) и шифрование с симметричным ключом (например, одноразовый блокнот и блочные шифры)[4];
  • EPOC-3 использует одностороннюю функцию OU (англ. Okamoto-Uchiyama) и две случайные функции (хеш-функции), а также любую симметричную схему шифрования, такую как одноразовые блокноты (англ. one-time pad) или блочный шифр.

Свойства[1][5]

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

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

Предыстория

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

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

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

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

Свойства функции OU[11]

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

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

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

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

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

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

Обзор

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

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

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

Типы ключей

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

OU открытый ключ[15]

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

  • [math]\displaystyle{ n }[/math] — неотрицательное целое число
  • [math]\displaystyle{ g }[/math] — неотрицательное целое число
  • [math]\displaystyle{ h }[/math] — неотрицательное целое число
  • [math]\displaystyle{ pLen }[/math] — секретный параметр, неотрицательное целое число

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

OU закрытый ключ[15]

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

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

EPOC-1[14]

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

EPOC-2[16][14]

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Примечания

Литература