Давайте уберём метафору и посмотрим, что же нужно, чтобы эта схема функционировала.
Замок и ключ, это, конечно, шифры, а бриллиант — пересылаемое сообщение. И тут нужны две важные вещи:
*) шифры должны коммутировать: мы взяли сообщение, сначала зашифровали его шифром А, а потом результат шифром Б; после этого « снимаем замок А » — применяем расшифровывающее отображение — и хотим получить сообщение, зашифрованное чисто шифром Б.
*) знание для одного из шифров какой-то пары из исходного и зашифрованного сообщения не должно помогать атакующему: по открытому каналу передаются как «сообщение» А(бриллианта), так и его «результат Б-шифровки» Б(А(бриллианта)).
Замок и ключ, это, конечно, шифры, а бриллиант — пересылаемое сообщение. И тут нужны две важные вещи:
*) шифры должны коммутировать: мы взяли сообщение, сначала зашифровали его шифром А, а потом результат шифром Б; после этого « снимаем замок А » — применяем расшифровывающее отображение — и хотим получить сообщение, зашифрованное чисто шифром Б.
*) знание для одного из шифров какой-то пары из исходного и зашифрованного сообщения не должно помогать атакующему: по открытому каналу передаются как «сообщение» А(бриллианта), так и его «результат Б-шифровки» Б(А(бриллианта)).
Так, есть простой шифр « прибавление секретного ключа K » [например, с приведением по публично объявленному модулю].
Он удовлетворяет первому условию — прибавления ключей K_A и K_B коммутируют — но не удовлетворяет второму: по сообщению и его зашифрованному образу атакующий мгновенно восстанавливает секретный ключ, и дальше расшифровывает все остальные сообщения.
Он удовлетворяет первому условию — прибавления ключей K_A и K_B коммутируют — но не удовлетворяет второму: по сообщению и его зашифрованному образу атакующий мгновенно восстанавливает секретный ключ, и дальше расшифровывает все остальные сообщения.
Зато можно такую схему реализовать с возведением в степень вместо сложения (и получается не алгоритм RSA, хоть и визуально похожий). А именно:
*) Публично объявлено большое [как положено, сотня-тысяча знаков) простое число P.
*) У каждого из А и Б есть свои секретные ключи — [большие] числа a и b, взаимно простые с P-1.
Раз a и P-1 взаимно-простые, то из алгоритма Евклида А знает такое R, что aR сравнимо с 1 по модулю P-1.
И тогда по модулю P операции возведения в степень a и в степень R взаимно-обратны: для любого
сообщения M выполнено (M^a)^R=M^(aR) = M, поскольку M^(P-1)=1, а aR=1 mod (P-1).
Поэтому возведение в степень a можно счесть « А-шифровкой », а в степень R — « А-расшифровкой »
Точно так же, Б знает такое S, что bS=1 mod (P-1), и возведения в степень b и в степень S обратны
друг другу, и мы возьмём их как Б-шифрование и Б-расшифровку.
*) Публично объявлено большое [как положено, сотня-тысяча знаков) простое число P.
*) У каждого из А и Б есть свои секретные ключи — [большие] числа a и b, взаимно простые с P-1.
Раз a и P-1 взаимно-простые, то из алгоритма Евклида А знает такое R, что aR сравнимо с 1 по модулю P-1.
И тогда по модулю P операции возведения в степень a и в степень R взаимно-обратны: для любого
сообщения M выполнено (M^a)^R=M^(aR) = M, поскольку M^(P-1)=1, а aR=1 mod (P-1).
Поэтому возведение в степень a можно счесть « А-шифровкой », а в степень R — « А-расшифровкой »
Точно так же, Б знает такое S, что bS=1 mod (P-1), и возведения в степень b и в степень S обратны
друг другу, и мы возьмём их как Б-шифрование и Б-расшифровку.
Ну и, чтобы передать сообщение M от A к Б, им достаточно переслать друг другу сообщения (каждый раз приводя результат по модулю P, я этого каждый раз писать не буду):
1) (А вычисляет и отправляет) M^a
2) (Б добавляет свой шифр и пересылает обратно) (M^a)^b=M^(ab)
3) (А снимает свой шифр и пересылает опять Б) (M^(ab))^R = M^(abR)= M^b
4) (Б снимает свой шифр) (M^b)^S=M^(bS)=M.
Ура!
1) (А вычисляет и отправляет) M^a
2) (Б добавляет свой шифр и пересылает обратно) (M^a)^b=M^(ab)
3) (А снимает свой шифр и пересылает опять Б) (M^(ab))^R = M^(abR)= M^b
4) (Б снимает свой шифр) (M^b)^S=M^(bS)=M.
Ура!
И видно, что формально-математически знание (M^a) и (M^a)^b позволяет восстановить b — но это задача « дискретного логарифмирования ». Соответственно, нужно, чтобы она была сложной (ну и, как совсем не специалист, я не полезу в вопросы того, когда она считается сложной, а когда нет).
См.: https://en.wikipedia.org/wiki/Three-pass_protocol
+ https://ru.wikipedia.org/wiki/%D0%9A%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D0%9C%D1%8D%D1%81%D1%81%D0%B8_%E2%80%94_%D0%9E%D0%BC%D1%83%D1%80%D1%8B
См.: https://en.wikipedia.org/wiki/Three-pass_protocol
+ https://ru.wikipedia.org/wiki/%D0%9A%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D0%9C%D1%8D%D1%81%D1%81%D0%B8_%E2%80%94_%D0%9E%D0%BC%D1%83%D1%80%D1%8B
Wikipedia
Three-pass protocol
In cryptography, a three-pass protocol for sending messages is a framework which allows one party to securely send a message to a second party without the need to exchange or distribute encryption keys. Such message protocols should not be confused with various…
Буквально с этой задачей мы закончили — но та же идея коммутирующих шифров используется ещё одним способом, и именно тут применяют эллиптические кривые.
А именно — много что можно сделать, если у двух сторон есть общий секретный ключ. Только вот как сделать так, чтобы он оказался у обоих сторон сразу?
А именно — много что можно сделать, если у двух сторон есть общий секретный ключ. Только вот как сделать так, чтобы он оказался у обоих сторон сразу?
Например: пусть две стороны заранее договорились о длинной совершенно случайной последовательности
нулей и единиц. Первый побитово прибавляет его к своему сообщению, пересылает результат, а второй такой же побитовой суммой восстанавливает исходное сообщение.
Это называется «шифр Вернама» ( https://ru.wikipedia.org/wiki/шифр_Вернама ), и при условии секретности (и случайности, и однократного использования) ключей он абсолютно надёжен —
любое кодированное сообщение может быть шифром любого исходного, если монетка выпадала нужной последовательностью. И с точки зрения перехватывающего, все возможные исходные сообщения равновероятны.
Но недостаток его состоит в том, что используемый секретный ключ (которым стороны обмениваются до сеанса связи) по длине совпадает с сообщением. То есть шифроблокноты нужно завозить как минимум чемоданами.
нулей и единиц. Первый побитово прибавляет его к своему сообщению, пересылает результат, а второй такой же побитовой суммой восстанавливает исходное сообщение.
Это называется «шифр Вернама» ( https://ru.wikipedia.org/wiki/шифр_Вернама ), и при условии секретности (и случайности, и однократного использования) ключей он абсолютно надёжен —
любое кодированное сообщение может быть шифром любого исходного, если монетка выпадала нужной последовательностью. И с точки зрения перехватывающего, все возможные исходные сообщения равновероятны.
Но недостаток его состоит в том, что используемый секретный ключ (которым стороны обмениваются до сеанса связи) по длине совпадает с сообщением. То есть шифроблокноты нужно завозить как минимум чемоданами.
Wikipedia
Шифр Вернама
шифр с абсолютной криптографической стойкостью
В качестве отступления в сторону: когда в 1940-ых в советской шифрованной переписке произошло повторное использование кодовых страниц (делающее атаку на шифр возможной) — американцы смогли некоторые сообщения расшифровать ( https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82_%C2%AB%D0%92%D0%B5%D0%BD%D0%BE%D0%BD%D0%B0%C2%BB ).
И я тут процитирую из той же Википедии прекрасную формулировку:
«При этом складывалась парадоксальная ситуация: величайший секрет разведки США — чтение советских депеш, из которых узнали, что советская разведка знала величайший секрет британской разведки, состоявший в том, что они читали немецкие депеши.»
И я тут процитирую из той же Википедии прекрасную формулировку:
«При этом складывалась парадоксальная ситуация: величайший секрет разведки США — чтение советских депеш, из которых узнали, что советская разведка знала величайший секрет британской разведки, состоявший в том, что они читали немецкие депеши.»
Но, конечно, шифром Вернама всё не исчерпывается — шифры, где один и тот же ключ используется для шифровки и для дешифровки, называются симметричными (см. https://en.wikipedia.org/wiki/Symmetric-key_algorithm ) — и их много. Главный вопрос — как получить общий секретный ключ.
И позволяющий сделать это алгоритм — протокол Диффи-Хеллмана: https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%BE%D1%82%D0%BE%D0%BA%D0%BE%D0%BB_%D0%94%D0%B8%D1%84%D1%84%D0%B8_%E2%80%94_%D0%A5%D0%B5%D0%BB%D0%BB%D0%BC%D0%B0%D0%BD%D0%B0 ; в англовики на эту тему есть прекрасная картинка из той же Википедии:
То есть — у нас есть некоторая общеизвестная «начальная точка» P, после чего стороны применяют к ней каждая свой шифр, пересылая друг другу результаты A(P) и B(P), и применяют к полученному от собеседника свой шифр — получая A(B(P)) и B(A(P)).
Если шифры коммутировали — то вот у них и получился общий секретный ключ. Вот только где добыть коммутирующие шифры?
Если шифры коммутировали — то вот у них и получился общий секретный ключ. Вот только где добыть коммутирующие шифры?
Один пример — возведение в секретную степень по большому (известному) простому модулю — мы уже выше видели. А второй как раз доставляют эллиптические кривые — и давайте я наконец скажу, что это такое.
Пусть на плоскости нарисована кривая, задаваемая уравнением третьей степени — F(x,y)=0 — и пусть она гладкая: без особых точек, как у « клюва » y^2=x^3, или самопересечения, как у
y^2=x^2(x+1).
Будем называть такую кривую эллиптической.
y^2=x^2(x+1).
Будем называть такую кривую эллиптической.
Если быть более точным, то правильно эллиптическую кривую рассматривать не на обычной плоскости, а на проективной, добавляя к ней «точки на бесконечности».
Можно показать, что проективными преобразованиями такую кривую можно привести к более простому виду:
y^2=P(x),
где P — многочлен степени 3.
В этом виде единственной точкой на бесконечности будет точка на « вертикальной бесконечности » (в направлении (0,1)), к которой эта кривая стремится; кстати — это точка перегиба: касание кривой с бесконечно удалённой прямой третьего порядка.
Можно показать, что проективными преобразованиями такую кривую можно привести к более простому виду:
y^2=P(x),
где P — многочлен степени 3.
В этом виде единственной точкой на бесконечности будет точка на « вертикальной бесконечности » (в направлении (0,1)), к которой эта кривая стремится; кстати — это точка перегиба: касание кривой с бесконечно удалённой прямой третьего порядка.
Так вот, оказывается, точки на эллиптической кривой тоже можно складывать!
Об этом можно почитать в брошюре Цфасмана и Острика (которую я очень люблю) —
https://www.mccme.ru/mmmf-lectures/books/#book-8 — но « парой штрихов » я это всё расскажу.
Об этом можно почитать в брошюре Цфасмана и Острика (которую я очень люблю) —
https://www.mccme.ru/mmmf-lectures/books/#book-8 — но « парой штрихов » я это всё расскажу.
Итак: пусть у нас задана какая-то эллиптическая кривая, и заданы две точки на ней. Проведём через них прямую. Ограничение уравнение кривой на неё — это уравнение (в типичном случае) третьей степени, у которого уже есть два корня. Значит, будет и третий —
третья точка пересечения. Так вот, мы определим сложение точек на эллиптической кривой исходя из вот такого правила: сумма трёх точек, лежащих на одной прямой, равна нулю.
Но что такое ноль? Это, конечно, тоже одна из точек кривой, и в этом качестве мы выберем и зафиксируем какую-нибудь точку перегиба O.
третья точка пересечения. Так вот, мы определим сложение точек на эллиптической кривой исходя из вот такого правила: сумма трёх точек, лежащих на одной прямой, равна нулю.
Но что такое ноль? Это, конечно, тоже одна из точек кривой, и в этом качестве мы выберем и зафиксируем какую-нибудь точку перегиба O.
Теперь понятно, как найти сумму P+Q точек P и Q на кривой — нужно провести прямую PQ, найти третью точку пересечения: (-P-Q). Теперь проведём прямую через (-P-Q) и O — и найдём искомую сумму P+Q.
Очевидно, что такое сложение коммутативно. А вот будет ли оно ассоциативно, правда ли, что (P+Q)+R=P+(Q+R)?
Очевидно, что такое сложение коммутативно. А вот будет ли оно ассоциативно, правда ли, что (P+Q)+R=P+(Q+R)?
Оказывается, что будет — и при этом образуется красивая конфигурация из 9 точек, через которых проходят три кривых, задаваемых уравнением 3 степени: это произведение трёх « вертикальных » прямых, трёх « горизонтальных », и собственно наша эллиптическая кривая.