Русская Википедия:McEliece
McEliece — криптосистема с открытыми ключами на основе теории алгебраического кодирования, разработанная в 1978 году Шаблон:Нп5[1]. Это была первая схема, использующая рандомизацию в процессе шифрования. Алгоритм не получил широко признания в криптографии, но в то же время является кандидатом для постквантовой криптографии, так как устойчив к атаке с использованием Алгоритма Шора[2].
Алгоритм основан на сложности декодирования полных линейных кодов (общая задача декодирования является NP-сложной)[3].
Для описания закрытого ключа выбран код исправляющий ошибки, для которого известен эффективный алгоритм декодирования и который может исправить <math>t</math> ошибок. Алгоритм использует двоичные коды Гоппа, которые легко декодируются благодаря алгоритму Петерсона. Открытый ключ получается при помощи маскировки выбранного кода как полного линейного. Для этого порождающая матрица <math>G</math> сначала умножается справа на матрицу перестановок <math>P</math>, а затем на невырожденную матрицу <math>S</math> слева (см. алгоритм работы).
Существует несколько вариантов криптосистемы, использующих различные типы кодов. Большинство из них оказываются менее защищенными. Отдельного рассмотрения заслуживает вопрос выбора параметров криптосистемы[4].
До сих пор McElice с кодами Гоппы не поддается криптоанализу[5]. Наиболее известные атаки используют алгоритм декодирования множества данныx. Последние работы описывают как атаки на систему, так и её защиту[6]. В других работах показано, что для квантовых вычислений размер ключа должен быть увеличен на четыре порядка из-за усовершенствования декодирования множества данных[2].
Криптосистема имеет несколько преимуществ, например, над RSA. Шифрование и дешифрование проходит быстрее и с ростом длины ключа степень защиты данных растет гораздо быстрее. Долгое время считалось, что McEliece не может быть использована для ЭЦП. Однако оказалось возможным построить схему для ЭЦП на основе криптосистемы Нидеррайтера (модификация МcEliece). Поскольку в зависимости от используемых кодов, эти две криптосистемы выражают одну и ту же кодовую задачу, на сегодняшний день, можно утверждать, что McEliece применим в задачах аутентификации.
Из-за недостатков McEliece используется редко. Одно из исключений — использование McElice для шифрования в Freenet-подобной сети ENTROPY.
Введение в коды Гоппы
Описание
Гоппа полином задается как полином над полем <math>GF(p^m)</math> вида <math>g(x)=g_0+g_1x+g_2x^2+...+g_tx^t=\sum_{i=0}^tg_ix^i </math>, где <math>g_i \in GF(p^m)</math>, а <math>t \in [2,...,(n-1)/d] </math>. Также зададим <math>n</math>-размерное подмножество <math>L</math> над расширением поля <math>GF(p^m)</math>: <math>L = [\alpha_1,...,\alpha_n] \subseteq GF(p^m) </math>, для которого верно <math>g(\alpha_i)\not=0 </math> при любых <math>\alpha_i </math>. Далее, для кодового слова <math>c = [c_0,...c_n] </math> над полем <math>GF(p^m)</math> определяется функция <math>R_c(x) = \sum_{i=1}^n\frac{c_i}{x-\alpha_i} </math>.
Код Гоппы <math>\Gamma = \Gamma(L,g)</math> состоит из всех кодовых слов <math>\mathbf{c} = (c_1,...c_n) </math>, удовлетворяющих <math>R_c(x) \equiv 0 \ (mod \ g(x)) </math>. Это означает, что полином <math>g(x) </math> делит <math>R_c(x) </math>.
Размерность <math>k </math> кода Гоппы <math>\Gamma(L,g)</math> длины <math>n </math> больше или равна <math>n - mt</math>, а минимальное расстояние кода <math>d</math> больше или равно <math>t-1</math>.
Проверочная матрица <math>\Gamma(L,g)</math> имеет следующий вид:
<math>H= \begin{pmatrix} 1/g(\alpha_1) & \cdots & 1/g(\alpha_n) \\ \alpha_1/g(\alpha_1) & \cdots & \alpha_n/g(\alpha_n) \\ \vdots & \ddots & \vdots \\ \alpha_1^{t-1}/g(\alpha_1) & \cdots & \alpha_n^{t-1}/g(\alpha_n) \end{pmatrix}</math>.
Если Гоппа полином представляет из себя неприводимый полином <math>g(x)</math> над полем <math>GF(2^m)</math>, тогда минимальное расстояние <math>d</math> такого кода больше или равно <math>2t+1</math>. В дальнейшем предполагается, что <math>d=2t+1</math>.
В криптологических приложениях используется неприводимый, бинарный код Гоппы с параметрами <math>[n,k.d]=[n,n-mt,2t+1]</math>.
Причины для использования
Существует несколько причин для применения кодов Гоппы в криптосистеме МcEliece. Во-первых, существует несколько быстрых алгоритмов декодирования за полиномиальное время[7]. Во-вторых, любой неприводимый многочлен над полем <math>GF(2^m)</math> подойдет для того, чтобы задать код Гоппы, порождающая матрица кода является почти случайной. Следовательно, коды Гоппы очень легко задать, но, в то же время, сложно распознать. Для фиксированной длины <math>n</math> кодового слова существует множество кодов. Например, для кода длины <math>n=128</math>, способного исправлять до <math>t=10</math> ошибок, существует около <math>10^{15}</math> различных Гоппа кодов. Их количество растет экспоненциально в зависимости от длины слова и степени порождающего полинома.
Алгоритм работы
Шаблон:MainrefMcEliece состоит из трех алгоритмов:
- алгоритма случайной генерации ключа, который дает открытый и секретный ключ;
- алгоритма случайного шифрования;
- детерминированного алгоритма расшифрования.
Текст сообщения представляет из себя вектор длины <math>k</math> над конечным полем <math>GF(q)</math>.
Все пользователи в системе совместно используют параметры безопасности: <math>n,~k,~t</math>.
Генерация ключа
- Алиса выбирает <math>(n,k)</math>-линейный код <math>C</math>, исправляющий <math>t</math> ошибок. Затем для кода <math>C</math> высчитывается <math>k \times n</math> порождающая матрица <math>G</math>.
- Для того, чтобы исходный код было сложно восстановить, Алиса генерирует случайную <math>k \times k</math> невырожденную матрицу <math>S</math>.
- Алиса генерирует случайную <math>n \times n</math> матрицу перестановки <math>P</math>.
- Алиса вычисляет <math>k \times n</math> матрицу <math>{\hat G}=SGP</math>.
- Открытым ключом является пара <math>({\hat G},t)</math>. Закрытым ключом является набор <math>(S,G,P)</math>.
Шифрование сообщения
Пусть Боб хочет передать сообщение <math>m</math> Алисе, чей открытый ключ <math>({\hat G},t)</math>.
- Боб представляет своё сообщение <math>m</math> в виде последовательностей двоичных символов длины <math>k</math>.
- Боб генерирует случайный вектор <math>z</math> длины <math>n </math>, имеющий вес Хемминга <math>t</math>.
- Боб вычисляет шифротекст как <math>c'=m{\hat G}+z</math> и передает его Алисе.
Расшифрование сообщения
После получения сообщения <math>c</math>, Алиса выполняет следующие действия для расшифрования сообщения:
- Алиса вычисляет обратную матрицу <math>P^{-1}</math>;
- Алиса вычисляет <math>{\hat c}=cP^{-1}</math>;
- Алиса использует алгоритм декодирования для кода <math>C</math>, чтобы получить <math>{\hat m}</math> из <math>{\hat c}</math>;
- Алиса вычисляет <math>m={\hat m}S^{-1}</math>.
Корректность алгоритма
Покажем, что выполняется главное свойство криптосистемы[5], то есть, что <math>D_t(E_z(m))=m</math>.
Боб посылает <math>c=m{\hat G}+z=mSGP+z</math>. Алиса вычисляет <math>{\hat c}=cP^{-1}=mSG+zP^{-1}</math>. Поскольку <math>P^{-1}</math> — матрица перестановки, то вес <math>zP^{-1}</math> не более, чем <math>t</math>.
Код Гоппа <math>G</math> исправляет до <math>t</math> ошибок. Расстояние Хемминга <math>d_H(mSG,cP^{-1}) \le t </math>, поэтому Алиса получает верное сообщение <math>{\hat m}=mS</math>. После этого Алиса вычисляет исходное сообщение <math>m={\hat m}S^{-1}=mSS^{-1}</math>.
Пример работы алгоритма
Пусть, используется неприводимый, бинарный код Гоппы c параметрами <math>[12,4,5]</math>, где <math>g(x)=x^2+x+\alpha^3</math> — неприводимый полином степени <math>t=2</math> над полем <math>GF(2^4)</math>, причем <math>\alpha^3=(0,0,0,1)^T \in GF(2^4)</math>.
Алиса случайным образом генерирует порождающую матрицу такого кода
- <math>G=
\begin{pmatrix}
0 & 1 & 1 & 0 & 1 & 0 & 1 & 0 & 0 & 1 & 0 & 0 \\ 0 & 1 & 1 & 1 & 1 & 0 & 0 & 1 & 1 & 0 & 0 & 0 \\ 1 & 1 & 0 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 1 \\ 1 & 1 & 1 & 0 & 1 & 1 & 0 & 1 & 0 & 0 & 1 & 0 \\
\end{pmatrix} </math>,
выбирает матрицу
- <math>S=
\begin{pmatrix} 1 & 0 & 0 & 1 \\ 0 & 1 & 0 & 1 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 1 \end{pmatrix} </math> и матрицу перестановки
- <math>P=
\begin{pmatrix} 1& 0& 0& 0& 0& 0& 0& 0& 0& 0& 0& 0\\ 0& 0& 1& 0& 0& 0& 0& 0& 0& 0& 0& 0\\ 0& 0& 0& 0& 0& 0& 0& 0& 1& 0& 0& 0\\ 0& 0& 0& 0& 0& 1& 0& 0& 0& 0& 0& 0\\ 0& 0& 0& 0& 1& 0& 0& 0& 0& 0& 0& 0\\ 0& 1& 0& 0& 0& 0& 0& 0& 0& 0& 0& 0\\ 0& 0& 0& 1& 0& 0& 0& 0& 0& 0& 0& 0\\ 0& 0& 0& 0& 0& 0& 0& 0& 0& 0& 0& 1\\ 0& 0& 0& 0& 0& 0& 0& 1& 0& 0& 0& 0\\ 0& 0& 0& 0& 0& 0& 0& 0& 0& 1& 0& 0\\ 0& 0& 0& 0& 0& 0& 0& 0& 0& 0& 1& 0\\ 0& 0& 0& 0& 0& 0& 1& 0& 0& 0& 0& 0\\ \end{pmatrix} </math>, Тогда
- <math>{\hat G}=SGP =
\begin{pmatrix} 1 & 1 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 1 & 1 & 1 \\ 1 & 1 & 0 & 0 & 0 & 1 & 0 & 1 & 0 & 0 & 1 & 0 \\ 0 & 0 & 1 & 0 & 1 & 1 & 0 & 1 & 1 & 0 & 0 & 1 \\ 0 & 1 & 0 & 0 & 0 & 1 & 1 & 0 & 1 & 0 & 1 & 1 \end{pmatrix} </math>.
В качестве открытого ключа предоставляется эта матрица и <math>t=2</math>. Если Боб хочет послать сообщение <math>m= (1,0,1,0)</math> Алисе, то он сначала генерирует вектор с весом <math>2</math>, например, <math>z= (1,1,0,0,0,0,0,0,0,0,0,0)</math>.
Вычисляет шифротекст
<math>c'=m{\hat G}+z = (1,1,1,1,1,1,0,1,1,1,1,0)+ (1,1,0,0,0,0,0,0,0,0,0,0)=(0,0,1,1,1,1,0,1,1,1,1,0)</math>
и посылает его Алисе.
После получения сообщения Алиса сначала вычисляет
<math>{\hat c}=c'P^{-1}=m{\hat G}P^{-1}+zP^{-1}=m(SGP)P^{-1} +zP^{-1}=(mS)G+y'= (0,1,1,1,1,0,1,0,1,1,1,0)</math>.
Из-за перестановок ошибки переместились в первый и шестой символы. Алиса, используя быстрый алгоритм декодирования, находит
<math>mSG= (1,1,1,1,1,1,1,0,1,1,1,0)</math>.
Находит <math>mS= (1,1,0,1)</math>.
И, в итоге, Алиса получает <math>m = (1,1,0,1) S^{-1}=(1,0,1,0)</math>.
Размеры ключа
Первоначально были предложены параметры: <math>n=1024,k=524,t=50</math>, в результате размер публичного ключа составлял 524*(1024—524) = 262,000 бит. В недавно проведенном анализе были предложены следующие параметры: <math>n=2048,k=1751,t=27</math> для 80 бит безопасности при использовании обычного алгебраического декодирования, или <math>n=1632,k=1269,t=34</math> при использовании декодировочной таблицы для кода Гоппы. При этом публичный ключ увеличивается до 520,047 и 460,647 бит соответственно. Для устойчивости против квантового компьютера параметры параметры следует увеличить до <math>n=6960,k=5413,t=119</math>, а размер публичного ключа до 8,373,911 бит[1][6].
Атаки
Криптографическая стойкость системы основана на двух сложных вычислительных задачах: исчерпывающего поиска по ключевому пространству и декодирования по максимуму правдоподобия. В литературе описано достаточно большое количество атак на McEliece[8]. Некоторые атаки, называемые структурными атаками, основаны на попытке построить/реконструировать декодер для кода, сгенерированного открытым ключом <math>{\hat G}</math>. Если такая попытка окажется успешной, то закрытый ключ <math>G</math> будет раскрыт, а криптосистема полностью взломана. Код <math>{\hat C}</math>, порожденный матрицей <math>{\hat G}</math> и код <math>C</math>, порожденный матрицей <math>G</math>, принадлежат одному эквивалентному классу. Злоумышленник должен сравнить представителя кода из каждого класса в <math>{\hat C}</math> для того, чтобы определить эквивалентный код. Поскольку эквивалентные классы имеют очень малую мощность, этот процесс выходит за рамки возможностей даже самых мощных компьютеров. Для оригинальных параметров <math>(1024, 524, 50)</math> данная структурная атака требует для изучения более <math>2^{466}</math> кодов[5].
Другие атаки направлены на получения исходного текста сообщения из шифрованного сообщения. Большинство из них основаны на декодировании множества данных (ISDШаблон:Ref-en) или на парадоксе дней рождения[9], их обобщениях и улучшениях. Существуют такие атаки, как, например, итерационное декодирование[3] и статическое декодирование, но они не являются успешными. Атака ISD оказалась наименее сложной. В последние годы было описано несколько алгоритмов и их улучшения. Наиболее важные перечислены в таблице вместе с их двоичным показателем затрат для декодирования <math>(1024, 524, 50)</math> кода Гоппы. Для этих алгоритмов известны их предельные показатели[10].
Год | Алгоритм | Сложность (<math>log_2</math>) |
---|---|---|
1986 | Адамс-Мейер | 80,7 |
1988 | Ли-Брикелл | 70,89 |
1989 | Штерн | 66,21 |
1994 | Кантеаут-Шабанн | 65,5 |
1998 | Кантеаут-Шабант | 64,1 |
2008 | Бернштейн-Ланг-Петерс | 60,4 |
2009 | Финиаз-Сендреир | 59,9 |
Описание алгоритма атаки Штерна
Пусть <math>C</math> — это код длины <math>n</math> над полем <math>GF(2)</math>, а <math>n</math>-мерный вектор <math>y</math> имеет расстояние <math>\omega</math> от кодового слова <math>c \in C</math>, тогда <math>y-c</math> — это элемент <math>C</math> с расстоянием <math>\omega</math> от <math>y</math>. И обратное, если <math>C</math> — это код длины <math>n</math> над полем <math>GF(2)</math> с минимальным расстоянием меньше <math>\omega</math>, тогда элемент <math>e \in C+[0,y]</math> веса <math>\omega</math> не может быть в <math>C</math>, он должен быть в <math>C+[y]</math>. Или иначе, <math>y-e</math> — элемент <math>C</math> с расстоянием <math>\omega</math> от <math>y</math>.
Шифротекст криптосистемы McEliece <math>y</math> имеет расстояние <math>t</math> от уникального ближайшего кодового слова <math>c </math> кода <math>C</math>, который имеет расстояние как минимум <math>2t+1</math>. Атакующий знает порождающую матрицу кода <math>C</math> и может легко добавить <math>y</math> для образования порождающей матрицы для <math>C+[0,y]</math>. Единственное кодовое слово веса <math>t</math> в <math>C+[0,y]</math> — это <math>y-c</math>. Найдя это кодовое слово, атакующий находит <math>c</math> и легко получает искомый текст. Стоит учесть, что декодирование дает незначительное упрощение:
если <math>C</math> имеет размерность <math>k</math>, то <math>C+[0,y]</math> имеет размерность <math>k+1</math>. Алгоритм Штерна позволяет найти кодовое слово наименьшего веса.
Поиск кодового слова наименьшего веса
На вход алгоритма поступает число <math>\omega>0</math> и проверочная матрица <math>H</math> размера <math>(n-k) \times n</math> для <math>(n,k)</math> кода над полем <math>\mathbb{F}_{2}</math>. С помощью методов линейной алгебры всегда можно получить из порождающей матрицы проверочную.
Случайным образом выбирается <math>n-k</math> из <math>n</math> столбцов матрицы <math>H</math>. Затем случайным образом выбирается <math>l</math>-размерное подпространство <math>Z</math>, которое разделяет оставшиеся <math>k</math> на два подмножества <math>X</math> и <math>Y</math>. Для кодового слова имеющего ровно <math>p</math> не нулевых бит в <math>X</math>, ровно <math>p</math> не нулевых бит в <math>Y</math>, <math>0</math> не нулевых бит в <math>Z</math> и ровно <math>\omega-2p</math> не нулевых бит в других столбцах.
Поиск состоит из трех шагов. На первом шаге применяя простейшие операции к <math>H</math> получаем из выбранных <math>n-k</math> столбцов единичную матрицу. Этого сделать не получиться, если оригинальная <math>(n-k) \times (n-k)</math> подматрица <math>H</math> не является обратимой, тогда алгоритм запускается заново. Потери на перезапусках избегаются благодаря адаптивному выбору каждого столбца.
На втором шаге <math>(n-k) \times (n-k)</math> подматрица <math>H</math> есть единичная матрица, множество <math>Z</math> из <math>l</math> столбцов соответствует <math>l</math> строчкам. Для каждого <math>p</math> размерного подмножества <math>A</math> множества <math>X</math> вычисляется сумма столбцов в <math>A</math> для каждой из этих <math>l</math> строчек. В результате получается <math>l</math>-битный вектор <math>\pi(A)</math>. Аналогично для каждого <math>p</math> размерного подмножества <math>B</math> множества <math>Y</math>.
На третьем шаге для каждой коллизии <math>\pi(A)=\pi(B)</math> считается сумма <math>2p</math> столбцов в <math>A \cup B </math>. Эта сумма будет являться <math>(n-k)</math>-битным вектором. Если сумма имеет вес <math>\omega-2p</math>, то получается <math>0</math> путем добавления соответствующих <math>\omega-2p</math> столбцов в <math>(n-k) \times (n-k)</math> подматрицу. Эти <math>\omega-2p</math> столбцов вместе с <math>A</math> и <math>B</math> формируют искомое кодовое слово веса <math>\omega</math>.
Недостатки
Основные недостатки криптосистемы McEliece[6]:
- Размер открытого ключа <math>{\hat G}=SGP</math> слишком большой. При использовании кодов Гоппы с параметрами, предложенными Мак-Элисом, открытый ключ составляет <math>2^{19}</math> бит, что вызывает сложности в реализации;
- Зашифрованное сообщение гораздо длиннее исходного;
- На данный момент алгоритмы, использующие данную криптосистему в задачах аутентификации не нашли широкого распространения.
Примечания
Литература
- ↑ 1,0 1,1 Шаблон:Статья
- ↑ 2,0 2,1 Шаблон:Source
- ↑ 3,0 3,1 Шаблон:Source
- ↑ Шаблон:Source
- ↑ 5,0 5,1 5,2 Шаблон:Статья
- ↑ 6,0 6,1 6,2 Шаблон:Source Шаблон:Статья
- ↑ Шаблон:Статья
- ↑ Ошибка цитирования Неверный тег
<ref>
; для сносок:3
не указан текст - ↑ Шаблон:Статья
- ↑ Шаблон:Статья