Концепция криптографии с открытым ключом была предложена Уитфилдом Диффи (Whitfield Diffie) и Мартином Хеллманом (Martin Hellman), и, независимо от них, Ральфом Мерклом (Ralph Merkle). Основная идея заключается в том, чтобы использовать ключи парами, состоящими из ключа зашифрования и ключа расшифрования, которые невозможно вычислить один из другого.
В 1976 г. вышла основополагающая работа [1]. С этого времени было создано много алгоритмов, использующих концепцию открытых ключей. Алгоритм является общедоступным, нет необходимости в секретных каналах связи. Общая схема выглядит следующим образом:
Мы подробно представим алгоритм RSA, являющийся популярным в приложениях.
В 1978 г. появилась работа [2], в которой Рон Райвест (Ron Rivest), Ади Шамир (Adi Shamir) и Лен Адлеман (Len Adleman) предложили алгоритм с открытым ключом. Схема Райвеста-Шамира-Адлемана (RSA) получила широкое распространение.
Опишем процесс шифрования. Исходный текст должен быть переведен в числовую форму, этот метод считается известным. В результате этого текст представляется в виде одного большого числа. Затем полученное число разбивается на части (блоки) так, чтобы каждая из них была числом в промежутке $$[0, N - 1]$$ (о выборе $$N$$ - см. ниже). Процесс шифрования одинаков для каждого блока. Поэтому мы можем считать, что блок исходного текста представлен числом $$x$$, $$0\leq x < N$$.
Каждый абонент вырабатывает свою пару ключей. Для этого он генерирует два больших простых числа $$p$$ и $$q$$, вычисляет произведение $$N=p\cdot q$$. Затем он вырабатывает случайное число $$e$$, взаимно простое со значением $$\varphi(N) = (p-1)(q-1)$$ функции Эйлера от числа $$N$$, и находит число $$d$$ из условия $$e \cdot d \equiv 1 ~(\mods \varphi(N))$$. Так как $$\GCD(e,\varphi(N))=1$$, то такое число $$d$$ существует и оно единственно. Пару $$(N,e)$$ он объявляет открытым ключом и помещает в открытый доступ. Пара $$(N, d)$$ является секретным ключом. Для расшифрования достаточно знать секретный ключ. Числа $$p$$, $$q$$, $$\varphi(N)$$ в дальнейшем не нужны, поэтому их можно уничтожить.
Пользователь $$A$$, отправляющий сообщение $$x$$ абоненту $$B$$, выбирает из открытого каталога пару $$(N,e)$$ абонента $$B$$ и вычисляет шифрованное сообщение $$y=x^e ~(\mods N)$$. Чтобы получить исходный текст, абонент $$B$$ вычисляет $$y^d ~(\mods N)$$. Так как $$|\mathbb{Z}_N^{*}| = \varphi(N)=(p-1)(q-1)$$, и $$e\cdot d = 1 + k\varphi(N)$$ для некоторого целого числа $$k$$, то $$(x^e)^d = x^ed = x^{1+k\varphi(N)}=x\cdot x^{|\mathbb{Z}_N^{*}|}\equiv x ~(\mods N).$$
Пример 8.1. Построим криптосистему RSA с $$p=7$$, $$q=17$$ и зашифруем сообщение $$x=19$$.
Находим: $$N=7\cdot 17=119$$, $$\varphi(N) = 6\cdot 16 = 96$$. Выбираем значение $$e$$ с условиями $$e<96$$ и $$\GCD(e,\varphi(N))=1$$. Например, возьмём $$e=5$$. Находим $$d=e^{-1}~(\mods 96)$$. Получаем $$d=77$$, так как $$77\cdot 5 = 4\cdot 96 + 1$$. Открытый ключ: $$(119,5)$$, секретный ключ: $$(119,77)$$. Для зашифрования число $$x=19$$ возводим в степень $$5$$ по модулю $$119$$:
$$ x^e = 19^5 = 2 476 099 \equiv 66 \ (\mods 119). $$
Итак, $$y=66$$. Расшифрование даёт:
$$x = 66^{77} ~(\mods 119) = 19.$$
Для ускорения возведения в степень по модулю необходимо использовать быстрый алгоритм возведения в степень, рассмотренный в первой лекции.
Безопасность алгоритма RSA основана на трудоемкости разложения на множители больших чисел. Международная группа ученых вычислителей в январе 2010 года установила новый рекорд факторизации, разложив на простые множители 232-значное число. Следовательно, выбираемое N должно быть больше. Большинство общепринятых алгоритмов вычисления простых чисел $$p$$ и $$q$$ носят вероятностный характер.
Для работы алгоритма RSA нужны большие простые числа. Существуют два подхода.
Кроме разрядности $$p$$ и $$q$$, к ним предъявляются следующие дополнительные требования:
$$\left(\frac{p+q}{2}\right)^2 - N = \left(\frac{p-q}{2}\right)^2.$$
Чтобы исключить возможность применения методов факторизации, накладывают следующее ограничение: числа $$p-1$$, $$p+1$$, $$q-1$$, $$q+1$$ не должны разлагаться в произведение маленьких простых множителей, должны содержать в качестве сомножителя хотя бы одно большое простое число. В 1978 г. Райвест сформулировал наиболее сильные требования:
Числа $$p_1=(p-1)/2$$, $$p_2=(p+1)/2$$, $$q_1=(q-1)/2$$, $$q_2=(q+1)/2$$ должны быть простыми, причем $$p_1-1$$ и $$q_1-1$$ не должны разлагаться в произведение маленьких простых чисел.
Рассмотрим вопрос о выборе экспонент шифрования и расшифрования. Так как значения $$e$$ и $$d$$ определяют время зашифрования и расшифрования, то можно назвать ряд ситуаций, в которых желательно иметь малое значение $$e$$ и $$d$$. Например, при использовании системы RSA при защите электронных платежей с применением кредитных карточек естественным является требование использования небольших значений экспоненты $$d$$ у владельца карточки и большого значения экспоненты $$e$$ у центрального компьютера.
Однако выбор малых параметров $$e$$ или $$d$$ представляется небезопасным по ряду соображений. Если малым является секретный параметр $$d$$, то можно применить метод перебора малых значений до получения искомого числа $$d$$. А если малым является параметр $$e$$, то достаточно большое число открытых сообщений, удовлетворяющих неравенству $$x < \sqrt[e]{N}$$, будут зашифровываться простым возведением в степень $$y=x^e$$, и поэтому их можно найти путем извлечения корня степени $$e$$.
Другая аналогичная ситуация может сложиться, когда у нескольких абонентов используется одинаковая экспонента $$e$$. Тогда становится возможна атака на основе китайской теоремы об остатках (см. ниже).
Сначала нужно каким-либо способом представить текст сообщения в виде упорядоченного набора чисел по модулю $$N$$. Это еще не процесс шифрования, а только подготовка к нему.
Пример 8.2.Подготовим к зашифрованию девиз ПОЗНАЙ СЕБЯ,
Для простоты предположим, что текст сообщения содержит \ слова, записанные только заглавными буквами. Первый шаг состоит в замене каждой буквы сообщения числом. Будем использовать таблицу замен 8.1.
| А | Б | В | Г | Д | Е | Ж | З | И | Й | К | Л | М | Н | О | П | Р |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 |
| С | Т | У | Ф | X | Ц | Ч | Ш | Щ | Ъ | Ы | Ь | Э | Ю | Я | \_ | |
| 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 99 |
Текст ПОЗНАЙ СЕБЯ после замен букв на числа принимает вид: 2524172310199927151141.
Пусть в нашем примере $$p=149$$, $$q=157$$, тогда $$N = 23393$$. Поэтому цифровое представление открытого текста нужно разбить на блоки, меньшие, чем $$23393$$. Одно из таких разбиений выглядит следующим образом:
2524 1723 10199 9271 511 41
Конечно, выбор блоков неоднозначен, но и не совсем произволен. Например, во избежание двусмысленностей, на стадии расшифровки не следует выделять блоки, начинающиеся с нуля.
При расшифровке сообщения получаем последовательность блоков, затем их соединяем вместе и получаем число. После этого числа заменяют буквами в соответствии с таблицей, приведенной выше.
Обратим внимание на то, что в этом примере каждую букву кодируем двузначным числом. Это сделано для предотвращения неоднозначности. Если бы мы пронумеровали буквы не по порядку, начиная с 1, т. е. А соответствует 1, Б соответствует 2 и т. д., то было бы непонятно, что обозначает блок 12: пару букв АБ или букву Л, двенадцатую букву алфавита. Конечно, для кодирования можно использовать любые однозначные соответствия между буквами и числами, например ASCII-кодировку, что чаще всего и делается.
Продолжим пример: выбираем $$p= 149$$, $$q=157$$, вычисляем $$\varphi(N) = 23 088$$. Теперь нужно выбрать число $$e$$, взаимно простое с $$\varphi(N)$$. Наименьшее простое число, не делящее $$\varphi(N)$$, равно $$5$$. Положим $$e=5$$. Зашифруем сообщение поблочно. Для шифрования первого блока вычисляем $$2524^{5} ~(\mods 23393) = 22752$$. Далее,
$$1723^5 (\mods 23393) = 6198,$$
$$10199^5 (\mods 23393) = 14204,$$
$$9271^5 (\mods 23393) = 23191,$$
$$511^5 (\mods 23393) = 10723,$$
$$41^5 (\mods 23393) = 14065.$$
Теперь шифрованный текст имеет вид: $$22752619814204231911072314065$$.
В нашем примере $$N = 23393$$, $$e = 5$$. Расширенный алгоритм Евклида для чисел $$\varphi(N)=23 008$$ и $$e=5$$ даёт:
$$1=2\cdot 23008 - 9235\cdot 5 , \qquad \varphi(N)-9235=13583 \equiv 5^{-1} ~(\mods \varphi(N)).$$
Значит для расшифровки блоков шифртекста мы должны возвести блоки в степень $$13583$$ по модулю $$23393$$. Для первого блока $$22752$$ шифртекста в примере получим:
$$22752^{13853} = 2524 (\mods 23393).$$
Разбиение числа на блоки можно произвести различными способами. При этом промежуточные результаты зависят от способа разбиения, однако конечный результат - не зависит.
Для расшифрования необходимо по известным $$N$$, $$e$$ и шифртексту $$y$$ найти такое $$x\in \mathbb{Z}_N^\ast$$, что $$y=x^e (\mod N)$$.
Попытаемся решить сравнение при конкретных $$y$$, затем использовать гомоморфность отображения $$D(x)$$.
Один из возможных способов следующий: пусть имеется набор пар:
$$\{(x_1,y_1),(x_2,y_2),\ldots (x_k,y_k)\}$$с условием, что $$x_i^e = y_i ~(\mod N)$, $1<y<N$$, $$\GCD(y,N)=1$$. Если каким-либо образом удалось представить $$y$$ в виде $$y=y_1^{s_1} y_2^{s_2}\cdots y_k^{s_k} ~(\mod N)$$ с целыми $$s_k$$, то $$x=x_1^{s_1}x_2^{s_2}\cdots x_k^{s_k}$$ будет решением сравнения $$y=x^e ~(\mod N)$$.
Пример 8.3 В наличии имеется открытый ключ $$N = 31459$$, $$e = 5$$ и набор пар соответствующих друг другу исходных и зашифрованных сообщений: $$(23, 18707)$$, $$(755, 26871)$$, $$(631, 6384)$$. Требуется расшифровать шифртекст $$y = 11 638$$.
Представим $$y$$ в виде $$y=18707^{-1}\cdot 26871^3\cdot 6384^{-2}=11 638$$. Отсюда легко вычислить исходное сообщение: $$x=23^{-1}\cdot 755^3 \cdot 631^{-2}=28260$$.
Заметим, что этот подход не менее труден, чем поиск алгоритма решения сравнения $$y=x^e ~(\mod N)$$.
Само по себе использование RSA не обеспечивает безопасности. Дело еще в деталях реализации. Приведем ряд примеров. Для простоты вычислений будем работать с небольшими числами. Цель - показать особенности, не зависящие от размера.
Пример 8.4 Пусть пользователь выбрал $$N=2047$$, $$e=179$$, $$d=411$$. Так как $$2047 = 23 \cdot 89$$, а числа $$\varphi(23)=22$$ и $$\varphi(89)=88$$ имеют наименьшее общее кратное 88, то любое обратное к 179 по модулю 88, например 59, будет действовать как $$d$$.
Пример 8.5 Число $$N = 536813567$$ является произведением простого числа Мерсенна $$8191$$ и простого числа Ферма $$65537$$. Это очень плохой выбор.
Пример 8.6 Число $$23360947609$$ является очень плохим выбором для $$N$$ из-за того, что два его простых делителя слишком близки к друг другу.
Пусть $$p>q$$, тогда имеем:
$$N=t^2 - s^2, \qquad t=\frac{p+q}{2},\ s=\frac{p-q}{2}.$$Так как $$S$$ мало, то $$t$$ - целое число, лишь немного большее $$\sqrt{N}$$, причем $$t^{2}-N$$ является полным квадратом. Проверяем подряд целые числа $$t>\sqrt{N}$$. В нашем примере это $$t_1 = 152843$$, $$t_2 = 152844$$, $$t_3 = 152845$$, причем $$t_3^2-N=804^2$$. Тогда $$p = 152845 - 804$$. Таким образом, мы с третьей попытки нашли $$p$$ и $$q$$. Количество попыток, необходимых для факторизации $$N$$, можно при известных $$p$$ и $$q$$ вычислить по следующей формуле:
$$k=\sqrt{p\cdot q + \left(\frac{p-q}{2}\right)^2}-\left[\sqrt{p\cdot q}\right],$$где $$[x]$$ - операция округления $$x$$ до ближайшего целого числа.
См. [1]
В целях ускорения зашифрования и расшифрования в системе RSA часто открытый или секретный показатель выбирают малыми. Поскольку размеры чисел составляют сотни бит, сокращение длины показателей первоначально могло выглядеть обоснованным. Однако такой способ увеличения скорости шифрования часто приводит к снижению стойкости.
Теорема 8.1 (Винер) Пусть в системе RSA выполняются неравенства $$p<q<2p$$ и $$d<\dfrac{1}{3}\sqrt[{4}]{n}$$. Тогда по открытому ключу $$(n,e)$$ можно вычислить секретный показатель $$d$$.
При некотором целом $$k$$ выполняется неравенство:
$$\left|\frac{e}{n}-\frac{k}{d}\right|\leq \frac{1}{d\sqrt[4]{n}} < \frac{1}{2d^2}.$$Число дробей $$\dfrac{k}{d}$$, для которых $$d<n$$, удовлетворяющих полученому соотношению, не превосходит $$log n$$, и все они являются подходящими дробями $$\dfrac{P_i}{Q_i}$$ к рациональному чилу $$\dfrac{e}{n}$$. Для некоторого $$i$$ будет выполняться равенство $$\dfrac{P_i}{Q_i}=\dfrac{k}{d}$$. Из равенства $$ed-k\varphi(n)=1$$ следует, что числа $$k$$ и $$d$$ взаимно просты, значит, $$k=P_i$$, $$d=Q_i$$.
Пример 8.7 Пусть $$(n,e)=(4617790059809965777,2693216516134636609)$$ - открытый ключ. Найдём $$d$$.
Раскладываем число $$\dfrac{e}{n}$$ в цепную дробь и находим последовательно подходящие дроби:
$$\begin{align*}\frac{2693216516134636609}{4617790059809965777}=[0;1,1,2,1,1,64,3,1,1,61,2,9,\ldots],\\ \frac{P_1}{Q_1} =\frac{1}{1};\quad \frac{P_2}{Q_2} =\frac{1}{2};\quad \frac{P_3}{Q_3} =\frac{3}{5};\quad \frac{P_4}{Q_4} =\frac{4}{7};\quad \frac{P_5}{Q_5} =\frac{7}{12};\\ \frac{P_6}{Q_6} =\frac{452}{775};\quad \frac{P_7}{Q_7} =\frac{1363}{2337};\quad \frac{P_8}{Q_8} =\frac{1815}{3112};\quad \frac{P_9}{Q_9} =\frac{3178}{5449}.\end{align*} $$Для девятой подходящей дроби получаем, что разность $$e\cdot Q_9 - 1$$ делится нацело на $$P_9$$:
$$2693216516134636609\cdot 5449-1=3178\cdot 4617790055512156980.$$Полагаем $$d=Q_9=5449$$. Секретный ключ найден.
Строим последовательность: $$y_1=y$$, $$y_i=y_{i-1}^e ~(\mod N)$$, $$i>1$$. Итак, $$y_m=y^{(e^m)} ~(\mod N)$$, а так как $$\GCD(e,\varphi(n))=1$$, то существует такое натуральное число $$m$$, что $$e^m=1 ~(\mod \varphi(N))$$. Но тогда $$y^{(e^m-1)}=1 ~(\mod N)$$, отсюда следует, что $$y^{(e^m)} =y ~(\mod N)$$, значит, $$y_{m-1}$$ - решение сравнения $$y=x^e ~(\mod N)$$.
Пример 8.8 Пусть у нас имеется открытый ключ $$N =84517$$, $$e = 397$$ и зашифрованное им сообщение $$y = 8646$$. Найдём открытый текст $$x$$.
Возводя $$y$$ в степень $$e$$, строим последовательность:
$$\begin{align*}y_1 = y = 8646,\quad y_2 = 37043,\quad y_3 = 5569,\quad y_4 = 61833,\\ y_5 = 83891,\quad y_6 = 16137,\quad y_7 = 8646 = y.\end{align*}$$Следовательно, $$y_6$$ является решением сравнения $$y=x^e ~(\mod N)$$, а, следовательно, искомым сообщением $$x$$.
Замечание. Анализ метода повторного шифрования хорошо показывает необходимость соблюдения требований на выбор $$p$$ и $$q$$ для обеспечения стойкости. В данном примере $$d = 82 225$$. Неудачный выбор криптосистемы привел к тому, что атака методом повторного шифрования дала результат почти сразу, тогда как нахождение $$d$$ потребовало бы на порядок больших вычислений.
Как отмечалось ранее, системы шифрования с открытыми ключами работают сравнительно медленно. Для повышения скорости шифрования RSA на практике используют малую экспоненту зашифрования.
Если выбрать число $$e$$ небольшим или таким, чтобы в его двоичной записи было мало единиц, то процедуру шифрования можно значительно ускорить. Например, выбрав $$e = 3$$ (при этом ни $$p - 1$$, ни $$q - 1$$ не должны делиться на 3), мы сможем реализовать шифрование с помощью одного возведения в квадрат по модулю $$N$$ и одного перемножения. Выбрав $$e=2^{16}-1=65537$$ - число, двоичная запись которого содержит только две единицы, мы сможем реализовать шифрование с помощью 16 возведений в квадрат по модулю $$N$$ и одного перемножения. Если экспонента $$e$$ выбирается случайно, то реализация шифрования по алгоритму RSA потребует $$s$$ возведений в квадрат по модулю $$N$$ и в среднем $$s/2$$ умножений по тому же модулю, где $$s$$ - длина двоичной записи числа $$N$$. Вместе с тем, выбор небольшой экспоненты $$e$$ может привести к негативным последствиям. Дело в том, что у нескольких корреспондентов могут оказаться одинаковые экспоненты $$e$$.
Пусть, например, три корреспондента имеют попарно взаимно простые модули $$N_1$$, $$N_2$$, $$N_3$$ и общую экспоненту $$e = 3$$. Если еще один пользователь посылает им некое циркулярное сообщение $$x$$, то криптоаналитик противника может получить в свое распоряжение три шифрованных текста $$y_i=x^3 ~(\mod N_i)$$, $$i=1,2,3$$. Далее, он может найти решение системы сравнений, лежащее в интервале $$(0,N_1\cdot N_2 \cdot N_3)$$ и удовлетворяющее уравнениям:
$$\left\{\begin{array}{l} y\equiv y_1 ~(mod\; N_1),\\ y\equiv y_2 ~(mod\; N_2),\\ y\equiv y_3 ~(mod\; N_3) \end{array}\right. $$По китайской теореме об остатках такое решение $$y$$ единственно, а так как $$x^3<N_1\cdot N_2 \cdot N_3$$, то $$y=x^3$$. Значение $$x$$ можно найти, вычислив кубический корень $$x=\sqrt[3]{y}$$. Отметим, 8.1 что выбор малой экспоненты расшифрования $$d$$ также нежелателен в связи с возможностью определения $$d$$ простым перебором. Известно также что если $$d<\sqrt[4]{N}$$, то экспоненту $$d$$ легко найти, используя непрерывные дроби.
Пример 8.9 Три пользователя имеют модули $$N_1=26549$$, $$N_2= 45901$$, $$N_3 = 25351$$. Все пользователи используют экспоненту $$e = 3$$. Всем пользователям было послано некое сообщение $$x$$, причем пользователи получили сообщения $$y_1 = 5366$$, $$y_2 = 814$$, $$y_3 = 4454$$. Найдём $$x$$.
С помощью китайской теоремы об остатках решим систему:
$$\left\{\begin{array}{l} y=5366 ~(mod\; 26549),\\ y=814 ~(mod\; 45901), \\ y=4454 ~(mod\; 25351). \end{array}\right. $$Для этого вычислим $$M_0 = N_1\cdot N_2\cdot N_3= 30893378827799$$. Далее находим
| $$m_1 = N_2\cdot N_3 = 1163636251,$$ |
| $$m_2 = N_1\cdot N_3 = 673043699,$$ |
| $$m_3 = N_1\cdot N2 = 1218625649,$$ |
| $$n_1 = m_1^{-1} ~(mod\; N_1) = 13533,$$ |
| $$n_2 = m_2^{-1} ~(mod\; N_2) = 27930,$$ |
| $$n_3 = m_3^{-1} ~(mod\; N_3) = 22354.$$ |
| $$y = y_1\cdot n_1\cdot m_1 + y_2\cdot n_2\cdot m_2 + y_3\cdot n_3\cdot m_3=$$ |
| $$= 84501028038745578 + 15301661957638980 + 121332116653000684 =$$ |
| $$=221134806649385242 \equiv 1000000000 ~(mod\; M_0).$$ |
Отсюда $$x=\sqrt[3]{1000000000} = 1000$$ - исходное сообщение, отправленное пользователям.
Пусть два пользователя выбрали одинаковый модуль $$N$$ и взаимно простые экспоненты $$e_1$$ и $$e_2$$. Если один пользователь посылает им некое циркулярное сообщение $$x$$, то криптоаналитик противника может получить в свое распоряжение два шифрованных текста $$y_1=x^{e_1} ~(mod\; N)$$ и $$y_2=x^{e_2}~(mod\; N)$$. В таком случае криптоаналитик может получить исходное сообщение, найдя с помощью алгоритма Евклида числа $$r$$ и $$s$$ такие, что $$re_1+se_2=1$$. Отсюда получаем:
$$y_1^r y_2^s = x^{re_1 + se_2} = x ~(mod\; N).$$Пример 8.10 Два пользователя применяют общий модуль $$N = 137759$$, но разные взаимно простые экспоненты $$e_1=191$$ и $$e_2 = 233$$. Пользователи получили шифртексты $$y_1=60197$$ и $$y_2= 63656$$, которые содержат одно и то же сообщение. Найдем исходное сообщение методом бесключевого чтения.
Так как $$e_1$$ и $$e_2$$ взаимно просты, то найдем такие $$r$$ и $$s$$, что $$re_1+se_2=1$$. С помощью расширенного алгоритма Евклида находим $$r = 61$$, $$s = -50$$. Искомое сообщение:
$$x=y_1^r\cdot y_2^s = 60197^{61} \cdot 63656^{-50}=1234.$$Как видно из приведенных выше примеров, выбор параметров криптосистемы является ответственной задачей. Параметры необходимо выбирать в строгом соответствии с требованиями. Существующими в настоящими время методами (и при использовании существующих в настоящее время вычислительных мощностей) атака на алгоритм и/или криптосистему возможна лишь при неудачном выборе параметров. В частности, необходимо обеспечить каждому пользователю уникальные значения $$p$$, $$q$$ и уникальное значение $$e$$, удовлетворяющие требованиям, приведенным выше.
Приведем примеры атак с числами, размеры которых соответствуют реально применяем в системах защиты банковской информации.
Для работы с большими числами мы будем использовать систему компьютерной алгебры Maxima (см. параграф 1.16.1). Используемые нами функции подробно описаны в руководстве пользователя. Особенно полезен нам раздел "Number Theory".
Исходные данные:
$$N$$ = 6915244609579137267327382519799379091524149293244816637691826 9398622964367867570234227167749609782487603063343406242777371955314645 2742388332988733993605091994058293499382971742490952474719828474075078 5896707348622744531600003265917743044563775026361237516233569510776114 8109796496185649768169137389070008752782413652613114179194481058554254 4448615819662193369744739530133016244020607483919296703035335756025782 1198618093610413148915963990789275952977743453275495105952399715239534 1404522821690462029654934969262380866920267097617165707930262759302606 756755216795383122881029602333988711966716180750531605801919527461
$$e$$ =7423489;
шифртекст $$C =$$ 465060673245728679820089043475674731352115350813536 29127993992486567556 7156900806763889151763924735496714794491888355277 38596815041010164916640784130 4910760438532601276748143258914433560279 13186272146910522595250621775809097843 8466376070439866602619174245254 91796789390336635629378578035857597525297590776 2618424271931719171731 88933063050921552961787237676274649516864417659967226409 6655987478676 94982197189302733688441148495741687268763633927764999172932586878 6575 5502667348346941062611020674418896448890646803651538990666737332006313 6883 39309056851281655672233726633413389794443264266190435226307846633 6457114523067
Запустим систему Maxima. После появления приглашения командной строки (%i1) можно вводить команды.
e:7423489$
После нажатия Enter происходит выполнение команды. Аналогичным образом введём идентификаторы $$N$$, $$C$$.
isqrt. Для возведения в квадрат используется операция ^. Введём:
srn:isqrt(N)$
is(srn^2=N);
Первая команда вычисляет целую часть корня от $$N$$ и обозначает её идентификатором srn. Вторая команда проверяет, является ли $$N$$ квадратом. В результате второй команды получим вывод:
(%o5) false
Это говорит о том, что равенство $$\lfloor \sqrt{N} \rfloor^2 = N$$ не выполняется, и число $$N$$ - не квадрат целого числа. Надпись "\verb#(%05)#" обозначает, что далее идёт результат 5-й команды, которая была введена после приглашения "\verb#(%i5)#".
(%i6) w1 : (srn+1)^2 - N$
(%i7) is(isqrt(w1)^2=w1);
(%o7) false
(%i8) w2 : (srn+2)^2 - N$
(%i9) is(isqrt(w2)^2=w2);
(%o9) false
(%i10) w3 : (srn+3)^2 - N$
(%i11) is(isqrt(w3)^2=w3);
(%o11) false
(%i12) w4 : (srn+4)^2 - N$
(%i13) is(isqrt(w4)^2=w4);
(%o13) true
Итак, $$N=(\mathtt{srn}+4)^2-\sqrt{w_4}^2$$.
(%i14) p:srn+4-isqrt(w4);
(%o14) 262968526816026736232636051189459874382446519148
963617629027255104769945719755984982102707120117
706525064015257076350250162229292374187259939548
939791858838514297011479606873615542587565445952
774014851457711890959298629102287714458214768091
456036071496351940116236181014737608169537866387
475270200449701600539
(%i15) q:srn+4+isqrt(w4);
(%015) 262968526816026736232636051189459874382446519148
963617629027255104769945719755984982102707120117
706525064015257076350250162229292374187259939548
939791858918434644001891354485948817612831393943
831874217795402559116173347849761999726607005334
107474067053693923414485042904885419841498167834
826934556836972951999
Проверим, правильно ли мы нашли делители:
(%i16) is(N=p*q);
(%o16) true
Теперь нетрудно осуществить дешифровку.
(%i17) n:(p-1)*(q-1);
(%o17) 691524460957913726732738251979937909152414929324
481663769182693986229643678675702342271677496097
824876030633434062427773719553146452742388332988
733993605091994058293499382971742490952474719828
474075078589670734862274453160000326591774304456
377502636123751623356951077611481097964961856497
681691373890700087522564765989810607067292089561
753346960966889279214097392158985030920845106212
364219654648892933401895280839556667834036311647
010551595182396506795549490371941105829837814339
818401626212936221330490459000092664168447951206
651159937454409858770432466166667495195921598056
82710960700930681958448326848515244974924
inv_mod.
(%i18) d:inv_mod(e,n);
(%o16) 159473778881412178951363380047548370299185595369
293301556900463792194735837486992335590486755090
118784764988909430054104623893214000053083933271
592133656057039185769018422628707296349955436619
729220378775558752251642918675436409902022493957
029259927562211781124457194260217400235337672814
214944366331695859094533195686344563818416832875
322618995339315686613690403531225496361587681392
769069101695698479902470067182274377952892405921
601214570482225781950523126294764189240377630662
614360117188441324480392776069704371618231484929
589094831167041492978941304862403054017212391664
53872109949533807664476342715222105274029
power_mod.
(%i19) P:power_mod(C,d,N);
(%o19) 20231718
Исходные~данные:
$$N=$$ 2519590847565789349402718324004839857142928212620403202777713 7836043662020707595556264018525880784406918290641249515082189298559149 1761845028084891200728449926873928072877767359714183472702618963750149 7182469116507761337985909570009733045974880842840179742910064245869181 7195118746121515172654632282216869987549182422433637259085141865462043 5767984233871847744479207399342365848238242811981638150106748104516603 7730605620161967625613384414360383390441495263443219011465754445417842 4020924616515723350778707749817125772467962926386356373289912154831438 167899885040445364023527381951378636564391212010397122822120720357;
$$e_{1} = 1011163$$; $$e_{2} = 1110521$$;
$$C_{1} =$$ 1475325512646127242922491234336573821326644830122724857802651 82834500418 6248451852916071172167393901484963211012186813420799457345 60638901218485778028 8088167762693301487173478582573846232471858233011 05429274234279863037579651294 1305440048424158412512493520129752032822 49047843226000864924203675006878533759 4689790689579026501643817929120 04105626763672704672827848013136399268699306662 7592945775958095422456 50919791860840020082746913903995338683355323748300077852 4222905192914 54785850041002811165491890932478197036280409606904111958813351896 3410 8240519966700126623731566589570806848893829480888979012581343525399802 490
$$C_{2} =$$ 1168960834050268961897324310220295239101276316289170220279034 24838605267 3641103792818084219415738429514299664733141986982322386646 78264765952517495919 5383277543494845172200901017398976983581548883677 72471406710688871011254842119 0717106834141930230321678867355741169178 64117261510578555710832001442414172654 4343094430367130161092842091138 95716177545680184852854836102034397952992257055 3742268402669724738982 06540435293792709985777111719850811784302488645684794421 4372490969359 76159712998481145184343878513509137590163314701862659532716478010 6260 3880245750910942198158465793549050643147723479955672632110054161976725 720
Запустим системы компьютерной алгебры Maxima и введём в неё исходные данные (подробнее см. предыдущий пример).
extgcd.
(%i6) [u1,u2,v]:igcdex(e1,e2);
(%o6) [- 185750, 169131, 1]
power_mod, которая при возведении в отрицательную степень автоматически находит элемент, обратный по модулю:
(%i7) m:mod(power_mod(c1,u1,N) * power_mod(c2,u2,N),N);
(%o7) 17109930102028242618171032184099141023232413249933
18272110992310172310331523109923101326101410991299
14121527281899283727413399142421211926241299273410
Теперь, используя таблицу 6.1 (см. лекцию 6), нетрудно прочитать зашифрованный текст:
ЗА ФАКТОРИЗАЦИЮ ДАННОГО ЧИСЛА НАЗНАЧЕНА НАГРАДА В ДВЕСТИ ТЫСЯЧ ДОЛЛАРОВ США
Действительно, за разложение на множители данного модуля положена награда в 200~000 долларов США. Маловероятно, что такая награда была бы назначена, если бы операция факторизации чисел такого размера была бы легкой задачей. Приведенный пример показывает, что криптосистема хоть и была построена на основе числа, надежность которого оценивается столь большой суммой, из-за неверной реализации и нарушения правил безопасного использования алгоритма RSA была проведена успешная атака на такую систему.
Исходные~данные:
$$N_{1}=$$ 2620595590763345144693186700359738170637959124766023390552357 7708743486405826754889134908712878889866426949841420594546127374968746 3704691027597982381045792187752115484056255124356418017823267456319147 0945512881726415778968582505568195308039434983677266976473866499763291 3738820183706821310507433203861937132913052549942960788848335390037394 6608954216027382001077261982166703560129855861608144340546877016429583 9526450906080526730620279528287119758899389543943591998158763938922196 8046758300050695830713985416717597991930870022544853965458777962931909 648137289765408375166634394924214994296219013143450580985614906283;
$$N_{2 } =$$ 1404373956322280634703446579661705045380233929445038795196910 8939191622721351334042117943027988219739179215127857273262112408720857 5085635334263838298981285414802497708344255137307727529188557129111432 3963768294617167632028510681829911856058478660674376664320832126316894 7606402829166495400694730956929734685472783298926965979178579784105662 8153673135054858125822469223977739610372727151870093086752152869771307 3467493421736819899669678212641557159981424135655309012610054286808387 9520929487076060467246719139718422376341840235179419394933429027866125 906378222980586843220420100138771858151139634024553669934223886607;
$$N_{3} =$$ 1678762549783158397789297902611957781442911408001435228447125 0202063154360775415905721304251931956720446037943647416174134426911566 5212990059682834427697301545254518302708049934908529962522695547077196 3230698471528227970703734830356915746959604252425636041283401479887740 4322176725761721902946480880822193710599559142350970463792284136048849 7544583768616918174829041738653440422210516040921622855920557488080866 4309140695930461054347617641431967212377776787337055888304116258297846 9227591560752572050022468537356199792558856097689011471958919584692498 500245987683611873312532240213872073959474934338996846004302775537;
$$C_1=$$ 4927139668939115071182968571701562304473718670620554307010688 1062090413635818301115427131412979009259007051009291844710074543775650 6516091527776544977721235554003704444593860610457655753309542143091955 7022261909268967057374961078768152217628589481286924844350506066728881 1473812492507877737379593844465799176180271907072851233493907805067518 8437332715271665418501912559134109018864658897093701890552483116702122 6061148157077899368221090313561236504179559243208369732033772455827306 9885989713330049648986010254199574027123751067293726506915040515035321 29413622932103918478494329377614278246377310198475360664888159698
$$C_2=$$ 3968904170996511074822512049317096671468123928927710698588786 2347631886514250093559580298720231340125645657836036173135232353725327 1463638334669264317836171769199659586183542349898954031121711885587682 9157809932216110967296980031363470360774569191729660576200413662944516 2239552010112356886221078835918681512698544646875041376476380679149594 6228326687802420878384865328494980645673174579578595475235815167063272 6383360324448016877640031260359897273404846113595628745775834042432714 2510945980040123373707520807207125269432787473039210714621060676962495 55526071081634210584640898292343334109384890322861662213339826806
$$C_3=$$ 2693434464101963658612411044117300168679280228386801221153426 9534648413073139833416490884467353782556651124872003929791054528059521 9750178127743617105872428304027181612949559624296295303659876228036366 1172080005585577843506210407098282557890991077271720540702078785134336 4204874516864307636270232905646677124930139153281613748156352379189398 0516732942593222620332350649515771205783855908682127130916311303600896 2726424558876252115570834611302696707152581624589109290455282184973051 7701394206986426270816677531308584524442338494896621843059785765006275 39756315409235915749943340705460409673942434752665551704951603699
$$e=3$$. Найдём сообщение $$m$$.
Запустим систему компьютерной алгебры Maxima и введём в неё исходные данные.
chinese.
(%i8) mcube:chinese([c1,c2,c3],[N1,N2,N3]);
(%o8) 1439619746877070775526192128945758968992165680996
3966572720001979003084347216085169846710176736442
2607102784602056703967564355254187236240029273958
5244623799154989886682303658655987332618285682692
1673617098179274483891388669524107519774675750988
5071342316383704181434566679343998766513563861662
3709617247882929434704037023359692069389958441799
9598227129708607068497886977208029397728335933695
8553982958213317414845600724816716404544112021449
4656103946055056386082865741853419774396410771345
3805185312405889293788831589145513935021181672031
6464546892480620465275275072448707709191544241239
3719042339415429661220875253048244629952
(%i9) m:inrt(mcube,3);
(%o9) 1129143828159925261514152138232499122318221028152
1382337992526189912371124261599251026102215282624
1299341830262427182728152237991099282499121034159
9272424113515231815991415341830262940289918992526
24331828104028
(%i10) m^3-mcube;
(%o10) 0
Вновь декодируем результат по таблице 6.1 (см. лекцию 6):
БУДЬТЕ ПРЕДЕЛЬНО ВНИМАТЕЛЬНЫ ПРИ ВЫБОРЕ ПАРАМЕТРОВ ШИФРОСИСТЕМЫ А ТО ВАШЕ СООБЩЕНИЕ ДЕШИФРУЮТ И ПРОЧИТАЮТ
См. [2]
Схема рюкзака несложна. Дана куча предметов различной массы, можно ли положить некоторые их этих предметов в рюкзак так, чтобы масса рюкзака стала равна определенному значению? Более формально: дан набор значений $$M_1, M_2, \ldots, M_n$$ и сумма $$S$$. Нужно вычислить значения $$b_i$$ такие, что $$S=b_1 M_1 + b_2 M_2 +\ldots+ b_n M_n$$, где $${b}_{i}$$ может быть либо нулем, либо единицей. Единица показывает, что предмет кладут в рюкзак, а ноль - что не кладут.
Например, массы предметов могут иметь значения 1, 5, 6, 11, 14 и 20. Вы можете упаковать рюкзак так, чтобы его масса стала равна 22, использовав массы 5, 6 и 11. Невозможно упаковать рюкзак так, чтобы его масса была равна 24. В общем случае время, необходимое для решения этой проблемы, с ростом количества предметов в куче растет экспоненциально.
В основе алгоритма рюкзака Меркла-Хеллмана лежит идея шифровать сообщение как решение набора проблем рюкзака. Предметы из кучи выбираются с помощью блока открытого текста, по длине равного количеству предметов в куче (биты открытого текста соответствуют значениям $$b_i$$), а шифртекст является полученной суммой. Пример шифртекста, зашифрованного с помощью рюкзака в таблице 8.2.
| Открытый текст | 111001 | 010110 | 000000 | 011000 |
| Рюкзак | 1,5,6,11,14,20 | 1,5,6,11,14,20 | 1,5,6,11,14,20 | 1,5,6,11,14,20 |
| Шифртекст | 1+5+6+20=32 | 1+11+14=30 | 0=0 | 5+6=11 |
На самом деле существуют две различные проблемы рюкзака, одна решается за линейные время, а другая, как считается,нет. Легкую проблему можно превратить в трудную. Открытый ключ предоставляет собой трудную проблему, которую легко использовать для шифрования, но невозможно для расшифрования сообщений. Закрытый ключ является легкой проблемой, давая простой способ расшифровать сообщения. Тому, кто не знает закрытый ключ, придется попытаться решить трудную проблему рюкзака.
Если перечень масс представляет собой сверхвозрастающую последовательность, то полученную проблему рюкзака легко решить. Сверхвозрастающая последовательность - это последовательность, в которой каждой член больше суммы всех предыдущих членов. Например, последовательность {1,3,6,13,27,52} является сверхвозрастающей, а {1,3,4,9, 15,25} - нет.
Решение сверхвозрастающего рюкзака найти легко. Возьмите полный вес и сравните его с самым большим числом последовательности. Если полный вес меньше, чем это число, то его не кладут в рюкзак. Если полный вес больше или равен этому числу, то оно кладется в рюкзак. Уменьшим массу рюкзака на это значение и перейдем к следующему по величине числу последовательности. Будем повторять, пока процесс не закончится. Если полный вес уменьшится до нуля, то решение найдено. В противном случае нет.
Например, пусть полный вес рюкзака - 70, а последовательность весов {2,3,6, 13,27,52}. Самый большой вес, 52, меньше 70, поэтому кладем 52 в рюкзак. Вычитая 52 из 70, получаем 18. Следующий вес - 27, больше 18, поэтому 27 в рюкзак не кладется. Вес 13, меньше 18, поэтому кладем 13 в рюкзак. Вычитая 13 из 18, получаем 5. Следующий вес - 6, больше 5, поэтому 6 не кладется в рюкзак. Продолжение этого процесса покажет, что и 2, и 3 кладутся в рюкзак, и полный вес уменьшается до 0, что сообщает о найденном решении. Если бы это был блок шифрования методом рюкзака Меркла-Хеллмана, открытый текст, полученный из значения шифртекста 70, был бы равен 110101.
Не сверхвозрастающие, или нормальные, рюкзаки представляют собой трудную задачу - быстрого алгоритма для них не найдено. Единственным известным способом определить, какие предметы кладутся в рюкзак, является методическая проверка возможных решений, пока вы не наткнетесь на правильное . Самый быстрый алгоритм, принимая во внимание различную эвристику, имеет экспоненциальную зависимость от числа возможных предметов. Если добавить к последовательности весов еще один член, то найти решение станет вдвое труднее. Это намного труднее сверхвозрастающего рюкзака, где, если вы добавите один предмет к последовательности, поиск решения увеличится на одну операцию.
Алгоритм Меркла-Хеллмана основан на этом свойстве. Закрытый ключ является последовательностью весов проблемы сверхвозрастающего рюкзака. Открытый ключ - это последовательность весов проблемы нормального рюкзака с тем же решением. Меркл и Хеллман, используя модульную арифметику, разработали способ преобразования проблемы сверхвозрастающего рюкзака в проблему нормального рюкзака.
Рассмотрим работу алгоритма. Чтобы получить нормальную последовательность рюкзака, возьмем сверхвозрастающую последовательность рюкзака, например, {2,3,6,13,27,52}, и умножим по модулю $$m$$ все значения на число $$n$$. Значение модуля должно быть больше суммы всех чисел последовательности, например, 105. Множитель должен быть взаимно простым числом с модулем, например, 31. Нормальной последовательностью рюкзака будет
$$2\cdot 31 ~(\mod 105) = 62, \\ 3\cdot 31 ~(\mod 105) = 93, \\ 6\cdot 31 ~(\mod 105) = 81, \\ 13\cdot 31 ~(\mod 105) = 88, \\ 27\cdot 31 ~(\mod 105) = 102, \\ 52\cdot 31 ~(\mod 105) = 37. $$Итого - {62,93,81,88,102,37}.
Сверхвозрастающая последовательность рюкзака является закрытым ключом, а нормальная последовательность рюкзака - открытым.
Для шифрования сообщение сначала разбивается на блоки, равные по длине числу элементов последовательности рюкзака. Затем, считая, что единица указывает на присутствие члена последовательности, а ноль - на его отсутствие, вычисляем полные веса рюкзаков - по одному для каждого блока сообщения.
Например, если сообщение в бинарном виде выглядит как 011000110101101110, шифрование, использующее предыдущую последовательность рюкзака, будет происходить следующим образом:
Шифртекстом будет последовательность 174,280,333.
Законный получатель данного сообщения знает закрытый ключ: оригинальную сверхвозрастающую последовательность, а также значения $$n$$ и $$m$$, использованные для превращения ее в нормальную последовательность рюкзака. Для расшифрирования сообщения получатель должен сначала определить обратный к $$n$$ по модулю $$m$$. Каждое значение щифротекста умножается на $$n^{-1}~(\mod m)$$, а затем разделяется с помощью закрытого ключа, чтобы получить значения открытого текста.
Для расшифрования используется выбранная ранее сверхвозрастающая последовательность {2, 3, 6, 13, 27, 52} с $$m=105$$, $$n = 31$$. Шифртекстом служит 174,280,333. В этом случае $$n^{-1}=61 ~(\mod m)$$, поэтому значения шифртекста должны быть умножены на 61 по модулю 105.
Расшифрованным открытым текстом является 011000 110101 101110.
Для последовательности из шести элементов нетрудно решить задачу рюкзака, даже если последовательность не является сверхвозрастающей. Реальные рюкзаки должны содержать не менее 250 элементов. Длина каждого члена сверхвозрастающей последовательности должна быть где-то между 200 и 400 битами, а длина модуля должна быть от 100 до 200 битов. Для получения этих значений практические реализации используют генераторы псевдослучайной последовательности.
Одним из наиболее стойких к криптографическим атакам является алгоритм Блюма-Блюма-Шуба (BBS). Главное его достоинство состоит в том, что строго доказано, что не существует алгоритма с полиномиальной оценкой времени его выполнения, который по любым $$k$$ битам выходной последовательности может предсказать ее $$(k+1)$$-й бит с вероятностью, существенно большей, чем 0,5.
Пусть $$p$$ и $$q$$ - два больших простых числа примерно одинакового размера, причем
$$p{\equiv}3~(\mod 4),q{\equiv}3~(\mod 4).$$Тогда число $$n=\mathit{pq}$$ называется целым числом Блюма. Пусть $$\mathbb{Z}_n^\ast$$ - мультипликативная группа кольца вычетов по модулю $$n$$, $$Q{R}_{n}$$ - подгруппа её квадратов. Имеем:
$$\left|\mathbb{Z}_n^\ast\right|=\varphi \left(n\right)=\left(p-1\right)\left(q-1\right),\left|Q{R}_{n}\right|=(p-1)(q-1)/4.$$Каждый квадрат из $$Q{R}_{n}$$ имеет ровно четыре квадратных корня в $$\mathbb{Z}_n^\ast$$, и лишь один из них, называемый примитивным, лежит в $$Q{R}_{n}$$.
Пример 8.11 Если $$p=19,q=23$$, то $$n=437$$. Тогда $$133=19{\cdot}7{\notin}\mathbb{Z}_{437}^\ast$$, $$135{\in}\mathbb{Z}_{437}^\ast$$, $$139{\in}\mathbb{Z}_{437}^\ast$$, кроме того, учитывая, что корня из 135 по модулю 437 не существует, а $${24}^{2}=139~(\mod 437)$$, имеем:
$$135{\notin}Q{R}_{437},139{\in}Q{R}_{437}.$$Квадратными корнями из 139 по модулю 437 являются числа 24, 185, 252 и 413, причем 24 является примитивным, поскольку $${47}^{2}=24~(\mod 437)$$.
Задача определения примитивных квадратных корней по модулю числа $$n$$ вычислительно эквивалентна задаче разложения этого числа на множители. Таким образом, функция
$$f\left(x\right)={x}^{2}~(\mod n)$$эффективно вычисляется, а произвести обратное преобразование может только тот, кто знает секрет - разложение $$f(x)$$ на множители. Таким образом, $$f(x)$$ - односторонняя функция с секретом.
Опишем теперь алгоритм генерации случайной последовательности чисел.
Пусть $$n$$ - целое число Блюма.
Выберем в качестве инициализирующего вектора случайное число $${x}_{0}{\in}Q{R}_{n}$$. Для этого возведём случайное число $$x{\in}\mathbb{Z}_n^\ast$$ в квадрат.
Важным достоинством этого генератора является то, что при знании разложения $$n$$ на простые множители он допускает прямое определение отдельных битов, которые в нём вырабатываются. Имеем:
$${x}_{i}={x}_{0}^{{2}^{i}}~(\mod n),$$причем $${x}^{(p-1)(q-1)}=1~(\mod n)$$, поэтому
$${x}_{i}={x}_{0}^{{2}^{i}}~(\mod (p-1)(q-1)),$$то есть с помощью двух операций модульного возведения в степень, которые эффективно вычисляются, любое число $${x}_{i}$$ может быть найдено лишь исходя из начального вектора $${x}_{0}$$ и индекса $$i$$.
Термин вероятностное шифрование был введён Ш. Гольдвассер и С. Микали, и ими же была предложена первая схема такого шифрования, основанная на использовании BBS-генератора в качестве источника ключевой последовательности. Данная схема не обеспечивает секретности по отношению к атаке на основе выбранного шифртекста.
Пусть исходное сообщение $$t$$ - $m$-разрядная битовая последовательность, $${x}_{0}$$ - случайный квадратичный вычет по модулю $$n$$. Функция шифрования по схеме Гольдвассер-Микали имеет вид:
$$c=\left({x}_{m},t{\oplus}\mathit{BB}{S}_{n,m}\left({x}_{0}\right)\right),$$при этом $${x}_{m}$$ включается в шифртекст для того, чтобы законный получатель мог его расшифровать. При этом для расшифровки вычисляется $${x}_{0}$$ по следующему алгоритму:
$$\alpha ={\left(\frac{p+1}{4}\right)}^{m}~(\mod \left(p-1\right)),\\ \beta ={\left(\frac{q+1}{4}\right)}^{m}~(\mod \left(q-1\right)),\\ u={\left({x}_{m}~(\mod p)\right)}^{\alpha }~(\mod p),\\ v={\left({x}_{m}~(\mod q)\right)}^{\beta }~(\mod q),\\ {x}_{0}=(apv+bqu) ~(\mod n), $$где $$a$$ и $$b$$ находятся расширенным алгоритмом Евклида: $$ap+bq=1$$.
Пример 8.12 Каждой букве русского алфавита (отождествим Е и Ё) поставим в соответствие её порядковый номер в двоичной записи:
$$\text{А} = 00000,\quad \text{Б} = 00001,\quad \text{В} = 00010, \quad {\dots}, \quad \text{Я} = \ 11111.$$Зашифруем слово "шифр" по алгоритму вероятностного шифрования.
Используя приведенную схему кодирования, получаем:
$$t=11000010001010010000.$$Выберем простые числа: $$p=100699,q=100943$$. Тогда $$n=10164859157$$. Возьмём случайный квадратичный вычет $${x}_{0}=2081895771$$ по модулю $$n$$. Последовательно возводя его в квадрат, получаем:
|
|
Получаем шифртекст: $$c=(9863050867,01110111101111000011)$$.
Пример 8.13 Шифртекст $$c$$ получен из слова в алфавите А, Б, ..., Я по схеме вероятностного шифрования с использоваем открытого ключа $$n=pq$$. Найти открытый текст. $$p=101987$$, $$q=101267$$, $$c = (9775365428, 11010000001111001000)$$.
Имеем $$m=19$$, $$n=pq = 101987 \cdot 101267 = 10327917529$$.
Расшифровку проведем по алгоритму (8.1):
1) Вычисляем $$\alpha$$ и $$\beta$$:
$$\alpha=\left(\frac{101987+1}{4}\right)^{19} ~ \mod (101987-1)=68875,$$ $$\beta=\left(\frac{101267+1}{4}\right)^{19} ~ \mod (101267-1)=48149.$$2) Находим $$u$$ и $$v$$:
$$u=(9775365428 \mod 101987)^{68875} ~ \mod 101987=101358;$$ $$v=(9775365428 \mod 101267)^{48149} ~ \mod 101267=25104.$$3) С помощью алгоритма Евклидва найдём целые числа $$a$$ и $$b$$ такие, что $$ap+bq=1$$, т.е. $$a=p^{-1}(\mod q)$$, $$b=q^{-1}(\mod p)$$. Получаем: $$a=5204$$, $$b=-5241$$.
4) Находим $$x_0$$:
$$x_0=(5204\cdot 101987\cdot 25104+(-5241)\cdot 101267\cdot 101358) ~ \mod 10327917529=4034401117.$$Теперь вычисляем $$x_1, \ldots, x_{19}$$:
|
|
Прибавляя поразрядно последовательность $$x_0 ~(\mod 2)$$, $$x_1 ~(\mod 2)$$, $$\ldots$$, $$x_{19} ~(\mod 2)$$ к шифрограмме, получаем код исходного сообщения:
| $$x_i~(\mod 2)$$ | 11000 | 01110 | 10101 | 00010 |
| шифрограмма | 11010 | 00000 | 11110 | 01000 |
| сумма | 00010 | 01110 | 01011 | 01010 |
| открытый текст | В | О | Л | К |
Опишем аналоги некоторых широко распространенных систем с открытым ключом, основанные на задаче дискретного логарифмирования на эллиптической кривой, определенной над конечным полем $${F}_{q}$$.
Предположим, что абоненты А и Б хотят договориться о ключе, которым будут впоследствии пользоваться в некоторой классической криптосистеме. Прежде всего, они открыто выбирают какое-либо конечное поле $${F}_{q}$$ ($$q=p^r$$) и какую-либо эллиптическую кривую $$E$$ над ним. Их ключ строится по случайной точке $$P$$ на этой эллиптической кривой. Если у них есть случайная точка $$P$$, то, например, ее $$x$$-координата дает случайный элемент $${F}_{q}$$, который можно затем преобразовать в $$r$$-разрядное целое число в $$p$$-ричной системе счисления, и это число может служить ключом в их классической криптосистеме. Они должны выбрать точку $$P$$ так, чтобы все их сообщения друг другу были открытыми и все же никто, кроме них двоих, ничего бы не знал о $$P$$.
Абоненты (пользователи) А и Б первым делом открыто выбирают точку $$G\in E$$ в качестве "основания". Чтобы образовать ключ, абонент А вначале случайным образом выбирает целое число $$a$$, это число он держит в секрете. Он вычисляет $$aG\in E$$ и передает эту точку открыто. Абонент Б делает то же самое: он выбирает случайно $$b$$ и открыто передает $$bG\in E$$. Тогда используемый ими секретный ключ - это $$P=abG\in E$$. Оба пользователя могут вычислить этот ключ. Например, абонент А знает $$bG$$ (точка была передана открыто) и свое собственное секретное a. Однако любая третья сторона знает лишь $$aG$$ и $$bG$$. Кроме решения задачи дискретного логарифмирования - нахождения $$a$$ по $$G$$ и $$aG$$ (или нахождения $$b$$ по $$G$$ и $$bG$$) - по-видимому, нет способа найти $$abG$$, зная лишь $$aG$$ и $$bG$$.
Пример 8.14 Возьмём эллиптическую кривую $$E_p(0,-4)$$, где $$p=211$$, и точку $$G=(2,2)$$. Произведём обмен ключами.
Личным ключом пользователя А является $$a = 121$$, поэтому его открытым ключом будет $$aG =121\cdot (2, 2) = (115, 48)$$. Личным ключом пользователя Б является $$b = 203$$, поэтому его открытым ключом будет $$bG=203\cdot (2, 2) = (130, 203)$$. Общим секретным ключом является
$$abG = 121(130, 203) = 203(115, 48) = (161,169).$$Общий секретный ключ представляет собой пару чисел. Если этот ключ предполагается использовать в качестве сеансового ключа для традиционного шифрования, то из этой пары чисел необходимо генерировать одно подходящее значение. Можно, например, использовать просто координату $$x$$ или некоторую простую функцию от $$x$$.
Как и в описанной выше системе ключевого обмена, мы исходим из несекретных данных:
Каждый из пользователей выбирает случайное целое число: $$a_\text{А}$$ - у пользователя А, и $$a_\text{Б}$$ - у пользователя Б, которое пользователь держит в секрете. Затем пользователи А и Б вычисляют точки, соответственно, $$a_\text{А} G$$ и $$a_\text{Б} G$$.
Чтобы послать пользователю Б сообщение $$P_m$$, пользователь А выбирает случайно целое число $$k$$ и посылает пару точек $$\{kG, P_m+k a_{\text{Б}} G$$ (где $$a_{\text{Б}} G$$ - открытый ключ пользователя Б). Чтобы прочитать сообщение, пользователь Б умножает первую точку из полученной пары на свое секретное число $$a_\text{Б}$$ и вычитает результат умножения из второй точки:
$$P_m + ka_\text{Б} G - a_\text{Б} kG.$$Таким образом, пользователь А посылает замаскированное сообщение $$P_m$$ вместе с "подсказкой" $$kG$$, при помощи которой можно снять "маску" $$ka_\text{Б} G$$, если знать секретное число $$a_\text{Б}$$. Злоумышленник, который умеет решать задачу дискретного логарифмирования на $$E$$, может, конечно, найти $$a_\text{Б}$$, зная $$a_\text{Б} G$$ и $$G$$.
Пример 8.15 Рассмотрим кривую $$E_p(-1,188)$$ с $$p = 751$$ (что соответствует кривой $$y^2 = x^3-x+188$$) и точкку $$G=(0, 376)$$. Предположим, что пользователь А собирается отправить пользователю Б сообщение, которое кодируется эллиптической точкой $$P_m=(562,201)$$, и что пользователь А выбирает случайное число $$k= 386$$. Открытым ключом пользователя Б является $$P_{\text{Б}} = (201,5)$$.
Мы имеем
$$386(0,376) = (676,558),\qquad (562,201) + 386(201, 5) = \ (385, 328).$$Таким образом, пользователь А должен послать шифрованный текст: {(676, 558), (385, 328)}.
См. [3]
Перед шифрованием необходимо выбрать способ кодирования текста. Для этого найдем точки на кривой и некоторым из них поставим в соответствие символы.
Выберем кривую $$E_{751}(-1,1)$$, т. е. $$y^2=x^3-x+1 ~(\mod 751)$$. Таблица 8.3 задаёт соответствие символов и некоторых точек кривой.
| № | Символ | Точка | № | Символ | Точка | № | Символ | Точка |
|---|---|---|---|---|---|---|---|---|
| 1 | пробел | (33, 355) | 54 | U | (80, 433) | 107 | Л | (200, 721) |
| 2 | ! | (33, 396) | 55 | V | (82, 270) | 108 | М | (203, 324) |
| 3 | " | (34, 74) | 56 | W | (82, 481) | 109 | Н | (203, 427) |
| 4 | # | (34, 677) | 57 | X | (83, 373) | 110 | О | (205, 372) |
| 5 | $ | (36, 87) | 58 | Y | (83, 378) | 111 | П | (205, 379) |
| 6 | % | (36, 664) | 59 | Z | (85, 35) | 112 | Р | (206, 106) |
| 7 | (39, 171) | 60 | [ | (85, 716) | 113 | С | (206, 645) | |
| 8 | ' | (39, 580) | 61 | \ | (86,25) | 114 | Т | (209, 82) |
| 9 | ( | (43, 224) | 62 | ] | (86, 726) | 115 | У | (209, 669) |
| 10 | ) | (43, 527) | 63 | $$\widehat{\hphantom{-}}$$ | (90,21) | 116 | Ф | (210, 31) |
| 11 | * | (44, 366) | 64 | _ | (90, 730) | 117 | Х | (210, 720) |
| 12 | + | (44, 385) | 65 | ' | (93, 267) | 118 | Ц | (215, 247) |
| 13 | , | (45, 31) | 66 | a | (93, 484) | 119 | Ч | (215, 504) |
| 14 | - | (45, 720) | 67 | b | (98, 338) | 120 | Ш | (218,150) |
| 15 | . | (47, 349) | 68 | c | (98, 413) | 121 | Щ | (218, 601) |
| 16 | / | (47, 402) | 69 | d | (99, 295) | 122 | Ъ | (221, 138) |
| 17 | 0 | (48,49) | 70 | e | (99, 456) | 123 | Ы | (221, 613) |
| 18 | 1 | (48, 702) | 71 | f | (100, 364) | 124 | Ь | (226, 9) |
| 19 | 2 | (49, 183) | 72 | g | (100, 387) | 125 | Э | (226, 742) |
| 20 | 3 | (49, 568) | 73 | h | (102, 267) | 126 | Ю | (227, 299) |
| 21 | 4 | (53, 277) | 74 | i | (102, 484) | 127 | Я | (227, 452) |
| 22 | 5 | (53, 474) | 75 | j | (105, 369) | 128 | а | (228, 271) |
| 23 | 6 | (56, 332) | 76 | k | (105,382) | 129 | б | (228, 480) |
| 24 | 7 | (56, 419) | 77 | l | (106, 24) | 130 | в | (229, 151) |
| 25 | 8 | (58, 139) | 78 | m | (106, 727) | 131 | г | (229, 600) |
| 26 | 9 | (58, 612) | 79 | n | (108, 247) | 132 | д | (234, 164) |
| 27 | : | (59, 365) | 80 | o | (108, 504) | 133 | е | (234, 587) |
| 28 | ; | (59, 386) | 81 | p | (109, 200) | 134 | ж | (235, 19) |
| 29 | < | (61, 129 | 82 | q | (109, 551) | 135 | з | (235, 732) |
| 30 | = | (61, 622) | 83 | r | (110, 129) | 136 | и | (236, 39) |
| 31 | > | (62, 372) | 84 | s | (110, 622) | 137 | й | (236, 712) |
| 32 | ? | (62, 379) | 85 | t | (114, 144) | 138 | к | (237, 297) |
| 33 | @ | (66, 199) | 86 | u | (114, 607) | 139 | л | (237, 454) |
| 34 | A | (66, 552) | 87 | v | (115, 242) | 140 | м | (238, 175) |
| 35 | B | (67,84) | 88 | w | (115, 509) | 141 | н | (238, 576) |
| 36 | C | (67, 667) | 89 | x | (116, 92) | 142 | о | (240, 309) |
| 37 | D | (69, 241) | 90 | y | (116, 659) | 143 | п | (240, 442) |
| 38 | E | (69, 510) | 91 | z | (120, 147) | 144 | р | (243, 87) |
| 39 | F | (70, 195) | 92 | { | (120, 604) | 145 | с | (243, 664) |
| 40 | G | (70, 556) | 93 | _ | (125, 292) | 146 | т | (247, 266) |
| 41 | H | (72, 254) | 94 | } | (125, 459) | 147 | у | (247, 485) |
| 42 | I | (72, 497) | 95 | $$\sim$$ | (126, 33) | 148 | ф | (249, 183) |
| 43 | J | (73,72) | 96 | А | (189, 297) | 149 | х | (249, 568) |
| 44 | K | (73, 679) | 97 | Б | (189, 454) | 150 | ц | (250, 14) |
| 45 | L | (74, 170) | 98 | В | (192, 32) | 151 | ч | (250, 737) |
| 46 | M | (74, 581) | 99 | Г | (192, 719) | 152 | ш | (251, 245) |
| 47 | N | (75, 318) | 100 | Д | (194, 205) | 153 | щ | (251, 506) |
| 48 | O | (75, 433) | 101 | Е | (194, 546) | 154 | ъ | (253, 211) |
| 49 | P | (78, 271) | 102 | Ж | (197, 145) | 155 | ы | (253, 540) |
| 50 | Q | (78, 480) | 103 | З | (197, 606) | 156 | ь | (256, 121) |
| 51 | R | (79, 111) | 104 | И | (198, 224) | 157 | э | (256, 630) |
| 52 | S | (79, 640) | 105 | Й | (198, 527) | 158 | ю | (257, 293) |
| 53 | T | (80, 318) | 106 | К | (200, 30) | 159 | я | (257, 458) |
Заметим, что мощность множества точек на этой кривой $$N= 727$$, поэтому при необходимости можно точками закодировать и некоторые специальные знаки (например, знак интеграла и т. п.), а также целые слова.
Приведем примеры решения контрольных заданий, представленных ниже.
Пример 8.16 (Шифрование) Пусть выбрана генерирующая точка $$G = (0, 1)$$. Предположим, пользователь $$A$$ решил отправить пользователю $$B$$ сообщение: строчную латинскую букву "A". В нашем алфавите эта буква кодируется точкой $$P_m = (66, 522)$$. Пусть пользователь $$A$$ выбрал случайное значение $$k = 3$$, а открытым ключом $$B$$ является точка $$P_B = (406, 397)$$, при этом секретным ключом $$B$$ является число $$n_b=45$$.
Шифрованный текст имеет вид $$C_m = \{kG, P_m+ k P_B\}$$.
Находим $$kG = 3\cdot (0,1) = (56, 419)$$.
Вычисляем $$P_m+kP_b = (66, 552) + 3\cdot (406, 397) = (301, 734)$$.
В результате: $$C_m= \{(56, 419), (301, 734)\}$$.
Пользователь $$B$$ для расшифрования сообщения должен провести следующие вычисления:
$$P_m + kP_B - n_BkG = P_m + k(n_BG)- nBkG = (301, 734) - 45 \cdot (56, 419) = (301, 734) + (175, 559) = (66, 552).$$После этого пользователь B по алфавиту определяет открытый буквенный текст: точке (66, 552) соответствует строчная латинская буква A.
Пример 8.17 Кривая: $${E}_{751}(-1,1)$$
Генерирующая точка: $$G=\left(0,1\right)$$
Открытый текст: "терновник"
Открытый ключ: $$(188,93)$$
Значения случайных чисел $$k$$ для букв открытого текста: $$8, 14, 17, 17, 2, 10, 8, 2, 2$$.
Установим соответствие точек кривой буквам:
| т $$\rightarrow$$ (247, 266) | н $$\rightarrow$$ (238, 576) | н $$\rightarrow$$ (238, 576) |
| е $$\rightarrow$$ (234, 587) | о $$\rightarrow$$ (240, 309) | и $$\rightarrow$$ (236, 39) |
| р $$\rightarrow$$ (243, 87) | в $$\rightarrow$$ (229, 151) | к $$\rightarrow$$ (237, 297) |
Расчёт:
| $${C}_{1}=\left\{\mathit{kG},{P}_{m}+k{P}_{B}\right\}=\left\{8{\cdot}\left(0,1\right),\left(247,266\right)+8{\cdot}(188,93)\right\} = = \left\{\left(346,242\right),\left(247,266\right)+(72,254)\right\}=\left\{\left(346,242\right),(594,414)\right\}$$; |
| $${C}_{2}=\left\{14{\cdot}\left(0,1\right),\left(234,587\right)+14{\cdot}(188,93)\right\}=\left\{\left(596,433\right),\left(234,587\right)=(416,55)\right\} = = \left\{\left(596,433\right),(34,677)\right\}$$; |
| $${C}_{3}=\left\{17{\cdot}\left(0,1\right),\left(243,87\right)=17{\cdot}(188,93)\right\}=\left\{\left(440,539\right),\left(243,87\right)+(665,153)\right\}= =\left\{\left(440,539\right),(546,670)\right\}$$; |
| $${C}_{4}=\left\{17{\cdot}\left(0,1\right),\left(238,576\right)+17{\cdot}(188,93)\right\} = = \left\{\left(440,539\right),\left(238,576\right)+(665,153)\right\}=\left\{\left(440,539\right),(694,581)\right\}$$; |
| $${C}_{5}=\left\{2{\cdot}\left(0,1\right),\left(240,309\right)+(188,93)\right\}=\left\{\left(188,93\right),\left(240,309\right)+(16,416)\right\}= = \left\{\left(188,93\right),(515,684)\right\}$$; |
| $${C}_{6}=\left\{10{\cdot}\left(0,1\right),\left(229,151\right)+10{\cdot}(188,93)\right\} = = \left\{\left(377,456\right),\left(229,151\right)+(657,285)\right\}=\left\{\left(377,456\right),(517,573)\right\}$$; |
| $${C}_{7}=\left\{8{\cdot}\left(0,1\right),\left(238,576\right)+8{\cdot}(188,93)\right\}=\left\{\left(346,242\right),\left(238,576\right)+(72,254)\right\}= = \left\{(346,242),(288,639)\right\}$$; |
| $${C}_{8}=\left\{2{\cdot}\left(0,1\right)\left(236,39\right)+2{\cdot}(188,93)\right\}=\left\{\left(188,93\right),\left(236,39\right)+(16,416)\right\} = = \left\{(188,93),(209,82)\right\}$$; |
| $${C}_{9}=\left\{2{\cdot}\left(0,1\right),\left(237,297\right)+2{\cdot}(188,93)\right\}=\left\{\left(188,93\right),\left(237,297\right)\right.+ \left.(16,416)\right\} = \left\{\left(188,93\right),(205,379)\right\}$$. |
Установим соответствие букв и точек шифрованного текста:
| Т | (346, 242), (594, 414) |
| е | (596, 433), (34, 677) |
| р | (440, 539), (546, 670) |
| н | (440, 539), (694, 581) |
| о | (188, 93), (515, 684) |
| в | (377, 456), (517, 573) |
| н | (346, 242), (288, 639) |
| и | (188, 93), (209, 82) |
| к | (188, 93), (205, 379) |
Шифртекст: {(346, 242), (594, 414)}; {(596, 433), (34, 677)}; {(440, 539), (546, 670)}; {(440, 539), (694, 581)}; {(188, 93), (515, 684)}; {(377, 456), (517, 573)}; {(346, 242), (288, 639)}; {(188, 93), (209, 82)}; {(188, 93), (205, 379)}.
Пример 8.18 (Расшифрование) Входные данные.
Кривая: $${E}_{751}(-1,1)$$
Генерирующая точка: $$G = (-1,1)$$
Шифртекст: {(377, 456), (367, 360)}, {(425, 663), (715, 398)}; {(188, 93), (279, 353)}, {(179, 275), (128,79)}; {(568, 355), (515, 67)}, {(568, 355), (482, 230)}; {(377, 456), (206, 645)}, {(188, 93), (300, 455)}; {(489, 468), (362, 446)}, {(16, 416), (69, 510)}; {(425, 663), (218,601)}.
Секретный ключ: $${n}_{B} = 44$$.
Расчёт:
| $${X}_{1} = {P}_{m} + kP_{B} - {n}_{B} \cdot (kG) = ( 367, 360) - 44 \cdot (377, 456) = (235, 732) \rightarrow \text{ "з" }$$ |
| $${X}_{2} = (715, 938) - 44 \cdot (425, 663) = (228, 271) \rightarrow \text{"а"}$$ |
| $${X}_{3} = (279, 353) - 44 \cdot (188, 93) = (240, 309) \rightarrow \text{"о"}$$ |
| $${X}_{4} = (128, 79) - 44 \cdot (179, 275) = (243, 664) \rightarrow \text{"с" }$$ |
| $${X}_{5} = (515, 67) - 44 \cdot (568, 355) = (247, 266) \rightarrow \text{"т"}$$ |
| $${X}_{6} = (482, 230) - 44 \cdot (568, 355) = (235, 732) \rightarrow \text{"р"}$$ |
| $${X}_{7} = (206, 645) - 44 \cdot (377, 456) = (243, 87) \rightarrow \text{"е"}$$ |
| $${X}_{8} = (300, 455) - 44 \cdot (188, 93) = (238, 576) \rightarrow \text{"н"}$$ |
| $${X}_{9} = (362, 446) - 44 \cdot (489, 468) = (238, 576) \rightarrow \text{"н"}$$ |
| $${X}_{10} = (69, 510) - 44 \cdot (16, 416) = (253, 540) \rightarrow \text{"ы"}$$ |
| $${X}_{11} = (218, 601) - 44 {\cdot} (425, 663) = (236, 712) \rightarrow \text{"й"}$$ |
Открытый текст - "заостренный".
Концепция криптографии с открытым ключом была предложена Уитфилдом Диффи (Whitfield Diffie) и Мартином Хеллманом (Martin Hellman), и, независимо от них, Ральфом Мерклом (Ralph Merkle). Основная идея заключается в том, чтобы использовать ключи парами, состоящими из ключа зашифрования и ключа расшифрования, которые невозможно вычислить один из другого.
В 1976 г. вышла основополагающая работа [1]. С этого времени было создано много алгоритмов, использующих концепцию открытых ключей. Алгоритм является общедоступным, нет необходимости в секретных каналах связи. Общая схема выглядит следующим образом:
Мы подробно представим алгоритм RSA, являющийся популярным в приложениях.
В 1978 г. появилась работа [2], в которой Рон Райвест (Ron Rivest), Ади Шамир (Adi Shamir) и Лен Адлеман (Len Adleman) предложили алгоритм с открытым ключом. Схема Райвеста-Шамира-Адлемана (RSA) получила широкое распространение.
Опишем процесс шифрования. Исходный текст должен быть переведен в числовую форму, этот метод считается известным. В результате этого текст представляется в виде одного большого числа. Затем полученное число разбивается на части (блоки) так, чтобы каждая из них была числом в промежутке $$[0, N - 1]$$ (о выборе $$N$$ - см. ниже). Процесс шифрования одинаков для каждого блока. Поэтому мы можем считать, что блок исходного текста представлен числом $$x$$, $$0\leq x < N$$.
Каждый абонент вырабатывает свою пару ключей. Для этого он генерирует два больших простых числа $$p$$ и $$q$$, вычисляет произведение $$N=p\cdot q$$. Затем он вырабатывает случайное число $$e$$, взаимно простое со значением $$\varphi(N) = (p-1)(q-1)$$ функции Эйлера от числа $$N$$, и находит число $$d$$ из условия $$e \cdot d \equiv 1 ~(\mods \varphi(N))$$. Так как $$\GCD(e,\varphi(N))=1$$, то такое число $$d$$ существует и оно единственно. Пару $$(N,e)$$ он объявляет открытым ключом и помещает в открытый доступ. Пара $$(N, d)$$ является секретным ключом. Для расшифрования достаточно знать секретный ключ. Числа $$p$$, $$q$$, $$\varphi(N)$$ в дальнейшем не нужны, поэтому их можно уничтожить.
Пользователь $$A$$, отправляющий сообщение $$x$$ абоненту $$B$$, выбирает из открытого каталога пару $$(N,e)$$ абонента $$B$$ и вычисляет шифрованное сообщение $$y=x^e ~(\mods N)$$. Чтобы получить исходный текст, абонент $$B$$ вычисляет $$y^d ~(\mods N)$$. Так как $$|\mathbb{Z}_N^{*}| = \varphi(N)=(p-1)(q-1)$$, и $$e\cdot d = 1 + k\varphi(N)$$ для некоторого целого числа $$k$$, то $$(x^e)^d = x^ed = x^{1+k\varphi(N)}=x\cdot x^{|\mathbb{Z}_N^{*}|}\equiv x ~(\mods N).$$
Пример 8.1. Построим криптосистему RSA с $$p=7$$, $$q=17$$ и зашифруем сообщение $$x=19$$.
Находим: $$N=7\cdot 17=119$$, $$\varphi(N) = 6\cdot 16 = 96$$. Выбираем значение $$e$$ с условиями $$e<96$$ и $$\GCD(e,\varphi(N))=1$$. Например, возьмём $$e=5$$. Находим $$d=e^{-1}~(\mods 96)$$. Получаем $$d=77$$, так как $$77\cdot 5 = 4\cdot 96 + 1$$. Открытый ключ: $$(119,5)$$, секретный ключ: $$(119,77)$$. Для зашифрования число $$x=19$$ возводим в степень $$5$$ по модулю $$119$$:
$$ x^e = 19^5 = 2 476 099 \equiv 66 \ (\mods 119). $$
Итак, $$y=66$$. Расшифрование даёт:
$$x = 66^{77} ~(\mods 119) = 19.$$
Для ускорения возведения в степень по модулю необходимо использовать быстрый алгоритм возведения в степень, рассмотренный в первой лекции.
Безопасность алгоритма RSA основана на трудоемкости разложения на множители больших чисел. Международная группа ученых вычислителей в январе 2010 года установила новый рекорд факторизации, разложив на простые множители 232-значное число. Следовательно, выбираемое N должно быть больше. Большинство общепринятых алгоритмов вычисления простых чисел $$p$$ и $$q$$ носят вероятностный характер.
Для работы алгоритма RSA нужны большие простые числа. Существуют два подхода.
Кроме разрядности $$p$$ и $$q$$, к ним предъявляются следующие дополнительные требования:
$$\left(\frac{p+q}{2}\right)^2 - N = \left(\frac{p-q}{2}\right)^2.$$
Чтобы исключить возможность применения методов факторизации, накладывают следующее ограничение: числа $$p-1$$, $$p+1$$, $$q-1$$, $$q+1$$ не должны разлагаться в произведение маленьких простых множителей, должны содержать в качестве сомножителя хотя бы одно большое простое число. В 1978 г. Райвест сформулировал наиболее сильные требования:
Числа $$p_1=(p-1)/2$$, $$p_2=(p+1)/2$$, $$q_1=(q-1)/2$$, $$q_2=(q+1)/2$$ должны быть простыми, причем $$p_1-1$$ и $$q_1-1$$ не должны разлагаться в произведение маленьких простых чисел.
Рассмотрим вопрос о выборе экспонент шифрования и расшифрования. Так как значения $$e$$ и $$d$$ определяют время зашифрования и расшифрования, то можно назвать ряд ситуаций, в которых желательно иметь малое значение $$e$$ и $$d$$. Например, при использовании системы RSA при защите электронных платежей с применением кредитных карточек естественным является требование использования небольших значений экспоненты $$d$$ у владельца карточки и большого значения экспоненты $$e$$ у центрального компьютера.
Однако выбор малых параметров $$e$$ или $$d$$ представляется небезопасным по ряду соображений. Если малым является секретный параметр $$d$$, то можно применить метод перебора малых значений до получения искомого числа $$d$$. А если малым является параметр $$e$$, то достаточно большое число открытых сообщений, удовлетворяющих неравенству $$x < \sqrt[e]{N}$$, будут зашифровываться простым возведением в степень $$y=x^e$$, и поэтому их можно найти путем извлечения корня степени $$e$$.
Другая аналогичная ситуация может сложиться, когда у нескольких абонентов используется одинаковая экспонента $$e$$. Тогда становится возможна атака на основе китайской теоремы об остатках (см. ниже).
Сначала нужно каким-либо способом представить текст сообщения в виде упорядоченного набора чисел по модулю $$N$$. Это еще не процесс шифрования, а только подготовка к нему.
Пример 8.2.Подготовим к зашифрованию девиз ПОЗНАЙ СЕБЯ,
Для простоты предположим, что текст сообщения содержит \ слова, записанные только заглавными буквами. Первый шаг состоит в замене каждой буквы сообщения числом. Будем использовать таблицу замен 8.1.
| А | Б | В | Г | Д | Е | Ж | З | И | Й | К | Л | М | Н | О | П | Р |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 |
| С | Т | У | Ф | X | Ц | Ч | Ш | Щ | Ъ | Ы | Ь | Э | Ю | Я | \_ | |
| 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 99 |
Текст ПОЗНАЙ СЕБЯ после замен букв на числа принимает вид: 2524172310199927151141.
Пусть в нашем примере $$p=149$$, $$q=157$$, тогда $$N = 23393$$. Поэтому цифровое представление открытого текста нужно разбить на блоки, меньшие, чем $$23393$$. Одно из таких разбиений выглядит следующим образом:
2524 1723 10199 9271 511 41
Конечно, выбор блоков неоднозначен, но и не совсем произволен. Например, во избежание двусмысленностей, на стадии расшифровки не следует выделять блоки, начинающиеся с нуля.
При расшифровке сообщения получаем последовательность блоков, затем их соединяем вместе и получаем число. После этого числа заменяют буквами в соответствии с таблицей, приведенной выше.
Обратим внимание на то, что в этом примере каждую букву кодируем двузначным числом. Это сделано для предотвращения неоднозначности. Если бы мы пронумеровали буквы не по порядку, начиная с 1, т. е. А соответствует 1, Б соответствует 2 и т. д., то было бы непонятно, что обозначает блок 12: пару букв АБ или букву Л, двенадцатую букву алфавита. Конечно, для кодирования можно использовать любые однозначные соответствия между буквами и числами, например ASCII-кодировку, что чаще всего и делается.
Продолжим пример: выбираем $$p= 149$$, $$q=157$$, вычисляем $$\varphi(N) = 23 088$$. Теперь нужно выбрать число $$e$$, взаимно простое с $$\varphi(N)$$. Наименьшее простое число, не делящее $$\varphi(N)$$, равно $$5$$. Положим $$e=5$$. Зашифруем сообщение поблочно. Для шифрования первого блока вычисляем $$2524^{5} ~(\mods 23393) = 22752$$. Далее,
$$1723^5 (\mods 23393) = 6198,$$
$$10199^5 (\mods 23393) = 14204,$$
$$9271^5 (\mods 23393) = 23191,$$
$$511^5 (\mods 23393) = 10723,$$
$$41^5 (\mods 23393) = 14065.$$
Теперь шифрованный текст имеет вид: $$22752619814204231911072314065$$.
В нашем примере $$N = 23393$$, $$e = 5$$. Расширенный алгоритм Евклида для чисел $$\varphi(N)=23 008$$ и $$e=5$$ даёт:
$$1=2\cdot 23008 - 9235\cdot 5 , \qquad \varphi(N)-9235=13583 \equiv 5^{-1} ~(\mods \varphi(N)).$$
Значит для расшифровки блоков шифртекста мы должны возвести блоки в степень $$13583$$ по модулю $$23393$$. Для первого блока $$22752$$ шифртекста в примере получим:
$$22752^{13853} = 2524 (\mods 23393).$$
Разбиение числа на блоки можно произвести различными способами. При этом промежуточные результаты зависят от способа разбиения, однако конечный результат - не зависит.
Для расшифрования необходимо по известным $$N$$, $$e$$ и шифртексту $$y$$ найти такое $$x\in \mathbb{Z}_N^\ast$$, что $$y=x^e (\mod N)$$.
Попытаемся решить сравнение при конкретных $$y$$, затем использовать гомоморфность отображения $$D(x)$$.
Один из возможных способов следующий: пусть имеется набор пар:
$$\{(x_1,y_1),(x_2,y_2),\ldots (x_k,y_k)\}$$с условием, что $$x_i^e = y_i ~(\mod N)$, $1<y<N$$, $$\GCD(y,N)=1$$. Если каким-либо образом удалось представить $$y$$ в виде $$y=y_1^{s_1} y_2^{s_2}\cdots y_k^{s_k} ~(\mod N)$$ с целыми $$s_k$$, то $$x=x_1^{s_1}x_2^{s_2}\cdots x_k^{s_k}$$ будет решением сравнения $$y=x^e ~(\mod N)$$.
Пример 8.3 В наличии имеется открытый ключ $$N = 31459$$, $$e = 5$$ и набор пар соответствующих друг другу исходных и зашифрованных сообщений: $$(23, 18707)$$, $$(755, 26871)$$, $$(631, 6384)$$. Требуется расшифровать шифртекст $$y = 11 638$$.
Представим $$y$$ в виде $$y=18707^{-1}\cdot 26871^3\cdot 6384^{-2}=11 638$$. Отсюда легко вычислить исходное сообщение: $$x=23^{-1}\cdot 755^3 \cdot 631^{-2}=28260$$.
Заметим, что этот подход не менее труден, чем поиск алгоритма решения сравнения $$y=x^e ~(\mod N)$$.
Само по себе использование RSA не обеспечивает безопасности. Дело еще в деталях реализации. Приведем ряд примеров. Для простоты вычислений будем работать с небольшими числами. Цель - показать особенности, не зависящие от размера.
Пример 8.4 Пусть пользователь выбрал $$N=2047$$, $$e=179$$, $$d=411$$. Так как $$2047 = 23 \cdot 89$$, а числа $$\varphi(23)=22$$ и $$\varphi(89)=88$$ имеют наименьшее общее кратное 88, то любое обратное к 179 по модулю 88, например 59, будет действовать как $$d$$.
Пример 8.5 Число $$N = 536813567$$ является произведением простого числа Мерсенна $$8191$$ и простого числа Ферма $$65537$$. Это очень плохой выбор.
Пример 8.6 Число $$23360947609$$ является очень плохим выбором для $$N$$ из-за того, что два его простых делителя слишком близки к друг другу.
Пусть $$p>q$$, тогда имеем:
$$N=t^2 - s^2, \qquad t=\frac{p+q}{2},\ s=\frac{p-q}{2}.$$Так как $$S$$ мало, то $$t$$ - целое число, лишь немного большее $$\sqrt{N}$$, причем $$t^{2}-N$$ является полным квадратом. Проверяем подряд целые числа $$t>\sqrt{N}$$. В нашем примере это $$t_1 = 152843$$, $$t_2 = 152844$$, $$t_3 = 152845$$, причем $$t_3^2-N=804^2$$. Тогда $$p = 152845 - 804$$. Таким образом, мы с третьей попытки нашли $$p$$ и $$q$$. Количество попыток, необходимых для факторизации $$N$$, можно при известных $$p$$ и $$q$$ вычислить по следующей формуле:
$$k=\sqrt{p\cdot q + \left(\frac{p-q}{2}\right)^2}-\left[\sqrt{p\cdot q}\right],$$где $$[x]$$ - операция округления $$x$$ до ближайшего целого числа.
См. [1]
В целях ускорения зашифрования и расшифрования в системе RSA часто открытый или секретный показатель выбирают малыми. Поскольку размеры чисел составляют сотни бит, сокращение длины показателей первоначально могло выглядеть обоснованным. Однако такой способ увеличения скорости шифрования часто приводит к снижению стойкости.
Теорема 8.1 (Винер) Пусть в системе RSA выполняются неравенства $$p<q<2p$$ и $$d<\dfrac{1}{3}\sqrt[{4}]{n}$$. Тогда по открытому ключу $$(n,e)$$ можно вычислить секретный показатель $$d$$.
При некотором целом $$k$$ выполняется неравенство:
$$\left|\frac{e}{n}-\frac{k}{d}\right|\leq \frac{1}{d\sqrt[4]{n}} < \frac{1}{2d^2}.$$Число дробей $$\dfrac{k}{d}$$, для которых $$d<n$$, удовлетворяющих полученому соотношению, не превосходит $$log n$$, и все они являются подходящими дробями $$\dfrac{P_i}{Q_i}$$ к рациональному чилу $$\dfrac{e}{n}$$. Для некоторого $$i$$ будет выполняться равенство $$\dfrac{P_i}{Q_i}=\dfrac{k}{d}$$. Из равенства $$ed-k\varphi(n)=1$$ следует, что числа $$k$$ и $$d$$ взаимно просты, значит, $$k=P_i$$, $$d=Q_i$$.
Пример 8.7 Пусть $$(n,e)=(4617790059809965777,2693216516134636609)$$ - открытый ключ. Найдём $$d$$.
Раскладываем число $$\dfrac{e}{n}$$ в цепную дробь и находим последовательно подходящие дроби:
$$\begin{align*}\frac{2693216516134636609}{4617790059809965777}=[0;1,1,2,1,1,64,3,1,1,61,2,9,\ldots],\\ \frac{P_1}{Q_1} =\frac{1}{1};\quad \frac{P_2}{Q_2} =\frac{1}{2};\quad \frac{P_3}{Q_3} =\frac{3}{5};\quad \frac{P_4}{Q_4} =\frac{4}{7};\quad \frac{P_5}{Q_5} =\frac{7}{12};\\ \frac{P_6}{Q_6} =\frac{452}{775};\quad \frac{P_7}{Q_7} =\frac{1363}{2337};\quad \frac{P_8}{Q_8} =\frac{1815}{3112};\quad \frac{P_9}{Q_9} =\frac{3178}{5449}.\end{align*} $$Для девятой подходящей дроби получаем, что разность $$e\cdot Q_9 - 1$$ делится нацело на $$P_9$$:
$$2693216516134636609\cdot 5449-1=3178\cdot 4617790055512156980.$$Полагаем $$d=Q_9=5449$$. Секретный ключ найден.
Строим последовательность: $$y_1=y$$, $$y_i=y_{i-1}^e ~(\mod N)$$, $$i>1$$. Итак, $$y_m=y^{(e^m)} ~(\mod N)$$, а так как $$\GCD(e,\varphi(n))=1$$, то существует такое натуральное число $$m$$, что $$e^m=1 ~(\mod \varphi(N))$$. Но тогда $$y^{(e^m-1)}=1 ~(\mod N)$$, отсюда следует, что $$y^{(e^m)} =y ~(\mod N)$$, значит, $$y_{m-1}$$ - решение сравнения $$y=x^e ~(\mod N)$$.
Пример 8.8 Пусть у нас имеется открытый ключ $$N =84517$$, $$e = 397$$ и зашифрованное им сообщение $$y = 8646$$. Найдём открытый текст $$x$$.
Возводя $$y$$ в степень $$e$$, строим последовательность:
$$\begin{align*}y_1 = y = 8646,\quad y_2 = 37043,\quad y_3 = 5569,\quad y_4 = 61833,\\ y_5 = 83891,\quad y_6 = 16137,\quad y_7 = 8646 = y.\end{align*}$$Следовательно, $$y_6$$ является решением сравнения $$y=x^e ~(\mod N)$$, а, следовательно, искомым сообщением $$x$$.
Замечание. Анализ метода повторного шифрования хорошо показывает необходимость соблюдения требований на выбор $$p$$ и $$q$$ для обеспечения стойкости. В данном примере $$d = 82 225$$. Неудачный выбор криптосистемы привел к тому, что атака методом повторного шифрования дала результат почти сразу, тогда как нахождение $$d$$ потребовало бы на порядок больших вычислений.
Как отмечалось ранее, системы шифрования с открытыми ключами работают сравнительно медленно. Для повышения скорости шифрования RSA на практике используют малую экспоненту зашифрования.
Если выбрать число $$e$$ небольшим или таким, чтобы в его двоичной записи было мало единиц, то процедуру шифрования можно значительно ускорить. Например, выбрав $$e = 3$$ (при этом ни $$p - 1$$, ни $$q - 1$$ не должны делиться на 3), мы сможем реализовать шифрование с помощью одного возведения в квадрат по модулю $$N$$ и одного перемножения. Выбрав $$e=2^{16}-1=65537$$ - число, двоичная запись которого содержит только две единицы, мы сможем реализовать шифрование с помощью 16 возведений в квадрат по модулю $$N$$ и одного перемножения. Если экспонента $$e$$ выбирается случайно, то реализация шифрования по алгоритму RSA потребует $$s$$ возведений в квадрат по модулю $$N$$ и в среднем $$s/2$$ умножений по тому же модулю, где $$s$$ - длина двоичной записи числа $$N$$. Вместе с тем, выбор небольшой экспоненты $$e$$ может привести к негативным последствиям. Дело в том, что у нескольких корреспондентов могут оказаться одинаковые экспоненты $$e$$.
Пусть, например, три корреспондента имеют попарно взаимно простые модули $$N_1$$, $$N_2$$, $$N_3$$ и общую экспоненту $$e = 3$$. Если еще один пользователь посылает им некое циркулярное сообщение $$x$$, то криптоаналитик противника может получить в свое распоряжение три шифрованных текста $$y_i=x^3 ~(\mod N_i)$$, $$i=1,2,3$$. Далее, он может найти решение системы сравнений, лежащее в интервале $$(0,N_1\cdot N_2 \cdot N_3)$$ и удовлетворяющее уравнениям:
$$\left\{\begin{array}{l} y\equiv y_1 ~(mod\; N_1),\\ y\equiv y_2 ~(mod\; N_2),\\ y\equiv y_3 ~(mod\; N_3) \end{array}\right. $$По китайской теореме об остатках такое решение $$y$$ единственно, а так как $$x^3<N_1\cdot N_2 \cdot N_3$$, то $$y=x^3$$. Значение $$x$$ можно найти, вычислив кубический корень $$x=\sqrt[3]{y}$$. Отметим, 8.1 что выбор малой экспоненты расшифрования $$d$$ также нежелателен в связи с возможностью определения $$d$$ простым перебором. Известно также что если $$d<\sqrt[4]{N}$$, то экспоненту $$d$$ легко найти, используя непрерывные дроби.
Пример 8.9 Три пользователя имеют модули $$N_1=26549$$, $$N_2= 45901$$, $$N_3 = 25351$$. Все пользователи используют экспоненту $$e = 3$$. Всем пользователям было послано некое сообщение $$x$$, причем пользователи получили сообщения $$y_1 = 5366$$, $$y_2 = 814$$, $$y_3 = 4454$$. Найдём $$x$$.
С помощью китайской теоремы об остатках решим систему:
$$\left\{\begin{array}{l} y=5366 ~(mod\; 26549),\\ y=814 ~(mod\; 45901), \\ y=4454 ~(mod\; 25351). \end{array}\right. $$Для этого вычислим $$M_0 = N_1\cdot N_2\cdot N_3= 30893378827799$$. Далее находим
| $$m_1 = N_2\cdot N_3 = 1163636251,$$ |
| $$m_2 = N_1\cdot N_3 = 673043699,$$ |
| $$m_3 = N_1\cdot N2 = 1218625649,$$ |
| $$n_1 = m_1^{-1} ~(mod\; N_1) = 13533,$$ |
| $$n_2 = m_2^{-1} ~(mod\; N_2) = 27930,$$ |
| $$n_3 = m_3^{-1} ~(mod\; N_3) = 22354.$$ |
| $$y = y_1\cdot n_1\cdot m_1 + y_2\cdot n_2\cdot m_2 + y_3\cdot n_3\cdot m_3=$$ |
| $$= 84501028038745578 + 15301661957638980 + 121332116653000684 =$$ |
| $$=221134806649385242 \equiv 1000000000 ~(mod\; M_0).$$ |
Отсюда $$x=\sqrt[3]{1000000000} = 1000$$ - исходное сообщение, отправленное пользователям.
Пусть два пользователя выбрали одинаковый модуль $$N$$ и взаимно простые экспоненты $$e_1$$ и $$e_2$$. Если один пользователь посылает им некое циркулярное сообщение $$x$$, то криптоаналитик противника может получить в свое распоряжение два шифрованных текста $$y_1=x^{e_1} ~(mod\; N)$$ и $$y_2=x^{e_2}~(mod\; N)$$. В таком случае криптоаналитик может получить исходное сообщение, найдя с помощью алгоритма Евклида числа $$r$$ и $$s$$ такие, что $$re_1+se_2=1$$. Отсюда получаем:
$$y_1^r y_2^s = x^{re_1 + se_2} = x ~(mod\; N).$$Пример 8.10 Два пользователя применяют общий модуль $$N = 137759$$, но разные взаимно простые экспоненты $$e_1=191$$ и $$e_2 = 233$$. Пользователи получили шифртексты $$y_1=60197$$ и $$y_2= 63656$$, которые содержат одно и то же сообщение. Найдем исходное сообщение методом бесключевого чтения.
Так как $$e_1$$ и $$e_2$$ взаимно просты, то найдем такие $$r$$ и $$s$$, что $$re_1+se_2=1$$. С помощью расширенного алгоритма Евклида находим $$r = 61$$, $$s = -50$$. Искомое сообщение:
$$x=y_1^r\cdot y_2^s = 60197^{61} \cdot 63656^{-50}=1234.$$Как видно из приведенных выше примеров, выбор параметров криптосистемы является ответственной задачей. Параметры необходимо выбирать в строгом соответствии с требованиями. Существующими в настоящими время методами (и при использовании существующих в настоящее время вычислительных мощностей) атака на алгоритм и/или криптосистему возможна лишь при неудачном выборе параметров. В частности, необходимо обеспечить каждому пользователю уникальные значения $$p$$, $$q$$ и уникальное значение $$e$$, удовлетворяющие требованиям, приведенным выше.
Приведем примеры атак с числами, размеры которых соответствуют реально применяем в системах защиты банковской информации.
Для работы с большими числами мы будем использовать систему компьютерной алгебры Maxima (см. параграф 1.16.1). Используемые нами функции подробно описаны в руководстве пользователя. Особенно полезен нам раздел "Number Theory".
Исходные данные:
$$N$$ = 6915244609579137267327382519799379091524149293244816637691826 9398622964367867570234227167749609782487603063343406242777371955314645 2742388332988733993605091994058293499382971742490952474719828474075078 5896707348622744531600003265917743044563775026361237516233569510776114 8109796496185649768169137389070008752782413652613114179194481058554254 4448615819662193369744739530133016244020607483919296703035335756025782 1198618093610413148915963990789275952977743453275495105952399715239534 1404522821690462029654934969262380866920267097617165707930262759302606 756755216795383122881029602333988711966716180750531605801919527461
$$e$$ =7423489;
шифртекст $$C =$$ 465060673245728679820089043475674731352115350813536 29127993992486567556 7156900806763889151763924735496714794491888355277 38596815041010164916640784130 4910760438532601276748143258914433560279 13186272146910522595250621775809097843 8466376070439866602619174245254 91796789390336635629378578035857597525297590776 2618424271931719171731 88933063050921552961787237676274649516864417659967226409 6655987478676 94982197189302733688441148495741687268763633927764999172932586878 6575 5502667348346941062611020674418896448890646803651538990666737332006313 6883 39309056851281655672233726633413389794443264266190435226307846633 6457114523067
Запустим систему Maxima. После появления приглашения командной строки (%i1) можно вводить команды.
e:7423489$
После нажатия Enter происходит выполнение команды. Аналогичным образом введём идентификаторы $$N$$, $$C$$.
isqrt. Для возведения в квадрат используется операция ^. Введём:
srn:isqrt(N)$
is(srn^2=N);
Первая команда вычисляет целую часть корня от $$N$$ и обозначает её идентификатором srn. Вторая команда проверяет, является ли $$N$$ квадратом. В результате второй команды получим вывод:
(%o5) false
Это говорит о том, что равенство $$\lfloor \sqrt{N} \rfloor^2 = N$$ не выполняется, и число $$N$$ - не квадрат целого числа. Надпись "\verb#(%05)#" обозначает, что далее идёт результат 5-й команды, которая была введена после приглашения "\verb#(%i5)#".
(%i6) w1 : (srn+1)^2 - N$
(%i7) is(isqrt(w1)^2=w1);
(%o7) false
(%i8) w2 : (srn+2)^2 - N$
(%i9) is(isqrt(w2)^2=w2);
(%o9) false
(%i10) w3 : (srn+3)^2 - N$
(%i11) is(isqrt(w3)^2=w3);
(%o11) false
(%i12) w4 : (srn+4)^2 - N$
(%i13) is(isqrt(w4)^2=w4);
(%o13) true
Итак, $$N=(\mathtt{srn}+4)^2-\sqrt{w_4}^2$$.
(%i14) p:srn+4-isqrt(w4);
(%o14) 262968526816026736232636051189459874382446519148
963617629027255104769945719755984982102707120117
706525064015257076350250162229292374187259939548
939791858838514297011479606873615542587565445952
774014851457711890959298629102287714458214768091
456036071496351940116236181014737608169537866387
475270200449701600539
(%i15) q:srn+4+isqrt(w4);
(%015) 262968526816026736232636051189459874382446519148
963617629027255104769945719755984982102707120117
706525064015257076350250162229292374187259939548
939791858918434644001891354485948817612831393943
831874217795402559116173347849761999726607005334
107474067053693923414485042904885419841498167834
826934556836972951999
Проверим, правильно ли мы нашли делители:
(%i16) is(N=p*q);
(%o16) true
Теперь нетрудно осуществить дешифровку.
(%i17) n:(p-1)*(q-1);
(%o17) 691524460957913726732738251979937909152414929324
481663769182693986229643678675702342271677496097
824876030633434062427773719553146452742388332988
733993605091994058293499382971742490952474719828
474075078589670734862274453160000326591774304456
377502636123751623356951077611481097964961856497
681691373890700087522564765989810607067292089561
753346960966889279214097392158985030920845106212
364219654648892933401895280839556667834036311647
010551595182396506795549490371941105829837814339
818401626212936221330490459000092664168447951206
651159937454409858770432466166667495195921598056
82710960700930681958448326848515244974924
inv_mod.
(%i18) d:inv_mod(e,n);
(%o16) 159473778881412178951363380047548370299185595369
293301556900463792194735837486992335590486755090
118784764988909430054104623893214000053083933271
592133656057039185769018422628707296349955436619
729220378775558752251642918675436409902022493957
029259927562211781124457194260217400235337672814
214944366331695859094533195686344563818416832875
322618995339315686613690403531225496361587681392
769069101695698479902470067182274377952892405921
601214570482225781950523126294764189240377630662
614360117188441324480392776069704371618231484929
589094831167041492978941304862403054017212391664
53872109949533807664476342715222105274029
power_mod.
(%i19) P:power_mod(C,d,N);
(%o19) 20231718
Исходные~данные:
$$N=$$ 2519590847565789349402718324004839857142928212620403202777713 7836043662020707595556264018525880784406918290641249515082189298559149 1761845028084891200728449926873928072877767359714183472702618963750149 7182469116507761337985909570009733045974880842840179742910064245869181 7195118746121515172654632282216869987549182422433637259085141865462043 5767984233871847744479207399342365848238242811981638150106748104516603 7730605620161967625613384414360383390441495263443219011465754445417842 4020924616515723350778707749817125772467962926386356373289912154831438 167899885040445364023527381951378636564391212010397122822120720357;
$$e_{1} = 1011163$$; $$e_{2} = 1110521$$;
$$C_{1} =$$ 1475325512646127242922491234336573821326644830122724857802651 82834500418 6248451852916071172167393901484963211012186813420799457345 60638901218485778028 8088167762693301487173478582573846232471858233011 05429274234279863037579651294 1305440048424158412512493520129752032822 49047843226000864924203675006878533759 4689790689579026501643817929120 04105626763672704672827848013136399268699306662 7592945775958095422456 50919791860840020082746913903995338683355323748300077852 4222905192914 54785850041002811165491890932478197036280409606904111958813351896 3410 8240519966700126623731566589570806848893829480888979012581343525399802 490
$$C_{2} =$$ 1168960834050268961897324310220295239101276316289170220279034 24838605267 3641103792818084219415738429514299664733141986982322386646 78264765952517495919 5383277543494845172200901017398976983581548883677 72471406710688871011254842119 0717106834141930230321678867355741169178 64117261510578555710832001442414172654 4343094430367130161092842091138 95716177545680184852854836102034397952992257055 3742268402669724738982 06540435293792709985777111719850811784302488645684794421 4372490969359 76159712998481145184343878513509137590163314701862659532716478010 6260 3880245750910942198158465793549050643147723479955672632110054161976725 720
Запустим системы компьютерной алгебры Maxima и введём в неё исходные данные (подробнее см. предыдущий пример).
extgcd.
(%i6) [u1,u2,v]:igcdex(e1,e2);
(%o6) [- 185750, 169131, 1]
power_mod, которая при возведении в отрицательную степень автоматически находит элемент, обратный по модулю:
(%i7) m:mod(power_mod(c1,u1,N) * power_mod(c2,u2,N),N);
(%o7) 17109930102028242618171032184099141023232413249933
18272110992310172310331523109923101326101410991299
14121527281899283727413399142421211926241299273410
Теперь, используя таблицу 6.1 (см. лекцию 6), нетрудно прочитать зашифрованный текст:
ЗА ФАКТОРИЗАЦИЮ ДАННОГО ЧИСЛА НАЗНАЧЕНА НАГРАДА В ДВЕСТИ ТЫСЯЧ ДОЛЛАРОВ США
Действительно, за разложение на множители данного модуля положена награда в 200~000 долларов США. Маловероятно, что такая награда была бы назначена, если бы операция факторизации чисел такого размера была бы легкой задачей. Приведенный пример показывает, что криптосистема хоть и была построена на основе числа, надежность которого оценивается столь большой суммой, из-за неверной реализации и нарушения правил безопасного использования алгоритма RSA была проведена успешная атака на такую систему.
Исходные~данные:
$$N_{1}=$$ 2620595590763345144693186700359738170637959124766023390552357 7708743486405826754889134908712878889866426949841420594546127374968746 3704691027597982381045792187752115484056255124356418017823267456319147 0945512881726415778968582505568195308039434983677266976473866499763291 3738820183706821310507433203861937132913052549942960788848335390037394 6608954216027382001077261982166703560129855861608144340546877016429583 9526450906080526730620279528287119758899389543943591998158763938922196 8046758300050695830713985416717597991930870022544853965458777962931909 648137289765408375166634394924214994296219013143450580985614906283;
$$N_{2 } =$$ 1404373956322280634703446579661705045380233929445038795196910 8939191622721351334042117943027988219739179215127857273262112408720857 5085635334263838298981285414802497708344255137307727529188557129111432 3963768294617167632028510681829911856058478660674376664320832126316894 7606402829166495400694730956929734685472783298926965979178579784105662 8153673135054858125822469223977739610372727151870093086752152869771307 3467493421736819899669678212641557159981424135655309012610054286808387 9520929487076060467246719139718422376341840235179419394933429027866125 906378222980586843220420100138771858151139634024553669934223886607;
$$N_{3} =$$ 1678762549783158397789297902611957781442911408001435228447125 0202063154360775415905721304251931956720446037943647416174134426911566 5212990059682834427697301545254518302708049934908529962522695547077196 3230698471528227970703734830356915746959604252425636041283401479887740 4322176725761721902946480880822193710599559142350970463792284136048849 7544583768616918174829041738653440422210516040921622855920557488080866 4309140695930461054347617641431967212377776787337055888304116258297846 9227591560752572050022468537356199792558856097689011471958919584692498 500245987683611873312532240213872073959474934338996846004302775537;
$$C_1=$$ 4927139668939115071182968571701562304473718670620554307010688 1062090413635818301115427131412979009259007051009291844710074543775650 6516091527776544977721235554003704444593860610457655753309542143091955 7022261909268967057374961078768152217628589481286924844350506066728881 1473812492507877737379593844465799176180271907072851233493907805067518 8437332715271665418501912559134109018864658897093701890552483116702122 6061148157077899368221090313561236504179559243208369732033772455827306 9885989713330049648986010254199574027123751067293726506915040515035321 29413622932103918478494329377614278246377310198475360664888159698
$$C_2=$$ 3968904170996511074822512049317096671468123928927710698588786 2347631886514250093559580298720231340125645657836036173135232353725327 1463638334669264317836171769199659586183542349898954031121711885587682 9157809932216110967296980031363470360774569191729660576200413662944516 2239552010112356886221078835918681512698544646875041376476380679149594 6228326687802420878384865328494980645673174579578595475235815167063272 6383360324448016877640031260359897273404846113595628745775834042432714 2510945980040123373707520807207125269432787473039210714621060676962495 55526071081634210584640898292343334109384890322861662213339826806
$$C_3=$$ 2693434464101963658612411044117300168679280228386801221153426 9534648413073139833416490884467353782556651124872003929791054528059521 9750178127743617105872428304027181612949559624296295303659876228036366 1172080005585577843506210407098282557890991077271720540702078785134336 4204874516864307636270232905646677124930139153281613748156352379189398 0516732942593222620332350649515771205783855908682127130916311303600896 2726424558876252115570834611302696707152581624589109290455282184973051 7701394206986426270816677531308584524442338494896621843059785765006275 39756315409235915749943340705460409673942434752665551704951603699
$$e=3$$. Найдём сообщение $$m$$.
Запустим систему компьютерной алгебры Maxima и введём в неё исходные данные.
chinese.
(%i8) mcube:chinese([c1,c2,c3],[N1,N2,N3]);
(%o8) 1439619746877070775526192128945758968992165680996
3966572720001979003084347216085169846710176736442
2607102784602056703967564355254187236240029273958
5244623799154989886682303658655987332618285682692
1673617098179274483891388669524107519774675750988
5071342316383704181434566679343998766513563861662
3709617247882929434704037023359692069389958441799
9598227129708607068497886977208029397728335933695
8553982958213317414845600724816716404544112021449
4656103946055056386082865741853419774396410771345
3805185312405889293788831589145513935021181672031
6464546892480620465275275072448707709191544241239
3719042339415429661220875253048244629952
(%i9) m:inrt(mcube,3);
(%o9) 1129143828159925261514152138232499122318221028152
1382337992526189912371124261599251026102215282624
1299341830262427182728152237991099282499121034159
9272424113515231815991415341830262940289918992526
24331828104028
(%i10) m^3-mcube;
(%o10) 0
Вновь декодируем результат по таблице 6.1 (см. лекцию 6):
БУДЬТЕ ПРЕДЕЛЬНО ВНИМАТЕЛЬНЫ ПРИ ВЫБОРЕ ПАРАМЕТРОВ ШИФРОСИСТЕМЫ А ТО ВАШЕ СООБЩЕНИЕ ДЕШИФРУЮТ И ПРОЧИТАЮТ
См. [2]
Схема рюкзака несложна. Дана куча предметов различной массы, можно ли положить некоторые их этих предметов в рюкзак так, чтобы масса рюкзака стала равна определенному значению? Более формально: дан набор значений $$M_1, M_2, \ldots, M_n$$ и сумма $$S$$. Нужно вычислить значения $$b_i$$ такие, что $$S=b_1 M_1 + b_2 M_2 +\ldots+ b_n M_n$$, где $${b}_{i}$$ может быть либо нулем, либо единицей. Единица показывает, что предмет кладут в рюкзак, а ноль - что не кладут.
Например, массы предметов могут иметь значения 1, 5, 6, 11, 14 и 20. Вы можете упаковать рюкзак так, чтобы его масса стала равна 22, использовав массы 5, 6 и 11. Невозможно упаковать рюкзак так, чтобы его масса была равна 24. В общем случае время, необходимое для решения этой проблемы, с ростом количества предметов в куче растет экспоненциально.
В основе алгоритма рюкзака Меркла-Хеллмана лежит идея шифровать сообщение как решение набора проблем рюкзака. Предметы из кучи выбираются с помощью блока открытого текста, по длине равного количеству предметов в куче (биты открытого текста соответствуют значениям $$b_i$$), а шифртекст является полученной суммой. Пример шифртекста, зашифрованного с помощью рюкзака в таблице 8.2.
| Открытый текст | 111001 | 010110 | 000000 | 011000 |
| Рюкзак | 1,5,6,11,14,20 | 1,5,6,11,14,20 | 1,5,6,11,14,20 | 1,5,6,11,14,20 |
| Шифртекст | 1+5+6+20=32 | 1+11+14=30 | 0=0 | 5+6=11 |
На самом деле существуют две различные проблемы рюкзака, одна решается за линейные время, а другая, как считается,нет. Легкую проблему можно превратить в трудную. Открытый ключ предоставляет собой трудную проблему, которую легко использовать для шифрования, но невозможно для расшифрования сообщений. Закрытый ключ является легкой проблемой, давая простой способ расшифровать сообщения. Тому, кто не знает закрытый ключ, придется попытаться решить трудную проблему рюкзака.
Если перечень масс представляет собой сверхвозрастающую последовательность, то полученную проблему рюкзака легко решить. Сверхвозрастающая последовательность - это последовательность, в которой каждой член больше суммы всех предыдущих членов. Например, последовательность {1,3,6,13,27,52} является сверхвозрастающей, а {1,3,4,9, 15,25} - нет.
Решение сверхвозрастающего рюкзака найти легко. Возьмите полный вес и сравните его с самым большим числом последовательности. Если полный вес меньше, чем это число, то его не кладут в рюкзак. Если полный вес больше или равен этому числу, то оно кладется в рюкзак. Уменьшим массу рюкзака на это значение и перейдем к следующему по величине числу последовательности. Будем повторять, пока процесс не закончится. Если полный вес уменьшится до нуля, то решение найдено. В противном случае нет.
Например, пусть полный вес рюкзака - 70, а последовательность весов {2,3,6, 13,27,52}. Самый большой вес, 52, меньше 70, поэтому кладем 52 в рюкзак. Вычитая 52 из 70, получаем 18. Следующий вес - 27, больше 18, поэтому 27 в рюкзак не кладется. Вес 13, меньше 18, поэтому кладем 13 в рюкзак. Вычитая 13 из 18, получаем 5. Следующий вес - 6, больше 5, поэтому 6 не кладется в рюкзак. Продолжение этого процесса покажет, что и 2, и 3 кладутся в рюкзак, и полный вес уменьшается до 0, что сообщает о найденном решении. Если бы это был блок шифрования методом рюкзака Меркла-Хеллмана, открытый текст, полученный из значения шифртекста 70, был бы равен 110101.
Не сверхвозрастающие, или нормальные, рюкзаки представляют собой трудную задачу - быстрого алгоритма для них не найдено. Единственным известным способом определить, какие предметы кладутся в рюкзак, является методическая проверка возможных решений, пока вы не наткнетесь на правильное . Самый быстрый алгоритм, принимая во внимание различную эвристику, имеет экспоненциальную зависимость от числа возможных предметов. Если добавить к последовательности весов еще один член, то найти решение станет вдвое труднее. Это намного труднее сверхвозрастающего рюкзака, где, если вы добавите один предмет к последовательности, поиск решения увеличится на одну операцию.
Алгоритм Меркла-Хеллмана основан на этом свойстве. Закрытый ключ является последовательностью весов проблемы сверхвозрастающего рюкзака. Открытый ключ - это последовательность весов проблемы нормального рюкзака с тем же решением. Меркл и Хеллман, используя модульную арифметику, разработали способ преобразования проблемы сверхвозрастающего рюкзака в проблему нормального рюкзака.
Рассмотрим работу алгоритма. Чтобы получить нормальную последовательность рюкзака, возьмем сверхвозрастающую последовательность рюкзака, например, {2,3,6,13,27,52}, и умножим по модулю $$m$$ все значения на число $$n$$. Значение модуля должно быть больше суммы всех чисел последовательности, например, 105. Множитель должен быть взаимно простым числом с модулем, например, 31. Нормальной последовательностью рюкзака будет
$$2\cdot 31 ~(\mod 105) = 62, \\ 3\cdot 31 ~(\mod 105) = 93, \\ 6\cdot 31 ~(\mod 105) = 81, \\ 13\cdot 31 ~(\mod 105) = 88, \\ 27\cdot 31 ~(\mod 105) = 102, \\ 52\cdot 31 ~(\mod 105) = 37. $$Итого - {62,93,81,88,102,37}.
Сверхвозрастающая последовательность рюкзака является закрытым ключом, а нормальная последовательность рюкзака - открытым.
Для шифрования сообщение сначала разбивается на блоки, равные по длине числу элементов последовательности рюкзака. Затем, считая, что единица указывает на присутствие члена последовательности, а ноль - на его отсутствие, вычисляем полные веса рюкзаков - по одному для каждого блока сообщения.
Например, если сообщение в бинарном виде выглядит как 011000110101101110, шифрование, использующее предыдущую последовательность рюкзака, будет происходить следующим образом:
Шифртекстом будет последовательность 174,280,333.
Законный получатель данного сообщения знает закрытый ключ: оригинальную сверхвозрастающую последовательность, а также значения $$n$$ и $$m$$, использованные для превращения ее в нормальную последовательность рюкзака. Для расшифрирования сообщения получатель должен сначала определить обратный к $$n$$ по модулю $$m$$. Каждое значение щифротекста умножается на $$n^{-1}~(\mod m)$$, а затем разделяется с помощью закрытого ключа, чтобы получить значения открытого текста.
Для расшифрования используется выбранная ранее сверхвозрастающая последовательность {2, 3, 6, 13, 27, 52} с $$m=105$$, $$n = 31$$. Шифртекстом служит 174,280,333. В этом случае $$n^{-1}=61 ~(\mod m)$$, поэтому значения шифртекста должны быть умножены на 61 по модулю 105.
Расшифрованным открытым текстом является 011000 110101 101110.
Для последовательности из шести элементов нетрудно решить задачу рюкзака, даже если последовательность не является сверхвозрастающей. Реальные рюкзаки должны содержать не менее 250 элементов. Длина каждого члена сверхвозрастающей последовательности должна быть где-то между 200 и 400 битами, а длина модуля должна быть от 100 до 200 битов. Для получения этих значений практические реализации используют генераторы псевдослучайной последовательности.
Одним из наиболее стойких к криптографическим атакам является алгоритм Блюма-Блюма-Шуба (BBS). Главное его достоинство состоит в том, что строго доказано, что не существует алгоритма с полиномиальной оценкой времени его выполнения, который по любым $$k$$ битам выходной последовательности может предсказать ее $$(k+1)$$-й бит с вероятностью, существенно большей, чем 0,5.
Пусть $$p$$ и $$q$$ - два больших простых числа примерно одинакового размера, причем
$$p{\equiv}3~(\mod 4),q{\equiv}3~(\mod 4).$$Тогда число $$n=\mathit{pq}$$ называется целым числом Блюма. Пусть $$\mathbb{Z}_n^\ast$$ - мультипликативная группа кольца вычетов по модулю $$n$$, $$Q{R}_{n}$$ - подгруппа её квадратов. Имеем:
$$\left|\mathbb{Z}_n^\ast\right|=\varphi \left(n\right)=\left(p-1\right)\left(q-1\right),\left|Q{R}_{n}\right|=(p-1)(q-1)/4.$$Каждый квадрат из $$Q{R}_{n}$$ имеет ровно четыре квадратных корня в $$\mathbb{Z}_n^\ast$$, и лишь один из них, называемый примитивным, лежит в $$Q{R}_{n}$$.
Пример 8.11 Если $$p=19,q=23$$, то $$n=437$$. Тогда $$133=19{\cdot}7{\notin}\mathbb{Z}_{437}^\ast$$, $$135{\in}\mathbb{Z}_{437}^\ast$$, $$139{\in}\mathbb{Z}_{437}^\ast$$, кроме того, учитывая, что корня из 135 по модулю 437 не существует, а $${24}^{2}=139~(\mod 437)$$, имеем:
$$135{\notin}Q{R}_{437},139{\in}Q{R}_{437}.$$Квадратными корнями из 139 по модулю 437 являются числа 24, 185, 252 и 413, причем 24 является примитивным, поскольку $${47}^{2}=24~(\mod 437)$$.
Задача определения примитивных квадратных корней по модулю числа $$n$$ вычислительно эквивалентна задаче разложения этого числа на множители. Таким образом, функция
$$f\left(x\right)={x}^{2}~(\mod n)$$эффективно вычисляется, а произвести обратное преобразование может только тот, кто знает секрет - разложение $$f(x)$$ на множители. Таким образом, $$f(x)$$ - односторонняя функция с секретом.
Опишем теперь алгоритм генерации случайной последовательности чисел.
Пусть $$n$$ - целое число Блюма.
Выберем в качестве инициализирующего вектора случайное число $${x}_{0}{\in}Q{R}_{n}$$. Для этого возведём случайное число $$x{\in}\mathbb{Z}_n^\ast$$ в квадрат.
Важным достоинством этого генератора является то, что при знании разложения $$n$$ на простые множители он допускает прямое определение отдельных битов, которые в нём вырабатываются. Имеем:
$${x}_{i}={x}_{0}^{{2}^{i}}~(\mod n),$$причем $${x}^{(p-1)(q-1)}=1~(\mod n)$$, поэтому
$${x}_{i}={x}_{0}^{{2}^{i}}~(\mod (p-1)(q-1)),$$то есть с помощью двух операций модульного возведения в степень, которые эффективно вычисляются, любое число $${x}_{i}$$ может быть найдено лишь исходя из начального вектора $${x}_{0}$$ и индекса $$i$$.
Термин вероятностное шифрование был введён Ш. Гольдвассер и С. Микали, и ими же была предложена первая схема такого шифрования, основанная на использовании BBS-генератора в качестве источника ключевой последовательности. Данная схема не обеспечивает секретности по отношению к атаке на основе выбранного шифртекста.
Пусть исходное сообщение $$t$$ - $m$-разрядная битовая последовательность, $${x}_{0}$$ - случайный квадратичный вычет по модулю $$n$$. Функция шифрования по схеме Гольдвассер-Микали имеет вид:
$$c=\left({x}_{m},t{\oplus}\mathit{BB}{S}_{n,m}\left({x}_{0}\right)\right),$$при этом $${x}_{m}$$ включается в шифртекст для того, чтобы законный получатель мог его расшифровать. При этом для расшифровки вычисляется $${x}_{0}$$ по следующему алгоритму:
$$\alpha ={\left(\frac{p+1}{4}\right)}^{m}~(\mod \left(p-1\right)),\\ \beta ={\left(\frac{q+1}{4}\right)}^{m}~(\mod \left(q-1\right)),\\ u={\left({x}_{m}~(\mod p)\right)}^{\alpha }~(\mod p),\\ v={\left({x}_{m}~(\mod q)\right)}^{\beta }~(\mod q),\\ {x}_{0}=(apv+bqu) ~(\mod n), $$где $$a$$ и $$b$$ находятся расширенным алгоритмом Евклида: $$ap+bq=1$$.
Пример 8.12 Каждой букве русского алфавита (отождествим Е и Ё) поставим в соответствие её порядковый номер в двоичной записи:
$$\text{А} = 00000,\quad \text{Б} = 00001,\quad \text{В} = 00010, \quad {\dots}, \quad \text{Я} = \ 11111.$$Зашифруем слово "шифр" по алгоритму вероятностного шифрования.
Используя приведенную схему кодирования, получаем:
$$t=11000010001010010000.$$Выберем простые числа: $$p=100699,q=100943$$. Тогда $$n=10164859157$$. Возьмём случайный квадратичный вычет $${x}_{0}=2081895771$$ по модулю $$n$$. Последовательно возводя его в квадрат, получаем:
|
|
Получаем шифртекст: $$c=(9863050867,01110111101111000011)$$.
Пример 8.13 Шифртекст $$c$$ получен из слова в алфавите А, Б, ..., Я по схеме вероятностного шифрования с использоваем открытого ключа $$n=pq$$. Найти открытый текст. $$p=101987$$, $$q=101267$$, $$c = (9775365428, 11010000001111001000)$$.
Имеем $$m=19$$, $$n=pq = 101987 \cdot 101267 = 10327917529$$.
Расшифровку проведем по алгоритму (8.1):
1) Вычисляем $$\alpha$$ и $$\beta$$:
$$\alpha=\left(\frac{101987+1}{4}\right)^{19} ~ \mod (101987-1)=68875,$$ $$\beta=\left(\frac{101267+1}{4}\right)^{19} ~ \mod (101267-1)=48149.$$2) Находим $$u$$ и $$v$$:
$$u=(9775365428 \mod 101987)^{68875} ~ \mod 101987=101358;$$ $$v=(9775365428 \mod 101267)^{48149} ~ \mod 101267=25104.$$3) С помощью алгоритма Евклидва найдём целые числа $$a$$ и $$b$$ такие, что $$ap+bq=1$$, т.е. $$a=p^{-1}(\mod q)$$, $$b=q^{-1}(\mod p)$$. Получаем: $$a=5204$$, $$b=-5241$$.
4) Находим $$x_0$$:
$$x_0=(5204\cdot 101987\cdot 25104+(-5241)\cdot 101267\cdot 101358) ~ \mod 10327917529=4034401117.$$Теперь вычисляем $$x_1, \ldots, x_{19}$$:
|
|
Прибавляя поразрядно последовательность $$x_0 ~(\mod 2)$$, $$x_1 ~(\mod 2)$$, $$\ldots$$, $$x_{19} ~(\mod 2)$$ к шифрограмме, получаем код исходного сообщения:
| $$x_i~(\mod 2)$$ | 11000 | 01110 | 10101 | 00010 |
| шифрограмма | 11010 | 00000 | 11110 | 01000 |
| сумма | 00010 | 01110 | 01011 | 01010 |
| открытый текст | В | О | Л | К |
Опишем аналоги некоторых широко распространенных систем с открытым ключом, основанные на задаче дискретного логарифмирования на эллиптической кривой, определенной над конечным полем $${F}_{q}$$.
Предположим, что абоненты А и Б хотят договориться о ключе, которым будут впоследствии пользоваться в некоторой классической криптосистеме. Прежде всего, они открыто выбирают какое-либо конечное поле $${F}_{q}$$ ($$q=p^r$$) и какую-либо эллиптическую кривую $$E$$ над ним. Их ключ строится по случайной точке $$P$$ на этой эллиптической кривой. Если у них есть случайная точка $$P$$, то, например, ее $$x$$-координата дает случайный элемент $${F}_{q}$$, который можно затем преобразовать в $$r$$-разрядное целое число в $$p$$-ричной системе счисления, и это число может служить ключом в их классической криптосистеме. Они должны выбрать точку $$P$$ так, чтобы все их сообщения друг другу были открытыми и все же никто, кроме них двоих, ничего бы не знал о $$P$$.
Абоненты (пользователи) А и Б первым делом открыто выбирают точку $$G\in E$$ в качестве "основания". Чтобы образовать ключ, абонент А вначале случайным образом выбирает целое число $$a$$, это число он держит в секрете. Он вычисляет $$aG\in E$$ и передает эту точку открыто. Абонент Б делает то же самое: он выбирает случайно $$b$$ и открыто передает $$bG\in E$$. Тогда используемый ими секретный ключ - это $$P=abG\in E$$. Оба пользователя могут вычислить этот ключ. Например, абонент А знает $$bG$$ (точка была передана открыто) и свое собственное секретное a. Однако любая третья сторона знает лишь $$aG$$ и $$bG$$. Кроме решения задачи дискретного логарифмирования - нахождения $$a$$ по $$G$$ и $$aG$$ (или нахождения $$b$$ по $$G$$ и $$bG$$) - по-видимому, нет способа найти $$abG$$, зная лишь $$aG$$ и $$bG$$.
Пример 8.14 Возьмём эллиптическую кривую $$E_p(0,-4)$$, где $$p=211$$, и точку $$G=(2,2)$$. Произведём обмен ключами.
Личным ключом пользователя А является $$a = 121$$, поэтому его открытым ключом будет $$aG =121\cdot (2, 2) = (115, 48)$$. Личным ключом пользователя Б является $$b = 203$$, поэтому его открытым ключом будет $$bG=203\cdot (2, 2) = (130, 203)$$. Общим секретным ключом является
$$abG = 121(130, 203) = 203(115, 48) = (161,169).$$Общий секретный ключ представляет собой пару чисел. Если этот ключ предполагается использовать в качестве сеансового ключа для традиционного шифрования, то из этой пары чисел необходимо генерировать одно подходящее значение. Можно, например, использовать просто координату $$x$$ или некоторую простую функцию от $$x$$.
Как и в описанной выше системе ключевого обмена, мы исходим из несекретных данных:
Каждый из пользователей выбирает случайное целое число: $$a_\text{А}$$ - у пользователя А, и $$a_\text{Б}$$ - у пользователя Б, которое пользователь держит в секрете. Затем пользователи А и Б вычисляют точки, соответственно, $$a_\text{А} G$$ и $$a_\text{Б} G$$.
Чтобы послать пользователю Б сообщение $$P_m$$, пользователь А выбирает случайно целое число $$k$$ и посылает пару точек $$\{kG, P_m+k a_{\text{Б}} G$$ (где $$a_{\text{Б}} G$$ - открытый ключ пользователя Б). Чтобы прочитать сообщение, пользователь Б умножает первую точку из полученной пары на свое секретное число $$a_\text{Б}$$ и вычитает результат умножения из второй точки:
$$P_m + ka_\text{Б} G - a_\text{Б} kG.$$Таким образом, пользователь А посылает замаскированное сообщение $$P_m$$ вместе с "подсказкой" $$kG$$, при помощи которой можно снять "маску" $$ka_\text{Б} G$$, если знать секретное число $$a_\text{Б}$$. Злоумышленник, который умеет решать задачу дискретного логарифмирования на $$E$$, может, конечно, найти $$a_\text{Б}$$, зная $$a_\text{Б} G$$ и $$G$$.
Пример 8.15 Рассмотрим кривую $$E_p(-1,188)$$ с $$p = 751$$ (что соответствует кривой $$y^2 = x^3-x+188$$) и точкку $$G=(0, 376)$$. Предположим, что пользователь А собирается отправить пользователю Б сообщение, которое кодируется эллиптической точкой $$P_m=(562,201)$$, и что пользователь А выбирает случайное число $$k= 386$$. Открытым ключом пользователя Б является $$P_{\text{Б}} = (201,5)$$.
Мы имеем
$$386(0,376) = (676,558),\qquad (562,201) + 386(201, 5) = \ (385, 328).$$Таким образом, пользователь А должен послать шифрованный текст: {(676, 558), (385, 328)}.
См. [3]
Перед шифрованием необходимо выбрать способ кодирования текста. Для этого найдем точки на кривой и некоторым из них поставим в соответствие символы.
Выберем кривую $$E_{751}(-1,1)$$, т. е. $$y^2=x^3-x+1 ~(\mod 751)$$. Таблица 8.3 задаёт соответствие символов и некоторых точек кривой.
| № | Символ | Точка | № | Символ | Точка | № | Символ | Точка |
|---|---|---|---|---|---|---|---|---|
| 1 | пробел | (33, 355) | 54 | U | (80, 433) | 107 | Л | (200, 721) |
| 2 | ! | (33, 396) | 55 | V | (82, 270) | 108 | М | (203, 324) |
| 3 | " | (34, 74) | 56 | W | (82, 481) | 109 | Н | (203, 427) |
| 4 | # | (34, 677) | 57 | X | (83, 373) | 110 | О | (205, 372) |
| 5 | $ | (36, 87) | 58 | Y | (83, 378) | 111 | П | (205, 379) |
| 6 | % | (36, 664) | 59 | Z | (85, 35) | 112 | Р | (206, 106) |
| 7 | (39, 171) | 60 | [ | (85, 716) | 113 | С | (206, 645) | |
| 8 | ' | (39, 580) | 61 | \ | (86,25) | 114 | Т | (209, 82) |
| 9 | ( | (43, 224) | 62 | ] | (86, 726) | 115 | У | (209, 669) |
| 10 | ) | (43, 527) | 63 | $$\widehat{\hphantom{-}}$$ | (90,21) | 116 | Ф | (210, 31) |
| 11 | * | (44, 366) | 64 | _ | (90, 730) | 117 | Х | (210, 720) |
| 12 | + | (44, 385) | 65 | ' | (93, 267) | 118 | Ц | (215, 247) |
| 13 | , | (45, 31) | 66 | a | (93, 484) | 119 | Ч | (215, 504) |
| 14 | - | (45, 720) | 67 | b | (98, 338) | 120 | Ш | (218,150) |
| 15 | . | (47, 349) | 68 | c | (98, 413) | 121 | Щ | (218, 601) |
| 16 | / | (47, 402) | 69 | d | (99, 295) | 122 | Ъ | (221, 138) |
| 17 | 0 | (48,49) | 70 | e | (99, 456) | 123 | Ы | (221, 613) |
| 18 | 1 | (48, 702) | 71 | f | (100, 364) | 124 | Ь | (226, 9) |
| 19 | 2 | (49, 183) | 72 | g | (100, 387) | 125 | Э | (226, 742) |
| 20 | 3 | (49, 568) | 73 | h | (102, 267) | 126 | Ю | (227, 299) |
| 21 | 4 | (53, 277) | 74 | i | (102, 484) | 127 | Я | (227, 452) |
| 22 | 5 | (53, 474) | 75 | j | (105, 369) | 128 | а | (228, 271) |
| 23 | 6 | (56, 332) | 76 | k | (105,382) | 129 | б | (228, 480) |
| 24 | 7 | (56, 419) | 77 | l | (106, 24) | 130 | в | (229, 151) |
| 25 | 8 | (58, 139) | 78 | m | (106, 727) | 131 | г | (229, 600) |
| 26 | 9 | (58, 612) | 79 | n | (108, 247) | 132 | д | (234, 164) |
| 27 | : | (59, 365) | 80 | o | (108, 504) | 133 | е | (234, 587) |
| 28 | ; | (59, 386) | 81 | p | (109, 200) | 134 | ж | (235, 19) |
| 29 | < | (61, 129 | 82 | q | (109, 551) | 135 | з | (235, 732) |
| 30 | = | (61, 622) | 83 | r | (110, 129) | 136 | и | (236, 39) |
| 31 | > | (62, 372) | 84 | s | (110, 622) | 137 | й | (236, 712) |
| 32 | ? | (62, 379) | 85 | t | (114, 144) | 138 | к | (237, 297) |
| 33 | @ | (66, 199) | 86 | u | (114, 607) | 139 | л | (237, 454) |
| 34 | A | (66, 552) | 87 | v | (115, 242) | 140 | м | (238, 175) |
| 35 | B | (67,84) | 88 | w | (115, 509) | 141 | н | (238, 576) |
| 36 | C | (67, 667) | 89 | x | (116, 92) | 142 | о | (240, 309) |
| 37 | D | (69, 241) | 90 | y | (116, 659) | 143 | п | (240, 442) |
| 38 | E | (69, 510) | 91 | z | (120, 147) | 144 | р | (243, 87) |
| 39 | F | (70, 195) | 92 | { | (120, 604) | 145 | с | (243, 664) |
| 40 | G | (70, 556) | 93 | _ | (125, 292) | 146 | т | (247, 266) |
| 41 | H | (72, 254) | 94 | } | (125, 459) | 147 | у | (247, 485) |
| 42 | I | (72, 497) | 95 | $$\sim$$ | (126, 33) | 148 | ф | (249, 183) |
| 43 | J | (73,72) | 96 | А | (189, 297) | 149 | х | (249, 568) |
| 44 | K | (73, 679) | 97 | Б | (189, 454) | 150 | ц | (250, 14) |
| 45 | L | (74, 170) | 98 | В | (192, 32) | 151 | ч | (250, 737) |
| 46 | M | (74, 581) | 99 | Г | (192, 719) | 152 | ш | (251, 245) |
| 47 | N | (75, 318) | 100 | Д | (194, 205) | 153 | щ | (251, 506) |
| 48 | O | (75, 433) | 101 | Е | (194, 546) | 154 | ъ | (253, 211) |
| 49 | P | (78, 271) | 102 | Ж | (197, 145) | 155 | ы | (253, 540) |
| 50 | Q | (78, 480) | 103 | З | (197, 606) | 156 | ь | (256, 121) |
| 51 | R | (79, 111) | 104 | И | (198, 224) | 157 | э | (256, 630) |
| 52 | S | (79, 640) | 105 | Й | (198, 527) | 158 | ю | (257, 293) |
| 53 | T | (80, 318) | 106 | К | (200, 30) | 159 | я | (257, 458) |
Заметим, что мощность множества точек на этой кривой $$N= 727$$, поэтому при необходимости можно точками закодировать и некоторые специальные знаки (например, знак интеграла и т. п.), а также целые слова.
Приведем примеры решения контрольных заданий, представленных ниже.
Пример 8.16 (Шифрование) Пусть выбрана генерирующая точка $$G = (0, 1)$$. Предположим, пользователь $$A$$ решил отправить пользователю $$B$$ сообщение: строчную латинскую букву "A". В нашем алфавите эта буква кодируется точкой $$P_m = (66, 522)$$. Пусть пользователь $$A$$ выбрал случайное значение $$k = 3$$, а открытым ключом $$B$$ является точка $$P_B = (406, 397)$$, при этом секретным ключом $$B$$ является число $$n_b=45$$.
Шифрованный текст имеет вид $$C_m = \{kG, P_m+ k P_B\}$$.
Находим $$kG = 3\cdot (0,1) = (56, 419)$$.
Вычисляем $$P_m+kP_b = (66, 552) + 3\cdot (406, 397) = (301, 734)$$.
В результате: $$C_m= \{(56, 419), (301, 734)\}$$.
Пользователь $$B$$ для расшифрования сообщения должен провести следующие вычисления:
$$P_m + kP_B - n_BkG = P_m + k(n_BG)- nBkG = (301, 734) - 45 \cdot (56, 419) = (301, 734) + (175, 559) = (66, 552).$$После этого пользователь B по алфавиту определяет открытый буквенный текст: точке (66, 552) соответствует строчная латинская буква A.
Пример 8.17 Кривая: $${E}_{751}(-1,1)$$
Генерирующая точка: $$G=\left(0,1\right)$$
Открытый текст: "терновник"
Открытый ключ: $$(188,93)$$
Значения случайных чисел $$k$$ для букв открытого текста: $$8, 14, 17, 17, 2, 10, 8, 2, 2$$.
Установим соответствие точек кривой буквам:
| т $$\rightarrow$$ (247, 266) | н $$\rightarrow$$ (238, 576) | н $$\rightarrow$$ (238, 576) |
| е $$\rightarrow$$ (234, 587) | о $$\rightarrow$$ (240, 309) | и $$\rightarrow$$ (236, 39) |
| р $$\rightarrow$$ (243, 87) | в $$\rightarrow$$ (229, 151) | к $$\rightarrow$$ (237, 297) |
Расчёт:
| $${C}_{1}=\left\{\mathit{kG},{P}_{m}+k{P}_{B}\right\}=\left\{8{\cdot}\left(0,1\right),\left(247,266\right)+8{\cdot}(188,93)\right\} = = \left\{\left(346,242\right),\left(247,266\right)+(72,254)\right\}=\left\{\left(346,242\right),(594,414)\right\}$$; |
| $${C}_{2}=\left\{14{\cdot}\left(0,1\right),\left(234,587\right)+14{\cdot}(188,93)\right\}=\left\{\left(596,433\right),\left(234,587\right)=(416,55)\right\} = = \left\{\left(596,433\right),(34,677)\right\}$$; |
| $${C}_{3}=\left\{17{\cdot}\left(0,1\right),\left(243,87\right)=17{\cdot}(188,93)\right\}=\left\{\left(440,539\right),\left(243,87\right)+(665,153)\right\}= =\left\{\left(440,539\right),(546,670)\right\}$$; |
| $${C}_{4}=\left\{17{\cdot}\left(0,1\right),\left(238,576\right)+17{\cdot}(188,93)\right\} = = \left\{\left(440,539\right),\left(238,576\right)+(665,153)\right\}=\left\{\left(440,539\right),(694,581)\right\}$$; |
| $${C}_{5}=\left\{2{\cdot}\left(0,1\right),\left(240,309\right)+(188,93)\right\}=\left\{\left(188,93\right),\left(240,309\right)+(16,416)\right\}= = \left\{\left(188,93\right),(515,684)\right\}$$; |
| $${C}_{6}=\left\{10{\cdot}\left(0,1\right),\left(229,151\right)+10{\cdot}(188,93)\right\} = = \left\{\left(377,456\right),\left(229,151\right)+(657,285)\right\}=\left\{\left(377,456\right),(517,573)\right\}$$; |
| $${C}_{7}=\left\{8{\cdot}\left(0,1\right),\left(238,576\right)+8{\cdot}(188,93)\right\}=\left\{\left(346,242\right),\left(238,576\right)+(72,254)\right\}= = \left\{(346,242),(288,639)\right\}$$; |
| $${C}_{8}=\left\{2{\cdot}\left(0,1\right)\left(236,39\right)+2{\cdot}(188,93)\right\}=\left\{\left(188,93\right),\left(236,39\right)+(16,416)\right\} = = \left\{(188,93),(209,82)\right\}$$; |
| $${C}_{9}=\left\{2{\cdot}\left(0,1\right),\left(237,297\right)+2{\cdot}(188,93)\right\}=\left\{\left(188,93\right),\left(237,297\right)\right.+ \left.(16,416)\right\} = \left\{\left(188,93\right),(205,379)\right\}$$. |
Установим соответствие букв и точек шифрованного текста:
| Т | (346, 242), (594, 414) |
| е | (596, 433), (34, 677) |
| р | (440, 539), (546, 670) |
| н | (440, 539), (694, 581) |
| о | (188, 93), (515, 684) |
| в | (377, 456), (517, 573) |
| н | (346, 242), (288, 639) |
| и | (188, 93), (209, 82) |
| к | (188, 93), (205, 379) |
Шифртекст: {(346, 242), (594, 414)}; {(596, 433), (34, 677)}; {(440, 539), (546, 670)}; {(440, 539), (694, 581)}; {(188, 93), (515, 684)}; {(377, 456), (517, 573)}; {(346, 242), (288, 639)}; {(188, 93), (209, 82)}; {(188, 93), (205, 379)}.
Пример 8.18 (Расшифрование) Входные данные.
Кривая: $${E}_{751}(-1,1)$$
Генерирующая точка: $$G = (-1,1)$$
Шифртекст: {(377, 456), (367, 360)}, {(425, 663), (715, 398)}; {(188, 93), (279, 353)}, {(179, 275), (128,79)}; {(568, 355), (515, 67)}, {(568, 355), (482, 230)}; {(377, 456), (206, 645)}, {(188, 93), (300, 455)}; {(489, 468), (362, 446)}, {(16, 416), (69, 510)}; {(425, 663), (218,601)}.
Секретный ключ: $${n}_{B} = 44$$.
Расчёт:
| $${X}_{1} = {P}_{m} + kP_{B} - {n}_{B} \cdot (kG) = ( 367, 360) - 44 \cdot (377, 456) = (235, 732) \rightarrow \text{ "з" }$$ |
| $${X}_{2} = (715, 938) - 44 \cdot (425, 663) = (228, 271) \rightarrow \text{"а"}$$ |
| $${X}_{3} = (279, 353) - 44 \cdot (188, 93) = (240, 309) \rightarrow \text{"о"}$$ |
| $${X}_{4} = (128, 79) - 44 \cdot (179, 275) = (243, 664) \rightarrow \text{"с" }$$ |
| $${X}_{5} = (515, 67) - 44 \cdot (568, 355) = (247, 266) \rightarrow \text{"т"}$$ |
| $${X}_{6} = (482, 230) - 44 \cdot (568, 355) = (235, 732) \rightarrow \text{"р"}$$ |
| $${X}_{7} = (206, 645) - 44 \cdot (377, 456) = (243, 87) \rightarrow \text{"е"}$$ |
| $${X}_{8} = (300, 455) - 44 \cdot (188, 93) = (238, 576) \rightarrow \text{"н"}$$ |
| $${X}_{9} = (362, 446) - 44 \cdot (489, 468) = (238, 576) \rightarrow \text{"н"}$$ |
| $${X}_{10} = (69, 510) - 44 \cdot (16, 416) = (253, 540) \rightarrow \text{"ы"}$$ |
| $${X}_{11} = (218, 601) - 44 {\cdot} (425, 663) = (236, 712) \rightarrow \text{"й"}$$ |
Открытый текст - "заостренный".
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.