Русская Википедия:Криптосистема Уильямса

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

Криптосистема Уильямса (Williams System) — система шифрования с открытым ключом, созданная Хью Коуи Уильямсом (Hugh Cowie Williams) в 1984 году.

История

Алгоритм был разработан в 1984 году как альтернатива более известному RSA. Целью разработки было избавиться от уязвимостей криптосистемы.

Об алгоритме

Для любой криптосистемы желательно, чтобы было доказано, что её взлом имеет вычислительную сложность аналогичную вычислительной сложности задачи, которую на данный момент невозможно решить за обозримое время. Как и RSA, криптосистема Уильямса опирается на предположение о сложности факторизации больших чисел, и было доказано, что для любого взлома шифротекста с помощью предварительного криптоанализа (имея лишь открытый ключ) необходимо провести факторизациюШаблон:Sfn, то есть решить уравнение <math>pq=n</math> относительно <math>p</math> и <math>q</math>. Это утверждение не было доказано для системы RSA. Вычислительная сложность задачи факторизации неизвестна, но считается, что она достаточно высока. Но, как и RSA, криптосистема Уильямса уязвима для атаки на основе подобранного шифротекста.

Описание алгоритма

Алгоритм системы Уильямса, не являясь вычислительно более сложным, чем RSA, намного более громоздкий в описании. Для него существует леммаШаблон:Sfn, которая будет описана в разделе о математическом аппарате — она играет ключевую роль в этой криптосистеме.

Математический аппарат

Для начала следует определить терминологию — она заимствована из теории квадратичных полей, но для криптосистемы требуются лишь самые начальные знания. Рассмотрим элемент

<math>\alpha=a+b\sqrt c=(a,b),</math>

где <math>a, b, c</math> — целые числа, а <math>\sqrt c</math> — условный элемент, квадрат которого равен <math>c</math>. Тогда будут справедливы следующие формулы:

<math>\alpha_1+\alpha_2=(a_1+a_2,b_1+b_2) ,</math>
<math>\alpha_1\cdot\alpha_2=(a_1a_2+c\cdot b_1b_2, a_1b_2+a_2b_1) </math>

Сопряжённым к <math>\alpha </math> числом называется

<math>\bar\alpha=a-b\sqrt c </math>

Определим также функции, которые помогут нам выразить степень этого числа. Пусть

<math>\alpha^i=X_i(\alpha)+Y_i(\alpha)\sqrt c,</math>

тогда <math>X_i</math> и <math>Y_i</math> можно выразить через <math>\alpha^i</math> следующим образом:

<math>X_i(\alpha)=(\alpha^i+\bar\alpha^i)/2</math>
<math>Y_i(\alpha)=b(\alpha^i-\bar\alpha^i)/(\alpha-\bar\alpha)=(\alpha^i-\bar\alpha^i)(2\sqrt c)</math>

Последнее выражение предназначено только для упрощения понимания. Так как функции определены для пар <math>(a,b)</math>, то не содержат <math>c</math>. Если предположить теперь, что <math>a^2-b^2c=1</math>, то можно записать следующие рекуррентные соотношения:

<math>X_{2i}=2{X_i}^2-1</math>
<math>Y_{2i}=2X_iY_i</math>
<math>X_{2i+1}=2X_iX_{i+1}-X_1</math>
<math>Y_{2i+1}=2X_iY_{i+1}-Y_1</math>

Эти формулы предназначены для быстрого вычисления <math>X_i</math> и <math>Y_i</math>. Так как <math>X_0=1</math> и <math>X_1=a</math>, то <math>X_i(\alpha)</math> также не зависит от <math>b</math>.

Шаблон:Hider\right)</math> и <math>\delta_q=\textstyle\left({\frac{c}{q}}\right)</math> удовлетворяют сравнениям

<math> \delta_p=-p \pmod 4</math>
<math> \delta_q=-q \pmod 4</math>

.

Пусть далее <math>gcd(cb,n)=1</math> и Символ Якоби <math>\textstyle\left({\frac{2(a+1)}{n}}\right)</math> равен 1. Обозначим

<math> m=(p-\delta_p)(q-\delta_q)/4</math>

и полагаем, что <math>e</math> и <math>d</math> удовлетворяют сравнению

<math> ed=(m+1)/2 \pmod m</math>

.

При этих предположениях

<math> \alpha^{2ed}=\pm \alpha \pmod n</math>

}}

Создание ключа

Сначала выбираются два простых числа <math>p</math> и <math>q</math>, вычисляется их произведение <math>n</math>. С помощью перебора выбирается число <math>c</math> так, чтобы символы Лежандра <math>\delta_p</math> и <math>\delta_q</math> удовлетворяли условиям, наложенным в лемме. Затем (также подбором) определяется число <math>s</math> такое, что символ Якоби

<math>\textstyle\left({\frac{s^2-c}{n}}\right)=-1</math>

и <math>gcd \textstyle\left(s,n\right)=1.</math> Число <math>m</math> выбирается так же, как и в лемме:

<math> m=(p-\delta_p)(q-\delta_q)/4</math>

Затем выбираются числа <math>d, e</math>, удовлетворяющие условиям, наложенным в лемме. Выберем случайное, например, <math>d: gcd\textstyle\left(d,m\right)=1</math>, а <math>e</math> вычислим по формуле

<math>e=\frac{m+1}{2}d^{-1} \pmod m</math>

Тогда <math>{n,e,c,s}</math> — открытый ключ, а <math>{p,q,m,d}</math> — секретный ключ.

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

Все вычисления здесь ведутся по модулю <math>n</math>. Запись <math>a+b\sqrt c \pmod n </math> здесь означает <math>(a\mod n)+(b\mod n)\sqrt c .</math> Представим открытый текст в виде числа <math>w\in{2,3, ... ,n-1}</math>. Определим <math>\gamma</math> и <math>b_1</math>: если символ Якоби <math>\textstyle\left({\frac{w^2-c}{n}}\right)</math> равен <math>+1</math>, то

<math>b_1=0</math> и <math>\gamma=w+\sqrt c ,</math>

иначе определим <math>\gamma</math> через произведение

<math>b_1=1</math> и <math>\gamma=(w+\sqrt c)(s+\sqrt c).</math>

Тогда легко убедиться, что символ Якоби

<math>\textstyle\left({\frac{\gamma\bar\gamma}{n}}\right)=1,</math>

что проверяется прямым вычислением (во втором случае с учётом выбора <math>s</math> и мультипликативности символа Якоби). Далее находим число

<math>\alpha=\frac{\gamma}{\bar\gamma}.</math>

Представим <math>\alpha</math> в виде <math>\alpha=a+b\sqrt c.</math> <math>\alpha</math> удовлетворяет условиям, накладываемым в лемме. Действительно, <math>p, q, n, c, d, e</math> удовлетворяют условиям по построению, и

<math>\alpha\bar\alpha=\frac{\gamma}{\bar\gamma}\frac{\bar\gamma}{\gamma}=1.</math>
<math>2(a+1)=\frac{\gamma}{\bar\gamma}+\frac{\bar\gamma}{\gamma}+2=\frac{(\gamma+\bar\gamma)^2}{\bar\gamma\gamma} \pmod n </math>

Из последней формулы следует, что

<math>\textstyle\left({\frac{2(a+1)}{n}}\right)=1.</math>

Получив <math>\alpha,</math> следует его зашифровать возведением в степень <math>e</math> — результат может быть представлен через <math>X_e(\alpha)</math> и <math>Y_e(\alpha),</math> которые могут быть[1] быстро (за количество операций порядка <math>\log e</math>) найдены с помощью рекуррентных формул. Введём обозначение

<math>E=\frac{X_e(\alpha)}{Y_e(\alpha)}</math>

Тогда криптотекстом будет являться тройка чисел <math>(E, b_1, b_2),</math> где <math>b_2=a \mod 2.</math>

Расшифрование

Расшифрование проводится проще. Сначала вычисляется

<math>\alpha^{2e}=\frac{\alpha^{2e}}{{(\alpha\bar\alpha)}^e}=\frac{E+\sqrt c}{E-\sqrt c},</math>

что может сделать и злоумышленник. Но для окончательного расшифрования необходимо вычислить, как показано в лемме, <math>\alpha^{2ed}</math> — при том, что <math>d</math> держится в секрете.

<math>\alpha^{2ed}=X_d(\alpha^{2e})+Y_d(\alpha^{2e})\sqrt c=\pm\alpha</math>

Число <math>b_2,</math> передаваемое в сообщении, укажет, какой из знаков верен — тот, что даёт чётный результат или тот, что даёт нечётный. Число <math>b_1</math> покажет, следует ли умножить результат на <math>(s-\sqrt c)/(s+\sqrt c)</math>. В результате мы получим число

<math>\alpha'=\frac{w+\sqrt c}{w-\sqrt c}</math>

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

<math>w=\frac{\alpha'+1}{\alpha'-1}\sqrt c</math>

Безопасность

Как и на RSA, на криптосистему может быть проведена атака на основе подобранного шифротекста. Предположим, что криптоаналитик нашёл некоторый алгоритм, позволяющий с вероятностью <math>\delta>0</math> расшифровать криптотекст. Тогда он может поступить следующим образом:

1. Выбрать число <math>\phi</math> такое, что символ Якоби <math>\textstyle\left({\frac{\phi^2-c}{n}}\right)=-1</math>;
2. Зашифровать <math>\phi</math>, но таким образом, как будто упомянутый символ Якоби равен <math>+1</math> и <math>b_1=0</math>, получив на выходе криптотекст <math>(E,0,b_2)</math>;
3. Расшифровать полученный криптотекст, получив некоторый <math>\psi\ne\phi</math>.

Тогда с вероятностью <math>\delta>0</math> криптоаналитик может получить

<math>\phi-\psi=p\pmod n</math>

или

<math>\phi-\psi=q\pmod n</math>

Что позволяет произвести факторизацию <math>n</math> и взломать криптосистему.

Быстродействие

После генерации ключа основные вычисления происходят при возведении числа <math>\alpha</math> в степень, а это может быть произведено за <math>O(\log e)</math> умножений по модулю, каждое из которых происходит за <math>O(\log e)</math> операций сложения, в свою очередь выполняющихся за <math>O(\log e)</math> элементарных операций сложения неизменной скорости — то есть за <math>O(\log^3 e)</math>, с той же скоростью, что и возведение в степень целого числа по модулю, которое требуется для использования RSA.

Пример

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

Выберем, например, <math>p=11</math> и <math>q=13</math>, произведением которых является <math>n=143</math>. Так как

<math>\left(\frac{5}{11}\right)=1=-11 \pmod 4</math>

и

<math>\left(\frac{5}{13}\right)=-1=-13 \pmod 4</math>

Можно выбрать <math>c=5</math>. Также, если выбрать <math>s=2</math>, получим

<math>\left(\frac{s^2-c}{n}\right)=\left(\frac{-1}{11}\right)\left(\frac{-1}{13}\right)=-1</math>

Что удовлетворяет условию теоремы. Далее получим

<math>m=\left(\frac{10\cdot14}{4}\right)=35</math>

И, наконец, выберем экспоненты шифрования и расшифрования: так как

<math>23\cdot16=18\pmod m</math>

Можно выбрать

<math>e=23</math>
<math>d=16</math>

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

Пусть исходный текст будет <math>\omega=21</math>. Так как

<math>\left(\frac{21^2-5}{143}\right)=\left(\frac{7}{11}\right)\left(\frac{7}{13}\right)=(-1)\cdot(-1)=1</math>

Имеем <math>b_1=0</math>, <math>\gamma=21+\sqrt 5</math> и

<math>\alpha=\left(\frac{21+\sqrt 5}{21-\sqrt 5}\right)=125+6\sqrt 5 \pmod {143}</math>

Так как <math>125</math> нечётно, получаем <math>b_2=1</math>. После вычисления <math>X_{23}(\alpha)=68</math> и <math>Y_{23}(\alpha)=125</math> получаем

<math>E=68\cdot {125}^{-1}=68\cdot135=28 \pmod{143}</math>

Таким образом, шифротекстом является тройка <math>(28,1,1)</math>.

Расшифрование

Теперь следует вычислить <math>\alpha^{2e}</math>:

<math>\alpha^{2e}=\left(\frac{28^2+5}{28^2-5}\right)+2\cdot\left(\frac{28}{28^2-5}\right)\sqrt 5=95+126\sqrt 5 \pmod {143}</math>

Так как <math>d=16</math>, вычисляем также

<math>X_{16}(\alpha^{2e})=18</math>
<math>Y_{16}(\alpha^{2e})=137</math>

Так как <math>b_2=1</math>, то <math>a</math> должно быть нечётным и

<math>\alpha'=-(18+137\sqrt 5)=125+6\sqrt 5 \pmod {143}</math>

Учитывая, что вторая компонента шифротекста <math>b_1=0</math>, заключаем, что <math>\alpha'=\alpha</math>. В таком случае

<math>\omega=\frac{126+6\sqrt 5}{124+6\sqrt 5}\sqrt 5=21 \pmod {143}</math>.

Таким образом, мы получили <math>\omega=21</math>, который и являлся первоначальным открытым текстом.

Примечания

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

Литература

  1. Арто Саломаа — Криптография с открытым ключом, изд. Мир, 1995, ISBN 5-03-001991-X