Асимметричное шифрование. Как это работает?

182 комментария

cryptoМало кто знает как именно работает асимметричное шифрование. К примеру есть люди которые не считают протокол https какой-либо адекватной защитой передаваемых данных. И как правило на попытку убедить в обратном, они отвечают что-то в духе «если мы передаем зашифрованные данные, то мы должны сказать как их расшифровывать, а эту информацию можно перехватить и, следовательно, расшифровать данные». А на аргументы, что это не так и в основу положено асимметричное шифрование, поступает ответ «Ну и что?».

Ладно, я понимаю, знать все тонкости реализации асимметричного шифрования нужно далеко не всем. Но общий принцип работы, я считаю, должен знать каждый, кто как-либо связан с компьютерами.

Хочу вынести суть данного поста в эту аннотацию: Запомните, асимметричное шифрование безопасно, естественно при выполнении всех условий. И чтобы доказать это я попробую описать алгоритм понятным языком, чтобы каждый смог понять, что он безопасен. Встречайте Алису, Боба и Еву и передачу их секретного сообщения под катом.

Кстати почему Алиса и Боб? Об этом есть кратенькая статья на википедии: Алиса, Боб и Ева. Чтобы было понятнее, Алиса и Боб хотят обменяться сообщениями, а Ева пытается эти сообщения перехватить и прочесть.

Немного истории

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

К примеру, Алиса зашифровала некоторое сообщение и хочет отправить его Бобу. Естественно, чтобы Боб его прочитал, ему нужен ключ которым было зашифровано данное сообщение. И тут возникает проблема, как передать ключ чтобы его никто не смог перехватить. Пытливые умы предложат — пусть передают при личной встрече, а потом общаются сколько захотят. Да, не спорю, выход. А теперь представьте на секунду, что ваша интернет почта, перед тем как вы авторизируетесь в ней, потребует вашей поездки до физического местоположения сервера с почтой. Удобно? Пожалуй не очень.

Конечно ключ можно передавать по другому каналу связи. Но криптография рассматривает все незащищенные каналы связи как небезопасные. То есть передача ключа Бобу по телефону, например, считается небезопасной так, как ничто не мешает Еве прослушивать и телефон в том числе.

До 70-ых годов, эта проблема настолько стала привычной, что считался аксиомой тот факт, что для передачи сообщения нужно передавать и ключ которым сообщение зашифровано (причем некоторых люди до сих пор считают именно так). Но в 76 году Диффи и Хеллман предложили свой «метод экспоненциального обмена ключей». С этих годов и началось развитие асимметричных криптосистем.

Немножко реальной жизни

Прежде чем изучать какой либо алгоритм, нужно представить как он работает. И самый простой способ — это сравнить его с работой чего-то в реальности.

Представим что Алиса и Боб живут в стране, в которой вся почтовая система абсолютно аморальна и почтовые служащие читают всю незащищенную корреспонденцию. Алиса, девочка не глупая, прежде чем отправить сообщение Бобу, взяла железный ящик и, положив внутрь письмо и закрыв его на свой замок, отправляет этот ящик Бобу.

Естественно на почте прочитать это письмо не могут, но его не может прочитать и сам Боб, так как у него нет ключа которым закрыт замок. Алиса, конечно, может взять еще один железный ящик, положить в него ключ от предыдущего, и отправить его Бобу, но его Боб тоже не сможет открыть…

Единственный путь это все же сделать дубликат ключа и дать его Бобу при личной встрече…

И вот начинает казаться что обмен ключами является неизбежной частью шифрования — или все-таки нет?

Представим другую картину. Распишу пошагово:

  1. Алиса кладет свое письмо в железный ящик и, заперев его на замок, отправляет Бобу.
  2. Боб при получении ящика, (внимание!) берет свой замок и, дополнительно заперев им ящик, отправляет обратно.
  3. Алисе ящик приходит уже с двумя замками (напомню с первым замком Алисы от которого у нее есть ключ, и со вторым — Боба, от которого ключ есть есть только у Боба).
  4. Алиса снимает свой замок, и отправляет ящик обратно Бобу
  5. Бобу приходит ящик с уже одним его замком от которого у него есть ключ
  6. Боб отпирает оставшийся его замок своим ключом, и читает сообщение

Значение этой кратенькой истории огромно. Она показывает что два человека могут передавать секретное сообщение без обмена ключами. Вдумайтесь! Эта история фактически рушит все аксиомы на которых была построена тогдашняя криптография. Да мы получаем некоторое усложнение процесса (ящик пришлось пересылать три раза), но результат…

Вернемся к криптографии

Казалось бы решение найдено. Отправитель и принимающий шифруют свое сообщение, и затем собеседники поочередно снимают свой шифр.
scheme-encryption
Но суть в том что не существуют таких шифров, которые бы позволили снять шифр из под другого шифра. То есть этап где Алиса снимает свой шифр невозможен:
scheme-encryption-none
К сожалению, все имеющиеся алгоритмы до сих пор требуют снятия шифров в той очереди в которой они были применены. Боюсь назвать это аксиомой (так как история уже знает случаи когда такие аксиомы разбивались в пух и прах), но это так до сих пор.

Вернемся к математике

Идея с ящиком, о которой я описывал выше, вдохновили Диффи и Хеллмана искать способ передачи сообщения. В конце концов они пришли к использованию односторонних функций.

Что такое односторонняя функция? К примеру есть функция удвоение, т.е удвоить(4)=8, она двухсторонняя, т.к. из результата 8 легко получить исходное значение 4. Односторонняя функция — та функция после применения которой практически невозможно получить исходное значение. К примеру смешивание желтой и синей краски — пример односторонней функции. Смешать их легко, а вот получить обратно исходные компоненты — невозможно. Одна из таких функций в математике — вычисление по модулю.

За основу алгоритма Хеллман предложил функцию Yx (mod P). Обратное преобразование для такой функции очень сложно, и можно сказать что, по сути, заключается в полном переборе исходных значений.

К примеру вам сказали, что 5 x (mod 7) = 2, попробуйте найдите x, а? Нашли? А теперь представьте что за Y и P взяты числа порядка 10300.

Кстати сказать, для повышения стойкости, число P должно являться простым числом, а Y — являться первообразным корнем по модулю P. Но так как мы все же пытаемся понять теорию, то смысла заморачиваться на этом я не вижу.

Алгоритм Диффи-Хеллмана

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

Алиса Боб
Этап 1 Оба участника договариваются о значениях Y и P для общей односторонней функции. Эта информация не является секретной. Допустим были выбраны значения 7 и 11. Общая функция будет выглядеть следующим образом: 7x (mod 11)
Этап 2 Алиса выбирает случайное число, например 3, хранит его в секрете, обозначим его как число A Боб выбирает случайное число, например 6, хранит его в секрете, обозначим его как число B
Этап 3 Алиса подставляет число A в общую функцию и вычисляет результат 73 (mod 11) = 343 (mod 11) = 2, обозначает результат этого вычисления как число a Боб подставляет число B в общую функцию и вычисляет результат 76 (mod 11) = 117649 (mod 11) = 4, обозначает результат этого вычисления как число b
Этап 4 Алиса передает число a Бобу Боб передает число b Алисе
Этап 5 Алиса получает b от Боба, и вычисляет значение bA (mod 11) = 43 (mod 11) = 64 (mod 11) = 9 Боб получает a от Алисы, и вычисляет значение aB (mod 11) = 26 (mod 11) = 64 (mod 11) = 9
Этап 6 Оба участника в итоге получили число 9. Это и будет являться ключом.

Магия? Не спорю, с первого взгляда непонятно. Но после вчитывания и вдумывания в эту таблицу становится понятно как это работает. Впрочем если понятно не стало, то пролистайте до конца главы, там я выложил поясняющее видео.

Причем обратите внимание, что для получения ключа в конечной формуле, любому человеку нужно иметь три значения:

  • Значения a и P, и секретное число Боба B
  • или значения b и P, и секретное число Алисы A

Но секретные числа по каналу не передаются! Еве не получится восстановить ключ, не имея чьего-нибудь секретного числа. Почему — я писал выше, данная функция является односторонней. Попробуйте решите уравнение 4x (mod 11) = 2y (mod 11) найдя x и y.

Чтобы было понятнее, как работает схема Хеллмана, представьте шифр, в котором в качестве ключа каким-то образом используется цвет:

Допустим вначале, что у всех, включая Алису, Боба и Еву, имеется трехлитровая банка, в которую налит один литр желтой краски. Если Алиса и Боб хотят договориться о секретном ключе, они добавляют в свои банки по одному литру своей собственной секретной краски.

Алиса может добавить краску фиолетового оттенка, а Боб — малинового. После этого каждый из них посылает свою банку с перемешанным содержимым другому.

И наконец, Алиса берет смесь Боба и подливает в нее один литр своей секретной краски, а Боб берет смесь Алисы и добавляет в нее один литр своей секретной краски. Краска в обеих банках теперь станет одного цвета, поскольку в каждой находится по одному литру желтой, фиолетовой и малиновой краски.

Именно этот цвет, полученный при добавлении дважды в банки красок, и будет использоваться как ключ. Алиса понятия не имеет, какую краску добавил Боб, а Боб также не представляет, какую краску налила Алиса, но оба они достигли одного и того же результата.

Между тем Ева в ярости. Даже если она и сумеет перехватить банки с промежуточным продуктом, ей не удастся определить конечный цвет, который и будет согласованным ключом. Ева может видеть цвет краски, полученной при перемешивании желтой краски и секретной краски Алисы в банке, отправленной Бобу, и она может видеть цвет краски, полученной при перемешивании желтой краски и секретной краски Боба в банке, отправленной Алисе, но чтобы найти ключ, ей, на самом деле, необходимо знать цвета исходных секретных красок Алисы и Боба. Однако, рассматривая банки с перемешанными красками, Ева не сможет определить секретные краски Алисы и Боба. Даже если она возьмет образец одной из смешанных красок, ей не удастся разделить ее на исходные краски, чтобы найти секретную, поскольку смешивание краски является односторонней функцией.

Все равно непонятно? Тогда смотрим видео:
https://www.youtube.com/watch?v=5d8yniGL2G0

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

Асимметричное шифрование

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

В общем суть данного алгоритма заключается в том, что принимающая сторона перед приемкой сообщения генерирует пару ключей на основе алгоритма модульной арифметики (принцип такой же как и в алгоритме Диффи-Хеллмана), собственно приватный и публичный ключ. Отправитель перед отправкой получает публичный ключ и шифрует сообщение данным ключом, после чего данное сообщение можно расшифровать только приватным ключом, который хранится в секрете у принимающей стороны.
asymmetric-encryption
Если вернуться к аналогии с замками, то шифрование с открытым ключом можно представить себе следующим образом:

Любой способен запереть замок, просто защелкнув его, чтобы он закрылся, но отпереть его может только тот, у кого есть ключ. Запереть замок (зашифровывание) легко, почти все могут это сделать, но открыть его (расшифровывание) имеет возможность только владелец ключа. Понимание того, как защелкнуть замок, чтобы он закрылся, ничего не скажет вам, как его отпереть.

Можно провести и более глубокую аналогию.

Представьте, что Алиса проектирует замок и ключ. Она бдительно охраняет ключ, но при этом изготавливает тысячи дубликатов замков и рассылает их по почтовым отделениям по всему миру. Если Боб хочет послать сообщение, он кладет его в коробку, идет на местный почтамт, просит «замок Алисы» и запирает им коробку. Теперь уже ему не удастся открыть коробку, но когда коробку получит Алиса, она сможет открыть ее своим единственным ключом.

Замок и защелкивание его, чтобы он закрылся, эквивалентны общему ключу для зашифровывания, поскольку все имеют доступ к замкам и все могут воспользоваться замком, чтобы закрыть сообщение в коробке. Ключ от замка эквивалентен секретному ключу для расшифровывания, потому что он имеется только у Алисы, только она сможет открыть замок, и только она сможет получить доступ к находящемуся в коробке сообщению.

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

Заключение

Что же, надеюсь что, поняв как работает асимметричное шифрование изнутри, вы станете больше ему доверять и соответственно чаще пользоваться SSL =)

Использовались материалы из книги Сингх Саймон — Книга шифров. Кстати, самая лучшая книга для тех кто хочет хотя бы чуточку разбираться в криптографии. Всем советую прочитать.

Позволю себе вставить ссылку на один из прошлых моих постов: Коллизии хеш функций? асимметричное шифрование решает! — пример «нестандартного» применения асимметричного шифрования.

Спасибо за внимание =)

    1. Дмитрий Амиров Автор

      Спасибо за замечание починил картинки. Как вам статья в целом?)

      1. Михаил Лапко

        Замечательная статья! Огромное спасибо автору, так доходчиво и таким интригующим слогом я еще никогда не слышал, хотя учил и сдавал экзамен по RSA.
        Побольше пишите по теме крипто у вас отлично получается!

      2. brox

        Представим другую картину. Распишу пошагово:

        1. Алиса кладет свое письмо в железный ящик и, заперев его на замок, отправляет Бобу.
        2. Боб при получении ящика, (внимание!) берет свой замок и, дополнительно заперев им ящик, отправляет обратно.
        3. Алисе ящик приходит уже с двумя замками (напомню с первым замком Алисы от которого у нее есть ключ, и со вторым — Боба, от которого ключ есть есть только у Боба).
        4. Алиса снимает свой замок, и отправляет ящик обратно Бобу
        5. Бобу приходит ящик с уже одним его замком от которого у него есть ключ
        6. Боб отпирает оставшийся его замок своим ключом, и читает сообщение

        В этом рассуждении есть большущая дыра.
        1.а. Почтальон вешает собственный замок и отправляет ящик обратно Алисе; кроме того, почтальон посылает точно такой же внешне выглядящий ящик опять же со своим замком Бобу

        Дальнейшее, надеюсь, понятно)

        1. Алексей

          «Дальнейшее, надеюсь, понятно» — тут нужно обязательно уточнить, что вы имели в виду, чтобы не отвечать на вопрос, который не задан.
          «В этом рассуждении есть большущая дыра.» — а вот с этим уже можно поспорить.
          Скомпрометировать переписку Алису и Боба невозможно, они получат ящики, которые не смогут открыть, если на них повесят замок. Если у Почтальона задача чтобы переписки не было, нужно взорвать ящик или выключить рубильник электричества — результат тот же.

          Есть еще один момент, идея третей доверительной стороны. Это значит что на замках Алисы и Боба, будет еще «знак качества», потделать который почтальону можно только если он залетит внутрь еще одного ящика, находящегося может даже не на той же улице :)
          Так Алиса поймет, если нужно, чей замок Боба, а чей нет.

          1. Илья

            Вполне себе может: 4.1 почтальон получает ящик со своим замком уже без замка Алисы и открывает его, то же самое и со стороны Боба, получая доступ к переписке. Основа атаки man in the middle, которая вполне себе работает в рамках приведенного алгоритма

            1. Аноним

              Поэтому и сказано, что идея передачи с двумя замками — лишь идея.
              Снять шифр из-под другого шифра нереально.

      3. Тамара

        Спасибо, все очень понятно! Разложили по полочкам, читала с удовольствием!

  1. Boxa

    Спасибо за заметку, очень образно, интересно и понятно. Мне как новичку теперь понятно что это такое и как оно работает. Еще раз спасибо.

    1. Дмитрий Амиров Автор

      Именно этого я и добивался. Спасибо и вам за комментарий =)

  2. С++

    лучшее объяснение ассиметричного шифрования которое я встречал.
    мне стало гораздо понятнее как это работает.
    Спасибо большое.

  3. Alex

    Спасибо Вам, за интересную информацию изложенную в таком доступном для всех виде!

  4. Next

    Замечательная статья, весьма доступно, спасибо!
    А посоветовать книгу хорошую по основам криптографии и технологиям ssl/tls можете? :)

    1. Дмитрий Амиров Автор

      Спасибо и вам за отзыв!

      По технологиям ssl/tls — не посоветую, т.к. не знаю таких. А вот по основам криптографии — я уже писал в статье:

      Использовались материалы из книги Сингх Саймон — Книга шифров. Кстати, самая лучшая книга для тех кто хочет хотябы чуточку разбираться в криптографии. Всем советую прочитать.

      Почитайте, там все более чем доступно, и читать ее приятно.

  5. Михаил

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

    По-моему, Вы упустили один очень важный момент — процедуру передачи открытого ключа. Ведь его всё также нельзя передавать по открытому каналу. Иначе Ева сможет перехватить открытый ключ, передаваемый Бобом и отправить Алисе свой открытый ключ. Тогда Алиса будет шифровать сообщение открытым ключом Евы (думая, что это открытый ключ Боба), а Ева при перехвате сообщения от Алисы, будет расшифровывать его своим закрытым ключом, затем зашифровывать открытым ключом Боба и уже затем передавать дальше Бобу. Т.е. Ева сможет читать сообщения от Алисы Бобу.

    1. Дмитрий Амиров Автор

      Не скажу что я это упустил, пожалуй это уже следующая глава)

      А данная атака называется MiTM. Так например Алиса, для защиты от данной атаки, в процессе установки соединения, предоставляет Бобу свой сертификат подписанный надежным центром сертификации , который подтверждает мол, что Алиса — та самая за которую себя выдает.

      Из наиболее известного — так например работает HTTPS протокол. Грубо говоря, если клиенту передается самоподписанный (т.е. ненадежный) сертификат, то любой браузер выдает сообщение: «Мол данное соединение небезопасно или вас хотят прослушать». Но если сертификат подписан довереным центром — то это говорит о том что вы гарантированно подключены к нужному серверу.

      1. Михаил

        Но для этого открытый сертификат центра сертификации должен быть передан Бобу заранее по защищённому каналу. Т.е. просто добавляется ещё один уровень шифрования, который никак не решает проблему безопасной передачи ключа без необходимости в физической встрече (или другом относительно надёжном способе передачи ключа). И утверждение:

        Значение этой кратенькой истории огромно. Она показывает что два человека могут передавать секретное сообщение без обмена ключами.

        неверно. А слова Вашего друга очень даже верны (если отнести их именно к проблеме в целом):

        если мы передаем зашифрованные данные, то мы должны сказать как их расшифровывать, а эту информацию можно перехватить и следовательно расшифровать данные

        1. Дмитрий Амиров Автор

          Я не спорю, в ваших словах есть правда, если говорить об ассимитричном шифровании в целом.

          Но все же так или иначе на данный момент проблема решена. И решена она встраиванием доверенных корневых сертификатов в современные ОС.

          1. Михаил

            И решена она встраиванием доверенных корневых сертификатов в современные ОС.

            И для этого владельцы корневых сертификатов должны передать их разработчикам ОС по защищённому каналу, а разработчики ОС должны передать свою ОС пользователю по защищённому каналу (чтобы злоумышленник не подменил в ОС корневые сертификаты). Улавливаете мысль? Я слишком категорично высказался, говоря что «просто добавляется ещё один уровень шифрования, который никак не решает проблему безопасной передачи ключа без необходимости в физической встрече». Я имел ввиду, что сама модель, подразумеваюшая передачу ключа по защищённому каналу (т.е. необходимость в физических встречах) никуда не делась, просто кол-во таких встреч сократилось для пользователя, но осталось неизменным для посредника (удостоверяющего центра) и второго действующего лица (который получает сертификат у удостоверяющего центра).

            1. Дмитрий Амиров Автор

              Паранойя — это конечно хорошо)

              Ладно, хорошо. Я понимаю что Вы имеете ввиду. Но давайте все же отойдем от модели и теории и вернемся к реалиям. Про встраивание сертификатов в ОС — это всего лишь пример.

              Основное правило работы с сертификатами:

              Открытый ключ центра сертификации распространяется настолько широко, что ещё до установления связи Алиса и Боб будут иметь этот ключ, и злоумышленник ничего не сможет с этим поделать

              Если это правило выполняется — значит можно утверждать что соединение безопасно. А реалии таковы что на данный момент корневые сертификаты распространены так, что, действительно, с этим поделать уже ничего нельзя.

              Да и вообще, Вы несколько преувеличиваете опасность данной атаки.

              Ну и повторюсь, эта статья о том «Как работает ассимитричное шифрование», а не о том о чем мы с Вами спорим. И описать все ньюнасы в ней я не смог. Прошу Вас, не надо ловить меня на том что я возможно не знаю про уязвимые стороны данного шифрования, цель написания статьи — совсем иная.

              1. Михаил

                Я не пытался поймать Вас на незнании чего-либо, а всего-лишь хотел указать на некоторые некорректно сформулированные высказывания в статье, которые могут ввести Ваших читателей в заблуждение.

    2. Геннадий

      Открытый ключ можно и нужно передавать по незащищенным каналам. На то он и открытый (публичный). Только потом Алиса должна сверить с Бобом уникальный электронный отпечаток этого ключа. Если он совпал, значит ключ действительно принадлежит Бобу, а не Еве или кому-то другому. И личная встреча для этого вовсе не обязательна — это можно сделать по телефону или скайпу.

  6. Михаил

    Но суть в том что не существуют таких шифров, которые бы позволили снять шифр из под другого шифра. То есть этап где Алиса снимает свой шифр невозможен. … К сожалению, все имеющиеся алгоритмы до сих пор требуют снятия шифров в той очереди в которой они были примененны. Боюсь назвать это аксиомой (так как история уже знает случаи когда такие аксиомы разбивались в пух и прах), но это так до сих пор.

    Я плохо разбираюсь в криптографии, но почему нельзя применить нижеследующий алгоритм?
    1. Разбиваем шифруемую информацию на блоки. Каждый блок представлен числом. Размер блока (кол-во бит) определяет кол-во возможных значений блока и (соответственно?) стойкость шифрования.
    2. Алиса для шифрования сообщения выбирает секретное число (которое никому не отправляет), которое прибавляет к каждому из чисел в блоках и отправляет зашифрованное таким образом сообщение Бобу.
    3. Боб принимает зашифрованное сообщение, выбирает своё секретное число (которое также никому не отправляет), прибавляет это число к каждому из чисел в блоках зашифрованного Алисой сообщения и отправляет это двукратно зашифрованное сообщение Алисе.
    4. Алиса вычитает своё секретное число из каждого числа в блоках этого двукратно зашифрованного сообщения и отправляет получившееся сообщение Бобу.
    5. Боб вычитает из этого (уже однократно зашифрованного) сообщения своё секретное число и получает исходное расшифрованное сообщение Алисы.

    Пример на PHP:

    $message = array(154, 125, 113);
    $secretKey1 = 54; // Ключ Алисы
    $secretKey2 = 234; // Ключ Боба
    
    print implode('|', $message) . "\r\n";
    
    foreach ($message as $key => $block)
    	$message[$key] = $block + $secretKey1;
    
    print implode('|', $message) . "\r\n";
    
    foreach ($message as $key => $block)
    	$message[$key] = $block + $secretKey2;
    
    print implode('|', $message) . "\r\n";
    
    foreach ($message as $key => $block)
    	$message[$key] = $block - $secretKey1;
    
    print implode('|', $message) . "\r\n";
    
    foreach ($message as $key => $block)
    	$message[$key] = $block - $secretKey2;
    
    print implode('|', $message) . "\r\n";
    

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

    Скрытый перехват и/или подмена сообщения с задержкой во времени:

    1. Алиса кладет свое письмо в железный ящик и, заперев его на замок, отправляет Бобу.
    2. Ева (работник почтовой службы) перехватывает ящик, навешивает на ящик свой замок и отправляет его обратно Алисе.
    3. Алисе ящик приходит уже с двумя замками (напомню с первым замком Алисы от которого у нее есть ключ, и со вторым — Евы).
    4. Алиса снимает свой замок, и отправляет ящик обратно Бобу
    5. Ева опять перехватывает ящик, снимает с ящика свой замок и читает сообщение. Затем опять вешает на ящик свой замок и отправляет ящик Бобу.
    6. Боб при получении ящика, (внимание!) берет свой замок и, дополнительно заперев им ящик, отправляет обратно.
    7. Ева опять перехватывает ящик, снимает с ящика свой замок и отправляет ящик Бобу.
    8. Бобу приходит ящик с уже одним его замком от которого у него есть ключ
    9. Боб отпирает оставшийся его замок своим ключем, и читает сообщение

    Подмена сообщения без задержек во времени:

    1. Алиса кладет свое письмо в железный ящик и, заперев его на замок, отправляет Бобу.
    2. Ева (работник почтовой службы) заменяет этот ящик на свой (с поддельным сообщением), навешивает на него свой замок и отправляет этот поддельный ящик Бобу (ящик от Алисы оставляя у себя).
    3. Боб при получении ящика, (внимание!) берет свой замок и, дополнительно заперев им ящик, отправляет обратно (т.е. Боб запирает уже ящик от Евы, думая, что это ящик от Алисы).
    4. Ева перехватывает ящик от Боба, оставляет его у себя, а Алисе отправляет её ящик, повесив на него свой замок.
    5. Алисе ящик приходит уже с двумя замками (напомню с первым замком Алисы от которого у нее есть ключ, и со вторым — Евы).
    6. Алиса снимает свой замок, и отправляет ящик обратно Бобу
    7. Ева опять опять перехватывает ящик, открывает его своим ключом и читает сообщение. Бобу она отправляет свой (поддельный) ящик (ранее полученный от Боба, с его замком и хранящийся всё это время у Евы), сняв с него свой замок.
    8. Бобу приходит ящик с уже одним его замком от которого у него есть ключ
    9. Боб отпирает оставшийся его замок своим ключем, и читает сообщение (поддельное сообщение)

    1. Дмитрий Амиров Автор

      Я плохо разбираюсь в криптографии, но почему нельзя применить нижеследующий алгоритм?
      1. Разбиваем шифруемую информацию на блоки. Каждый блок представлен числом. Размер блока (кол-во бит) определяет кол-во возможных значений блока и (соответственно?) стойкость шифрования.
      2. Алиса для шифрования сообщения выбирает секретное число (которое никому не отправляет), которое прибавляет к каждому из чисел в блоках и отправляет зашифрованное таким образом сообщение Бобу.
      3. Боб принимает зашифрованное сообщение, выбирает своё секретное число (которое также никому не отправляет), прибавляет это число к каждому из чисел в блоках зашифрованного Алисой сообщения и отправляет это двукратно зашифрованное сообщение Алисе.
      4. Алиса вычитает своё секретное число из каждого числа в блоках этого двукратно зашифрованного сообщения и отправляет получившееся сообщение Бобу.
      5. Боб вычитает из этого (уже однократно зашифрованного) сообщения своё секретное число и получает исходное расшифрованное сообщение Алисы.

      Скажу чесно, я тоже не криптограф, всего лишь немного увлекаюсь. Но вроде как звучит вполне убедительно. Патентуйте) Пойду на бумажке распишу/прикину что к чему.

      А по поводу вариантов перехвата сообщения — вобщем то вы опять описали классическую атаку MiTM

      1. Михаил

        А по поводу вариантов перехвата сообщения — вобщем то вы опять описали классическую атаку MiTM

        Ну да, это снова был камень в огород утверждения о том, что «два человека могут передавать секретное сообщение без обмена ключами» :)

        1. Дмитрий Амиров Автор

          Ладно, сдаюсь)

          Будем считать что я вкладываю в эти слова немного другой смысл =)

      2. alex

        Скажу чесно, я тоже не криптограф, всего лишь немного увлекаюсь. Но вроде как звучит вполне убедительно. Патентуйте) Пойду на бумажке распишу/прикину что к чему.

        Простое сложение-вычитание/xor-xor не запатентуешь. Этот прием не является никаким особым изобретением.

    2. sergey

      Короче. Ева перехватывает зашифрованное сообщение Алисы(message_one). Далее пересылает его Бобу без каких либо модификаций.
      Боб добавляет свой ключ к зашифрованному сообщению Алисы. Ева перехватывает зашифрованное сообщение Боба и сохраняет у себя, после чего пересылает его Алисе без модификаций(message_two).
      Далее Ева просто вычитает одно сообщение из другого (message_two — message_one), тем самым получает ключ Боба, в чистом виде. После чего ей нужно лишь перехватить последнее третье сообщение от Алисы, которое будет лишь зашифровано ключом Боба, который теперь Ева уже знает.

      1. socrat

        Алиса шифрует своё сообщение, после чего передаёт Бобу.
        Боб шифрует своё сообщение, после чего передаёт Алисе.
        Вот в этих двух передачах по середине участвует Ева которая просто сохраняет два сообщения. После чего она вычитает из второго первое, что ей даёт ключ Боба в чистом виде…

        1. Дмитрий Амиров Автор

          Да все верно. Где то это у меня тут уже писали :)
          Да и я где то читал статью зарубежную где доказывалось что стойкое шифрование снимать не в той очереди в которой оно было наложено не выйдет. Либо же это шифрование является нестойким.

            1. Дмитрий Амиров Автор

              Боюсь, что нет. Я прочитал, запомнил, да и ушел дальше… а где и даже когда… к сожалению, не помню

    3. Денис

      Я собрал ваш алгоритм в Java и нашел его уязвимость. Правда, я раскладывал сообщение на массив char и преобразовывал их в ASCII коды, а затем добавлял секретные числа. Ваш метод — не криптография, а её иллюзия. Вы добавили один два лишних шага, которые хакер может спокойно убрать. Взлом:
      1. Взять зашифрованное (двумя ключами или одним, не суть важно) сообщение.
      2. Разложить на биты (или ASCII код, как в моем случае).
      3. Начать перебор чисел.
      4. Можно вручную смотреть результат и отделять бред от осмысленного сообщения, можно запустить после каждого перебора поиск по словарям, а можно натаскать нейросеть (я за вариант со словарями).
      С современными мощностями на это уйдут минуты, в лучшем случае часы. Ваш алгоритм не безопасен и не подходит для секретного обмена данными… А жаль, идея была хороша.

      1. Дмитрий Амиров Автор

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

        В реальном алгоритме Диффи Хелмана, используются ключи минимум в 512 бит, а это число с где-то 150 нулями (см тут я это писал).

        Подбор такого ключа у вас займет времени ну оооочень много. Чуть больше чем существует вселенная. Даже на очень мощных компьютерах.

      2. Игорь

        Для чего нужна эта ахинея с открытыми ключами? Симметричные надёжней.
        Добрый день!
        Хороший сайт, понятно изложен материал, огромное спасибо автору. Попал сюда случайно в сентябре, когда искал информацию по практическому шифрованию.
        Пишу потому, что хочу спросить: Есть желающие узнать как найти числа для симметричного шифрования? Могу научить на пальцах как быстро проверить число Р на простоту (без поиска числа g) — но это вряд ли будет интересно. Самое интересное:
        Найти число Р любой длины и число g к нему. Никакие 2 в степени n плюс один (или минус один) при этом не использую. Естественно, это бесплатно. Есть даже сайт, где я выложил свою работу.

        1. Дмитрий Амиров Автор

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

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

        2. alex

          Для чего нужна эта ахинея с открытыми ключами? Симметричные надёжней.
          Добрый день!

          Нет симметричное шифрование менее надежное так как увеличивает вероятность взлома вдвое. Ну например к Алисе придут зеленые человечки и применят метод терморектального криптоанализа, то всё пропало, всё раскрыто!. В случае с ассиметричным шифрованием с участием пары публичного-приватного ключа (которое, кстати, здесь не описано) зеленые человечки должны будут придти к тому у кого приватный ключ. Соотвественно, рассекретится только часть системы.

    4. Уася Петровичъ

      Понимаю что прошло много времени, но все же отвечу для таких же как я новых читателей.

      Это не сработает, т.к. после действий 2 и 3 мы видим разницу, на которую изменилось число каждого из блоков, следовательно нам становится очевидно секретное число Боба и нам остается только перехватить сообщение после 4-го действия (т.е. уже без шифра Алисы) и воспользоваться уже известным нам числом Боба.

  7. Евгений

    Огромное спасибо за статью!
    После прочтения почти все легло на свои полочки, обрело структуру, которую легко наращивать.
    Имея такую структуру легко генерировать правильные вопросы (полочка для атак MiTM, отдельное спасибо Михаилу :)).

    С точки зрения педагогики Вы сделали все идеально. Думаю Вы правы, что не добавили в эту статью атаки MiTM иначе был бы перегруз информационный.

    Видео прелестное, особенно учитывая его возраст.

    PS: использование метафор для объяснения «сложных» систем честно говоря трудно переоценить. Еще раз спасибо!

    1. Дмитрий Амиров Автор

      И вам огромное спасибо за ваш комментарий =)
      Мне очень приятно слышать что мои статьи кто-то читает и то что кому-то они помогают)

  8. dbzix

    Из этой статьи я не уловил момент перехода от алгоритма Диффи-Хеллмана, где два абонента для получения секретного ключа обмениваются публичными данными и промежуточными результатами вычислений (в примере получилось целых 6 этапов) к тому этапу, где для шифрования используется некий публичный ключ, который затем дешифруется при помощи приватного (я здесь насчитываю всего 2 этапа передачи данных — отправка публичного ключа и отправка зашифрованного этим ключом сообщения).
    Т.е. я понимаю, что где-то между двумя этими объяснениями наверняка кроется много математики, и в итоге объяснение сводится к «это работает именно так, просто поверь». Но было бы наверное проще понять этот внезапный переход, если бы аналогию с красками распространили на объяснение сути шифрования публичным ключом с последующим дешифрованием приватным. А пока получается какое-то «Б работает потому-что А», в то время как между А и Б чёткой связи не прослеживается. По крайней мере для меня.
    Уважаемый автор, не будете ли вы так любезны пояснить мне сей мистический прыжок от А к Б? :) Спасибо!

    1. dbzix

      Сразу же попробую сам себе всё объяснить :)
      Я пытаюсь провести аналогию с красками… Если я понял правильно, то отправка публичного ключа — это и есть отправка уже замешанной смеси цветов, где есть и заранее оговоренные цвета, и секретный цвет, который добавляет автор. В то же время приватный ключ — это просто рецепт, который хранит список использованных цветов.
      Ну и опять же, если я правильно понимаю, отправка сообщения, зашифрованного публичным ключом, это процесс подмешивания совершенно любого цвета в полученную смесь красок таким образом, что цвет этой смеси не меняется. Соответственно, при «разделении цветов» приватным ключом (читай — рецептом) мы можем вычленить этот подмешанный цвет.
      Что-то я сам себя уже запутал… :) Или я всё представляю верно?
      Попытка понять аналогию с цветами возможно покажется вам наивной, но если уж мы её выбрали для разъяснений, то давайте использовать её до конца для объяснения перехода от одной концепции к другой (т.е. от алгоритма Диффи-Хеллмана к публичным и приватным ключам) :)

      1. Дмитрий Амиров Автор

        А пока получается какое-то «Б работает потому-что А», в то время как между А и Б чёткой связи не прослеживается. По крайней мере для меня.

        Да, перечитал статью… вы верно подметили.

        Чесно говоря, вот так сходу не могу представить себе это на аналогии с красками. Я подумаю как это будет выглядеть и постараюсь дополнить статью =)

        Спасибо за замечание =)

        1. dbzix

          Всегда пожалуйста!
          Вам спасибо за статью, всё же материал годный, добавил в закладки ;)

          Ну а если не с красками… Возьмём нашу формулу «Y^x (mod P) » и применим её к публичному и приватному ключам. Как взаимосвязаны ключи и параметры X, Y, P; и в какой момент передаются Y и P (и передаются ли) ? Так уловить суть было бы даже проще… наверное.
          Ещё раз спасибо!

  9. Евгений

    Добрый день,

    Дано: есть формула Y^x (mod P).
    пример в статье основывается на формуле 7^x (mod 11)

    я взял для своего примера 4^x (mod 7)
    и у меня не получилось прийти к общему ключу.
    Вопрос: почему алгоритм в примере работает для 7^x (mod 11) и не работает для 4^x (mod 7)?

    1. Дмитрий Амиров Автор

      Работает же, внимательнее в расчетах. Вот взял вашу формулу:
      001
      PS: сори что вот так коряво) набросал на листике, это скан с него. Лениво набирать формулы сюда, но и так то тоже все понятно.

      1. Евгений

        Пасиб. работает ошибься

        я для проверки стал пользоваться гуглом — прямо в строке поиска можно писать

        4^3 mod 7

  10. Jessi-jane

    Это замечательная статья! Автору большое спасибо. читается на одном дыхании.
    Пишите еще — радуйте людей)

  11. Андрей

    Спасибо, статья отличная!
    Только вот чуть не разобрался в алгоритме, в том, как высчитывать через модуль.
    Не подскажите, как высчитывать число В, если число А меньше модуля?
    Ну например:
    3(mod 13) = ?

    Я знаю, что если, например, нужно высчитать 625(mod 13), нужно 625/13, а потом наибольший возможный целый делитель (48) умножить на модуль (что здесь будет равняться 624), и наконец 625-624 = 1
    Числа 625 и 1 сравнимы по модулю 13, так как 624 делится на 13.
    Вот это я понимаю. А вот как быть если модуль больше числа а?

    1. Дмитрий Амиров Автор

      Гм… подразумевается немного более простая операция — остаток от деления. Так например остаток от деления 625 на 13 равен 1. А остаток от деления 3 на 13 равен 3. Ну или может чтобы понятнее было:

      3(mod 13) = 3
      4(mod 13) = 4

      11(mod 13) = 11
      12(mod 13) = 12
      13(mod 13) = 0
      14(mod 13) = 1

      И т.д.

      1. Евгений

        Автор, спасибо за статью. Только пожалуйста, измени «преобразование по модулю» на «остаток от деления», когнитивный диссонанс получается пока читаешь :(

        1. Дмитрий Амиров Автор

          CTRL + F по этой фразе ничего не дал)

          Но как бы это и так и так правильно.

  12. Yellow Horror

    1. Атака «человек посередине», это серьёзная проблема. Насколько я могу судить, в рамках одной только криптографии она в принципе не решается: если принять, что Ева способна перехватить и незаметно подменить ВСЕ данные, поступающие к Алисе или исходящие от неё по ЛЮБЫМ каналам связи, никакое шифрование не поможет. Как минимум один сертификат должен быть получен Алисой из абсолютно надёжного источника. Но в случае, если злоумышленник может только прослушивать канал связи, а не менять данные в нём, асимметричное шифрование вполне надёжно.
    2. Что касается возможности снимать один «слой шифра» из-под другого, этим свойством обладает банальная функция XOR, широко используемая в криптографии с древнейших времён по сей день. Не думаю, что её можно запатентовать :(

    1. Дмитрий Амиров Автор

      Да вы правы, атака mitm на сегодняшний день не решается никак если быть абсолютным параноиком. Если же им не быть то возня с сертификатами и подписями обеспечивают «необходимую и достаточную» защиту.

      Что касается функиции XOR — ее сложно назвать шифром, т.к. им она по своей сути не является.

      1. Yellow Horror

        Да ладно? Погуглите про «Шифр Вернама». Это система передачи сообщений с абсолютной криптоустойчивостью. И основана она именно на XOR. Если оставить в стороне некоторые организационные сложности (создание истинно случайных ключей с равномерным распределением, сохранение тайны шифроблокнота в недружелюбном окружении и надёжное уничтожение использованных ключей), ничего проще и надёжнее человечество ещё не придумало.

        1. Дмитрий Амиров Автор

          Да ну бросьте, о какой абсолютной криптоустойчивости вы говорите?
          До тех пор пока длина ключа меньше длины шифруемого послания, любой шифр не будет абсолютно криптоустойчивым. Мы же все же говорим о таких шифрах? Единственное что придумал Верном — использовать, грубо говоря, бесконечный ключ, что собственно и дает устойчивость. Ну и к слову сказать ни капельки не абсолютную, если мне не изменяет память, даже он не реализовывал бесконечность в своих ключах, ленты с ключами в его аппарате были зациклены.

          Ну а так да, конечно, если мы будем использовать ключи длинее текста, то любой шифр становится абсолютно устойчивым.

          1. Yellow Horror

            Ну и к слову сказать ни капельки не абсолютную, если мне не изменяет память, даже он не реализовывал бесконечность в своих ключах, ленты с ключами в его аппарате были зациклены.

            По проекту Вернама, каждая лента должна была использоваться однократно и после этого уничтожаться. Идея закольцевать ленты была выдвинута кем-то другим уже в ходе практической эксплуатации прибора, ради экономии.

            Ну а так да, конечно, если мы будем использовать ключи длинее текста, то любой шифр становится абсолютно устойчивым.

            Нет, не любой. Для достижения абсолютной криптоустойчивости методом Вернама (думаю, и любым подобным) нужно три равноважных фактора:
            1. Ключ не короче сообщения.
            2. Ключ состоит из истинно случайного набора символов с равномерным распределением.
            3. Ключ никогда не используется повторно.

            Нарушение любого из них резко снижает криптоустойчивость.

            1. Дмитрий Амиров Автор

              Остальные правила подразумевались само собой. Ну а так да, спорить не буду.

      2. Yellow Horror

        Хотя, по здравом размышлении, я понял, что метод с двойным обратимым шифрованием не работает, если злоумышленник знает алгоритм шифрования. Рассмотрим на примере идеи Михаила:

        1. Разбиваем шифруемую информацию на блоки. Каждый блок представлен числом. Размер блока (кол-во бит) определяет кол-во возможных значений блока и (соответственно?) стойкость шифрования.
        2. Алиса для шифрования сообщения выбирает секретное число (которое никому не отправляет), которое прибавляет к каждому из чисел в блоках и отправляет зашифрованное таким образом сообщение Бобу.

        Пока всё в порядке: Ева не может прочесть сообщение Алисы, т.к. не знает число-ключ. Если блоки достаточно велики, восстановить сообщение Алисы сложно, а если блок длиннее сообщения и ключ не имеет уязвимостей — невозможно. Но Ева может скопировать шифрограмму Алисы и делает это.

        3. Боб принимает зашифрованное сообщение, выбирает своё секретное число (которое также никому не отправляет), прибавляет это число к каждому из чисел в блоках зашифрованного Алисой сообщения и отправляет это двукратно зашифрованное сообщение Алисе.

        А вот тут уже начинаются проблемы: Ева всё ещё не может прочесть сообщение Алисы, но, располагая копией полученной Бобом шифрограммы и отправленной им двойной шифровкой, без проблем восстанавливает ключ Боба.

        4. Алиса вычитает своё секретное число из каждого числа в блоках этого двукратно зашифрованного сообщения и отправляет получившееся сообщение Бобу.

        Алиса сняла свой «слой» шифра и теперь пересылает Бобу своё письмо, зашифрованное только ключом Боба. Который у Евы уже есть! Ева расшифровывает письмо и читает его, а также на всякий случай может восстановить ключ Алисы, пользуясь расшифрованным текстом письма и первой перехваченной ею шифрограммой.

        1. Дмитрий Амиров Автор

          Да, действительно. Все верно. Подобная цепь рассуждений мне пришла в голову немногим позже, а еще чуть позже я ее и забыл, не успев написать здесь))
          Но вы правы, некоторые из шифров допускают восстановление ключа из исходного текста и зашифрованного текста. Поэтому пересылать эти данные нельзя.

  13. Dmitriy

    Здравствуйте. Хорошая статья, но я тоже не понял некоторые моменты, которые описали выше.
    Именно переход от алгоритма получения секретного ключа обоими собеседниками (Алиса и Боб) (без их выкладывания в публичный доступ) к асимметричному шифрованию.
    У вас написано, что сообщение кодируется на стороне Алисы публичным ключем, полученным от Боба. Но если мы зашифруем публичным ключём, то Ева сможет легко его получить и сама расшифровать, верно?
    Ещё для меня осталось непонятным, как можно зашифровать публичным ключём и расшифровать только секретным на стороне Боба. То есть зашифровали словом «Дом» , а расшифровали словом «Мир» . Для меня это какая-то несуразица.
    Исходя из этих очевидных пробелов (или у вас, или у меня) , я сделал вывод , что тут схема должна быть посложнее, чем на картинке. Скорее всего под стрелочкой от публичного ключа Боба к Алисе имеется в виду другое, а именно вся последовательность действий по получению «Y» и «P», получению промежуточных результатов и тд. Иными словами , я думаю, что при шифровке исходного сообщения якобы публичным ключем, на самом деле шифруется не публичным, а уже секретным , который вычисляется на каждой стороне по отдельности.

    Ещё у меня возник вопрос о расшифровки дважды зашифрованного сообщения. Если взять ,допустим, шифр Цезаря, где каждая буква шифруется другой буквой, стоящей , скажем, на 3 позиции дальше. Если Алиса зашифрует букву А в сообщении буквой Б, а потом Боб зашифрует эту букву Б буквой Г, то получить букву А из Г будет просто, причём в любом порядке. Правда это скорее всего будет работать только в тех случаях, если оба знают тип шифрации собеседника и при достаточно простых типах шифрации (моноалфавитные/полиалфавитные). Я тоже новичок в криптографии, так что это моё имхо ;)

    1. Dmitriy

      Забыл ещё спросить.
      В чём разница между симметричным и асимметричным способами?
      Если я воспользовался алгоритмом Диффи и Хеллмана для передачи секретного ключа, а потом смог безопасно передать зашифрованное сообщение, то будет ли этот способ симметричным?

      1. Dmitriy

        Я почитал, более менее как-то всё сгрупировал в уме.
        Отвечу на вопросы мною написаные, возможно, помогая тем самым другим читателям.
        1. По поводу

        У вас написано, что сообщение кодируется на стороне Алисы публичным ключем, полученным от Боба. Но если мы зашифруем публичным ключём, то Ева сможет легко его получить и сама расшифровать, верно?
        Ещё для меня осталось непонятным, как можно зашифровать публичным ключём и расшифровать только секретным на стороне Боба. То есть зашифровали словом «Дом» , а расшифровали словом «Мир» . Для меня это какая-то несуразица.

        В этой статье упомянут алгоритм RSA. Алгоритм симметричного шифрования. В нём действительно используется следующий алгоритм:
        1) Опираясь на некую одностороннюю функцию шифрования ( функция, которую легко посчитать в одну сторону, но очень трудно в другую. А) мы создаём на получателе пару {открытый ключ;закрытый ключ}. Эта пара уникальна, то есть каждому открытому ключу соответствует уникальный закрытый ключ под эту одностороннюю функцию.
        2)Открытый ключ передаётся отправителю.
        3)Отправитель шифрует сообщение
        4)Передаёт получателю
        5)Получатель дешифрует с помощью закрытого ключа. Это сообщение нельзя дешифровать с помощью открытого ключа.

        Как видите, отправитель не знает закрытого ключа и он не в состоянии сам расшифровать своё же зашифрованное сообщение. Потому он и называется асимметричным, что у одного есть все ключи, а у другого только лишь часть, необходимая для шифрации.

        В чём разница между симметричным и асимметричным способами?
        Если я воспользовался алгоритмом Диффи и Хеллмана для передачи секретного ключа, а потом смог безопасно передать зашифрованное сообщение, то будет ли этот способ симметричным?

        Алгоритм Дэффи-Хелмана, который служит для обмена ключами и дальнейшим симметричным шифрованием. То есть его суть в том, что сначала оба получают полный ключ для шифрации и дешифрации и потом уже начинают самое обычное симметричное шифрование.

        Асимметричный способ — у одного узла есть вся информация для шифр./дешифр., а у другого, как правило, только для шифрации

        Симметричный — оба узла знают всю информацию для шифр./дешифр.

        Надеюсь, что кому-то помог ;3

        1. Dmitriy

          В этой статье упомянут алгоритм RSA. Алгоритм Асимметричного шифрования Опечатался.

        2. Дмитрий Амиров Автор

          Гм… только сейчас заметил ваши комментарии. Приношу свои извинения.

          Все вроде верно. Есть одно но по вашему последнему абзацу, а конкретно термины:

          • Алгоритм Дэффи-Хелмана — является алгоритмом позволяющим получить один общий секретный ключ и не более того
          • Ассиметричное/симметричное шифрование — в целом у Вас все верно
          • RSA — алгоритм являющий собой совокупность этих вещей. На пальцах: с помощью ассимтричного шифрования по протоколу Деффи-Хелмена устанавливается секретный ключ с помощью которого уже методом симметричного шифрования шифруются сообщения между собеседниками.
        3. Дмитрий

          Я все равно не понял утверждение:
          2)Открытый ключ передаётся отправителю.
          3) Отправитель шифрует сообщение
          4)Передаёт получателю
          5)Получатель дешифрует с помощью закрытого ключа. Это сообщение нельзя дешифровать с помощью открытого ключа.

          Получается то, что Вы и мели ввиду с самого начала. Шифруем словом Дом, а дешифруем словом Мир. Означет ли это, что присутствует еще один алгоритм связующий Мир и Дом между собой ?

          1. Дмитрий Амиров Автор

            Не понял вопрос. В общих чертах это выглядит так:
            Шифруем слово «Дом» словом «Мир», а дешифруем словом «Шар». Как то так.

  14. Роман

    Спасибо. Решил наконец разобраться, как это работает и понял из этой статьи. Только, я считаю, если сообщники знают друг друга и есть возможность обменяться безопасно открытыми ключами, то так и стоит сделать. Чтобы исключить пагубное воздействие возможного появления человека посередине при обмене ключами, который будет прикидываться А как Б и Б как А подменяя ключи на свои и просматривая в итоге всю информацию.

    А в видео, думаю, зря они используют вот это вот 3^(24*54), т.к. вообще не очевидно откуда оно взялось, или пояснили бы, что это условно.

    1. Дмитрий Амиров Автор

      Только, я считаю, если сообщники знают друг друга и есть возможность обменяться безопасно открытыми ключами, то так и стоит сделать. Чтобы исключить пагубное воздействие возможного появления человека посередине при обмене ключами, который будет прикидываться А как Б и Б как А подменяя ключи на свои и просматривая в итоге всю информацию.

      Ну если они имеют возможность безопасно обмениваться открытыми ключами, то ассиметричное шифрование в общем то здесь и не нужно. Достаточно установить один общий ключ шифрования, и им шифровать свои сообщения обычным симметричным шифром.
      Ассиметричное шифрование, а конкретно приведенный в статье алгоритм, нужен для возможности передачи секретных сообщений по открытому каналу.

  15. grigory

    Ну раздражает ведь всех эта неграмотность правописания — «одностороняя» , «примененны», «длинна», как будто уж в 5-м классе. А так, неплохо для понимания основ.

    1. Дмитрий Амиров Автор

      Стыдно мне.

      Когда пишу интересные тексты, начинаю абстрагироваться от самого процесса написания, и делаю много ошибок. А перечитывать что написал потом лень (

  16. grigory

    Бывает, что вопрос стоит просто. Вирусы-шифровальщики используют закрытый ключ. Есть оригинальный файл, есть файл зашифрованный. Задача: найти алгоритм, сказать так, который ищет алгоритм преобразования первого файла во второй…

  17. Allexys

    Благодарю за понятную и нескучную статью! Наконец-то я врубился в основы :).

  18. Ярослав

    К сожалению, все имеющиеся алгоритмы до сих пор требуют снятия шифров в той очереди в которой они были применены.

    Это не совсем так. приведу пример:
    — предположим что каждой букве соответствует цифровой код А = 1, Б = 2, В = 3 и т.д.;
    — предположим что Алиса отправляет Бобу письмо, состоящее из единственной буквы А (для упрощения примера);

    Алиса: накладывает свой шифр А + 2 = В
    Алиса: отправляет письмо Бобу
    Боб: накладывает свой шифр В + 3 = Е
    Боб: отправляет письмо Алисе
    Алиса: снимает свой шифр Е — 2 = Г
    Алиса: отправляет письмо Бобу
    Боб: снимает свой шифр Г — 3 = А

    Здесь число 2 — секретный ключ Алисы, 3 — секретный ключ Боба. Причем он может быть и не односимвольным. В принципе его длина ничем не ограничена.

    1. Vital

      Ева перехватывает шифрованное сообщение, делает частотный анализ и по нему без труда получает расшифрованное сообщение, при этом не зная секретов Боба и Алисы

  19. Дмитрий

    Я долго обходил стороной теоретические основы ассиметричного шифрования. Знал поверхностно — есть открытый ключ, которым шифруются данные, и есть закрытый, которым эти данные дешифруются. Но меня всегда напрягала мысль о реализации подобного шифрования.
    Ваша статья во многом помогла, за это огромное вам спасибо!
    Только к ее концу я опять увидел эту несуразицу — «шифруется открытым ключом». Ведь, строго говоря, шифруется сообщение не открытым ключом, а ключом, полученным на основе закрытого ключа отправителя и открытого ключа получателя (который, в свою очередь, был сгенерирован на основе закрытого ключа получателя). Ведь в таблице про Алису и Боба — они и только они смогли получить один и тот же ключ «9» — он и используется для шифрации и дешифрации сообщения. А вот получить этот ключ можно только на основе пары ключей — секретного (Алисы/Боба) и публичного(Боба/Алисы).
    Образно — да, сообщение шифруется всегда секретным ключом отправителя (он, грубо говоря, постоянен) и публичным ключом получателя (он зависит от конкретного получателя), поэтому в описании шифрация «секретным» ключом опускается — и это опущение ломает всю стройность рассуждений.

  20. кларксон

    прочел статью и не очень всеравно понял, хоть и лучше чем на вики. Но одно мне не понимается только. если ктот может ответить правильно — помогите.

    если я всем посылаю вопрос «сколько будет 2+2?», рассказываю как зашифровать ответ мне (рассказываю всем публичный ключ), и все мне направят ответ на вопрос, как я узнаю того, от кого именно я жду ответа, тобиш того с кем я хотел установить связь на самом деле?

    1. Дмитрий Амиров Автор

      Тут вы немного неправильно ставите вопрос.

      Если вам надо с кем то установить связь, то нужно идти от обратного. Вы подключаетесь к собеседнику, и уже он вам предоставляет свой публичный ключ, а не вы ему.

      UPD: написал статью про цифровую подпись, я думаю это будет правильный ответ на ваш вопрос.

      1. кларксон

        с моей тупостью придется повоевать. тема расжевана в коментариях и в вашей статье, кажется все обьяснили.

        все же. зачем мне его публик ключ ? скажите если я не правильно понимаю.
        я инициатор (мне нужны ответы, в примере я — принимающая сторона), значит генерирую пару. это ему, отвечающему (отправитель в вашем примере) нужен мой публик

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

        1. Дмитрий Амиров Автор

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

          Может быть эта картинка вам поможет понять принцип:

          1. кларксон

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

            1. Дмитрий Амиров Автор

              Хм… да может быть я вас не совсем верно понял изначально)

  21. Beshot

    Несколько раз перечитал эту статью и другие по теме, непонятен алгоритм использования ЭЦП в эл. документах. Если так как здесь: https://ru.wikipedia.org/wiki/Электронная_подпись, то возникают расхождения. Так все таки шифруем с помощью закрытого ключа или открытого?

    1. Дмитрий Амиров Автор

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

      Если подпись «расшифровалась», то значит публичный ключ соответствует закрытому, а т.к. закрытый ключ априори имеется только у отправителя, то значит подписал документ именно отправитель.

      1. Beshot

        Дмитрий, мне очень помогла ваша статья, у вас хороший стиль. Но есть непонятный момент, вы утверждаете, что асимметричный алгоритм предполагает под собой наличие двух ключей – публичного и приватного. То есть сообщение шифруется публичным ключем, а расшифровывается приватным и ни как иначе.

        Может быть дело в исходных задачи, например получателю нужно аутентифицировать посланника.
        Тогда не представляю как эта схема может помочь?

        1. Дмитрий Амиров Автор

          То есть сообщение шифруется публичным ключем, а расшифровывается приватным и ни как иначе.

          Не совсем верно. Сообщение шифруется одним ключом, а расшифровывается другим. Т.е. вполне можно зашифровать приватным, а расшифровать публичным.

          Давайте рассмотрим на примере. Вы хотите мне прислать сообщение, я хочу убедится что прислали его мне именно вы. Поэтапно:
          1) Вы шифруете сообщение закрытым ключом
          2) Присылаете его мне
          3) Я обращаюсь к вам, и получаю от вас Ваш публичный ключ
          4) Полученное сообщение расшифровываю Вашим публичным ключом
          5) Если сообщение расшифровалось — значит послали его именно вы

          Никто другой не сможет послать это сообщение, представившись вами, потому что приватный ключ есть только у вас.

            1. Дмитрий Амиров Автор

              Ну с этим тоже ничего сложного

              1) Вы шифруете сообщение закрытым ключом
              2) Обращаетесь ко мне за моим публичным ключом
              3) Шифруете еще раз но уже моим публичным ключом
              4) Присылаете его мне
              5) Я обращаюсь к вам, и получаю от вас Ваш публичный ключ
              6) Полученное сообщение расшифровываю своим закрытым ключом
              7) И еще раз расшифровываю уже Вашим публичным ключом
              8) Если сообщение расшифровалось – значит послали его именно вы

              Это конечно утрировано. В качестве подписи шифровать документ целиком смысла особого нет, можно зашифровать хеш от него, который уже приложить к пересылаемому документу, что в общем то и будет являться подписью. На стороне получателя расшифровываем подпись вашим публичным ключом, и сравнить хеш документа с полученным хешем. Но это уже детали реализации.

              Наверное лучше бы это нарисовать, но признаюсь честно, мне немного лениво)

  22. Аня

    Добрый день! Статья понравилась, но остались вопросы (даже нашлась пара похожих в комментариях, но без ответов).
    Если во второй части статьи всеже перейти к аналогии с Алисой и Бобом, в частности к числам А, В, а, в, Р и к полученному в примере числу 9, что из них будет закрытым ключом, а что открытым? Заранее спасибо за ответ!

      1. Дмитрий Амиров Автор

        Отправился, я комментарии проверяю сначала перед публикацией. А то спамить любят тут у меня :) Секунду сейчас на предыдущий ваш вопрос отвечу

    1. Дмитрий Амиров Автор

      Правильнее будет сказать что в процессе обмена данными Алиса и Боб получают общий ключ 9, который в дальнейшем могут использовать для шифрования своих сообщений. По сути в статье я описывал не само ассиметричное шифрование как таковое, а протокол обмена ключами, который дал толчок к развитию ассиметричного шифрования.
      Алгоритм генерации пары приватный/публичный ключ на самом деле немного сложнее, хотя и похож на выше изложенный алгоритм, но все таки наверное стоит отдельной статьи. В комментарии я не распишу тут сходу, ибо могу много чего напутать.

      1. Аня

        Поняла, еще раз спасибо за статью, она разъяснила достаточно много непонятных моментов!;)

  23. Григорий

    Как ни странно, но ева быстро решит задачу где
    5 в стенени x (mod 7) ===2, и при огромных числах. Почему? Потому что возведение в степень это быстро. И вычисление по модулю тоже. А значит и перебор всех значений не займет много времени. Считаю это слабым местом.

    1. Дмитрий Амиров Автор

      Вы не совсем верно поняли принцип. Задача в другом, грубо говоря, Еве предстоит определить какое число следует возвести в степень X чтобы получить остаток по модулю два. Или же в какую степень нужно возвести число X. Это решается по сути только перебором, да и найденных решений будет очень много, которые тоже надо будет перебирать. В принципе пока это все звучит довольно просто. Но вот в серьезных алгоритмах используются числа с порядком в несколько сотен, а вот это уже не совсем просто :)

      1. Григорий

        Когда то давно, думали что md5 сложно прокрутить перебором, чтобы узнать исходный текст. Но теперь даже исходные длинные строки раскрываются быстро. Есть сайты, где Вы пишите хэш, а вам через некоторое время Вашу исходную строку. Секрет прост -заранее на суперкомпьютерах сп_цсл_жбы готовят таблицы соответствий. То есть, например, исходная строка до 20 символов распознаются мгновенно если имеется только её md5 хэш. Суперкомпьютеры круглосуточно эти таблицы составляют. Даже в эту минуту, когда Вы читаете этот текст. Та же участь ждёт и все сокрытия в степени по модулю. И в том числе и поиск множителей простого числа. Заранее. Выход — собственно доразработанная система шифрования + очень уж длинные ключи. Но тогда при формировании рукопожатия будет много времени уходить.

        1. Дмитрий Амиров Автор

          Это называется борьба щита и меча.

          Сейчас вместо md5 рекомендуют использовать sha. Когда устареет sha, придумают что то новое. Так же и с шифрованием.

          1. Странник

            Где-то через двадцать лет всё равно придётся отказаться от ассиметричной классической криптографии, потому что к тому времени построят мощный квантовый компьютер, и разложение на множители, поиск дискретного логарифма и т.п. станут тривиальным делом

      2. Дима

        За статью огромное спасибо. Я вот тоже не пойму. Формула общеизвестная. Y^X mod P, где Y и P известны. Осталось вычислить P. Достаточно перехватить результаты (что довольно легко для спецслужб), как в примере Y^X mod p = 2 и Y^X mod p = 4, где 2 и 4 по сути публичные ключи. И вычислить 7^X mod 11 = 2 и 7^X mod 11 = 4 перебором это easy. Тут скорее уже другой вариант надо использовать, который на эллиптических кривых.

  24. Странник

    Кстати, помечу вы посоветовали мутную книгу какого-то Сигха вместо классической книги Шнайера «Прикладная криптография»? Шнайеровская книга — это просто классика криптографии, написанная в 90-е годы, она всё равно является очень хорошим учебником. После неё можно почитать «Практическую криптографию» того же автора — она более новая и лаконичная

    1. Дмитрий Амиров Автор

      Оу… «мутную книгку» и «какого-то Сингха», это вы зря) Очень хорошая книга, хорошо читается, и очень хорошо разжевывается материал. Рекомендую.

      1. Странник

        Вот я зря говорить не буду — я пробовал. Прочитал несколько страниц и бросил, ничего не поняв. Вот Шнайер — другое дело — просто и с юмором

        1. Дмитрий Амиров Автор

          Видимо все таки на вкус и цвет как говорится. Надо будет вашего Шнайера глянуть.

        2. Дмитрий Амиров Автор

          Все таки заставил я себя начать читать Шнайера. Я бы сказал, что его стоит читать после Сингха. У Сингха по сути разжевываются основы, история зарождения и развития криптографии, и простейшие алгоритмы. Шнайер намного более «профессионален», если можно так сказать. Знания он дает более углубленные, и вопрос нужно ли оно новичку или нет.

  25. Тимур

    Спасибо вам большое за статью. Именно так должны объясняться любые вопросы: простыми словами о сложном. К сожалению, не многие обладают талантом объяснять сложные вещи на простых, более понятных простому человеку, аналогиях. Теперь я знаю, что такое ассиметричное шифрование.

    Best regards from Berlin.

      1. Тимур

        У меня вот возник вопрос: «А как применить такое на практике?». Давайте в качестве примера возьмем SSH-соединение с публичным ключом. Насколько я понял, публичный ключ — шифрует, закрытый ключ — расшифровывает. Окей, тут все понятно. Теперь, я собираюсь создать защищенное соединение с Алисой. Для этого я посылаю ей сгенерированный мною публичный ключ, а секретный держу при себе. Она с помощью моего публичного ключа шлет мне зашифрованное сообщение, я его на своей стороно расшифровываю. Хорошо. Но ведь это одностороннее шифрование. Как же мне отвечать Алисе зашифрованными сообщениями? Неужели Алисе тоже придется создать свой публичный ключ и отправлять его мне, чтобы я мог шифровать свои сообщения?

        Заранее спасибо :)

        1. Дмитрий Амиров Автор

          Тимур, вариантов на самом деле масса. По канону асимметричной криптографии, конечно, у обоих сторон должна быть пара приватный/публичный ключ.

          Но на самом деле, в принципе, это необязательно. Например как вам такой алгоритм:
          1) Вы шлете Алисе публичный ключ.
          2) Алиса генерирует какой либо сеансовый ключ, сохраняет его у себя
          2.1) Алиса шифрует этот же сгенерированный сеансовый ключ вашим публичным ключом, отправляет вам
          3) Вы расшифровываете его приватным ключом

          В итоге две стороны имеют у себя сеансовый ключ. Этот ключ используется в виде обычного ключа для обычного симметричного шифрования. Все последующие сообщения между вами и Алисой вы шифруете и расшифровываете именно им. В итоге получается что только одна сторона должна генерировать ключи. А также симметричное шифрование которое будет использоваться для фактического обмена сообщениями намного менее ресурсоемко. В общем одни плюсы)

          Вообще тот же SSL и работает приблизительно по такому принципу.

  26. Евгений

    Уважаемый Дмитрий!
    Великолепный ход Ваших мыслей просто завораживает, однако исходя и алгоритма приведенного Вами в примере, хотелось бы уточнить, но подобрать степень под результат простым перебором вариантов это же возможно, хотя бы теоретически, либо я что то не полностью понял в абсолютной стойкости такого принципа, Спасибо за ранее за Ваш ответ
    С уважением Евгений.

    1. Дмитрий Амиров Автор

      Евгений, вчера набирал вам здоровенную простыню текста с ответом. А сейчас обнаружил, что я видимо забыл его сохранить. Обидно… Попробую еще раз.

      Да, простым перебором подобрать можно. Но задача в том чтобы подобрать две неизвестные x и y в уравнении вида 4x (mod 11) = 2y (mod 11) (взял из текста статьи). Для такого уравнения это выглядит бесспорно просто, но в реальности используются числа сотен порядков, и боюсь простой перебор реальных чисел займет лишь немногим меньше вечности.

      В криптографии алгоритм называется стойким если он взламывается только полным перебором ключей. Естественно с маленькой оговоркой на то что такой перебор будет занимать огромное количество времени.

      Так что, в принципе, этот шифр можно назвать стойким.

      1. Евгений

        Дмитрий! Большое Вам СПАСИБО за Ваш ответ, великолепно!, однако, как я заметил, в итоге обмена между контрагентами, они вычисляют закрытый ключ он одинаков в результате у Алисы и Боба это в Вашем примере 9, и это абсолютно верно, но в таком случае это одинаковый код т.е. ключ для шифровки текста и дешифровки оба участника имеют идентичный ключ, прошу поправить, если ч не прав …
        С Уважением, Евгений

        1. Дмитрий Амиров Автор

          Евгений, все верно. В тексте статьи я, откровенно говоря, немного слукавил)

          В статье описан протокол согласования ключа Диффи-Хелмана. Этот протокол дал начало асимметричной криптографии, и таким протоколам как RSA и т.д, т.е. тем протоколам где используются открытые и приватные ключи в общем их понимании. Но основы и математика у всех асимметричных алгоритмов схожи. А протокол Диффи-Хелмана наиболее прост для понимания.

          1. Евгений

            Уважаемый Дмитрий!
            Ваш ответ исчерпывающий, ход Ваших мыслей и логика великолепны.
            С уважением, Евгений.

  27. Сергей

    Алгоритм Диффи-Хеллмана.
    Зачем Еве вообще знать секретные числа?
    Ева берёт открытый ключ 7^x mod 11.
    Перехватывает a и b.
    Получает A и B.
    Например, мы перехватываем a=10, b=6. 7^A mod 11=10 => 7^5 mod 11=10
    Получаем A=5;15… , B=7;17…
    Не зависимо от того, какие секретные числа выбрали Алиса и Боб, мы получим одинаковый ключ.
    6^5 mod 11 = 10; 10^7 mod 11=10;
    6^15 mod 11 = 10; 10^17 mod 11 =10;
    И о какой шифрации идёт речь?

    1. Дмитрий Амиров Автор

      Сергей, вы ловко подменяете понятия вот в этом месте:

      Например, мы перехватываем a=10, b=6. 7^A mod 11=10 => 7^5 mod 11=10
      Получаем A=5;15… , B=7;17…

      Числа A и B вы можете получить только полным перебором. И для таких маленьких чисел это бесспорно просто. В реальных алгоритмах используются числа сотен порядков. Боюсь что их подобрать у вас попросту не выйдет.

      1. Сергей

        Приведите пример, пожалуйста, реально используемых чисел.
        Если брать например 7^400 mod 11, то вычисление на листке бумаги займёт секунд 30.

        1. Дмитрий Амиров Автор

          Вы наверное не правильно поняли мою фразу про насколько сотен порядков. В реальном алгоритме Диффи Хелмана, используются ключи минимум в 512 бит, а это число с где-то 150 нулями (и то это уже совсем не секурно, стараются брать 1024 или 2048бит).

          Для понимания масштабов, пара 1024битных ключей, в 16ном виде:

          p= de9b707d 4c5a4633 c0290c95 ff30a605 aeb7ae86 4ff48370 f13cf01c 49adb9f2 3d19a439 f743ee77 03cf342d 87f43110 5c843c78 ca4df639 931f3458 fae8a94d 1687e99a 76ed99d0 ba87189f 42fd31ad 8262c54a 8cf5914a e6c28c54 0d714a5f 6087a172 fb74f481 4c6f968d 72386ef3 45a05180 c3b3c7dd d5ef6fe7 6b0531c3

          z= 56c03667 f3b50335 ad532d0a dcaa2897 a02c0878 099d8e3a ab9d80b2 b5c83e2f 14c78cee 664bce7d 209e0fd8 b73f7f68 22fcdf6f fade5af2 ddbb38ff 3d2270ce bbed172d 7c399f47 ee9f1067 f1b85ccb ec8f43b7 21b4f980 2f3ea51a 8acd1f6f b526ecf4 a45ad62b 0ac17551 727b6a7c 7aadb936 2394b410 611a21a7 711dcde2

          1. Евгений

            Дмитрий! Поясните пожалуйста, в Вашем примере значение p это один символ имеющий многоразрядное значение т.е. значение p = коду состоящему из множества цифр?

            1. Дмитрий Амиров Автор

              Не понял ваш вопрос. Это просто число представленное в 16-ричной системе счисления. Первое которое я нагуглил)

              1. Евгений

                Дмитрий! Я хотел спросить, в Вашем примере, если число обратно из 16 — ричной системы, перевести в десятичную, то получится очень большое значение, то есть очень большое число?

                1. Дмитрий Амиров Автор

                  Да, очень большое значение, порядка 1.5632008148827224e+308, если вам такая запись будет удобнее) Проще говоря число с 300 нулями.

                  1. Евгений

                    Да именно так я и понял Ваш пример, в таком случае перебор таких чисел с учетом того, что шифруется каждая буква текста, то может занять вечность -:)

          2. Евгений

            Уважаемый Дмитрий! Я проанализировал аргументы, приведенные в примере Вашим собеседником Сергеем.
            С приведенными Сергеем выводами я не согласен, поскольку он не предоставил факты: — каким образом он получи секретные числа Алисы и Боба, а лишь просто подставил их в функцию.
            В результате я пришел к выводу, что Сергей заблуждается, либо как Вы верно указали происходит подмена понятий, таким образом получить ключ действительно возможно, но лишь только перебором всех искомых вариантов, либо это просто угадывание, а проще говоря, подгонка неизвестных под требуемый ответ.
            Однако я обратил внимание на интересную деталь, которая содержится в примере Сергея, а именно, что кроме секретных чисел Алисы и Боба, это числа 5 и 7 в примере Сергея, результат 10 дают также числа: 15; 17 и т.д. 25;27, 35;37 …
            Я думаю, что это значит, что такая функция циклична.
            Исходя из такой вот дискуссии, порошу Вас изложить Вашу позицию.
            С уважением, Евгений.

            1. Дмитрий Амиров Автор

              Евгений, вы задали очень хороший вопрос. Боюсь, что сходу я не смогу на него ответить. Для ответа нужно иметь математические знания и полное представление алгоритма, а у меня это все уже давным давно выветрилось из головы…(

              1. Евгений

                Уважаемый Дмитрий!
                Я Вам искренне признателен за Ваш ответ, в любом случае, приоритет всегда за Вами, вне зависимости от чего либо, как бы то ни было, мне очевидна ясность и логика ваших мыслей, и это главное, я не просто так Вам задал вопросы, прошу меня простить, если что, просто я привык доводить дело до логической развязки, я проанализировал Вашу функцию, приведенную в примере, а также сопоставил информацию из ролика который у Вас тут на ресурсе данной статьи, в нем есть пример часового алгоритма, я изложу Вам свою позицию, но я тоже беру тайм-аут для обработки данных.
                С уважением Евгений.

              2. Евгений

                Уважаемый Дмитрий!

                В Вашем примере Боб получает a от Алисы, и вычисляет значение aB (mod 11) = 26 (mod 11) = 64 (mod 11) = 9
                при этом, 6 является секретным числом Боба (B)

                Как следует из поясняющего видео к данной теме, цифра 2 является генератором, возводя его в любую степень по модулю 11 мы получим в итоге набор чисел от 1 – 10
                в непоследовательном порядке, далее, как и в примере из ролика разложим значения по часовому циферблату в данном случае на нем будет 10 чисел, и в зависимости от степени возведения стрелка часов будет указывать нам результат от 1 до 10 и так в замкнутом порядке, т.е. результат вычисления по модулю 11 будет повторяться через каждые 10 единиц, к примеру цифры 2;12;22;32… дадут результат 4, цифры 6;16;26;36 … дадут результат 9

                Ниже приведены функции:

                2^1 mod 11 2
                2^2 mod 11 4
                2^3 mod 11 8
                2^4 mod 11 5
                2^5 mod 11 10
                2^6 mod 11 9
                2^7 mod 11 7
                2^8 mod 11 3
                2^9 mod 11 6
                2^10 mod 11 1
                2^11 mod 11 2
                2^12 mod 11 4
                2^13 mod 11 8
                2^14 mod 11 5
                2^15 mod 11 10
                2^16 mod 11 9

                А если разобрать сам пример из видеоролика там функция
                3^x mod 17, в данном примере повторение результата будет происходить через 16 единиц,
                например, функция вернет нам число 15 по модулю 17 при возведении 3 в степень 38;54;70;86;102
                Ниже приведены функции:

                3^38 mod 17 … 15
                и далее
                3^54 mod 17 15
                3^55 mod 17 11
                3^56 mod 17 16
                3^57 mod 17 14
                3^58 mod 17 8
                3^59 mod 17 7
                3^60 mod 17 4
                3^61 mod 17 12
                3^62 mod 17 2
                3^63 mod 17 6
                3^64 mod 17 1
                3^65 mod 17 3
                3^66 mod 17 9
                3^67 mod 17 10
                3^68 mod 17 13
                3^69 mod 17 5
                3^70 mod 17 15
                3^71 mod 17 11
                3^72 mod 17 … 16
                и далее
                3^86 mod 17 … 15
                и далее
                3^102 mod 17 … 15

                Думаю вышеизложенная информация может доказывать, что такая функция циклична, на величину своего модуля, точнее на одну единицу меньше, т.е. по mod 11 решения будут от 1 до 10, по mod 17 от 1 до 16.

                С уважением, Евгений.

              3. Евгений

                Уважаемый Дмитрий!
                Ваше мнение, мне очень важно, и интересно, прошу Вас изложите, пожалуйста, СПАСИБО!
                С уважением, Евгений.

                1. Дмитрий Амиров Автор

                  Евгений, я знаю что вам интересно мое мнение) Извините что никак не отвечу вам до сих пор. Мне нужно собраться с мыслями и разобраться с вашим примером и алгоритмом в целом, не могу никак выделить на это свое время. Обещаю что постараюсь это сделать в ближайшем будущем.

                  1. Андрей

                    Дмитрий вы упустили очень важный момент. Для того, чтобы задача была трудно разрешимой, число P должно быть ОЧЕНЬ БОЛЬШИМ ПРОСТЫМ ЧИСЛОМ, и 11 на эту роль подходит плохо.

                    В практических реализациях используются P порядка 10 в 300 степени.

                    1. Евгений

                      Добрый день Андрей!
                      В Вашем замечании Вы указываете на то, что число P должно быть очень большим простым числом, число 11 из примера Дмитрия простое число по определению, простое поскольку, число 11 целое положительное и делится без остатка только на 1 и на само себя, ну и конечно же оно маленькое, в силу тех обстоятельств, что это всего лишь пример, для внесения ясности в логическое изложение принципа заложенного в алгоритме.

  28. Constantin

    Привет Дмитрии,

    Привет очень познавательная статья.
    Завут Костя . Сам я из Молдавии, работаю в Барселоне девелопер.

    Удачи в дальнеишом!

  29. Вадим

    Хорошая работа. Прояснил наконец для себя этот вопрос. Добавил в избранное.

  30. Максим

    В конце надо было еще дать ссылку на документацию протокола TLC (тут на русском https://tls.dxdt.ru/tls.html), т.к. мало знать алгоритма, много чего еще происходит за кулисами в реальности. (:

  31. Сергей

    Автор, большое спасибо за статью! Тот, кто способен простым языком объяснить сложные вещи — и есть настоящий профессионал!

  32. Алексей

    Прекрасная статья, отлично и понятно описанны логика ассиметричного шифрования , долго промучился с поиском такой внятной статьи.Пишите чаще,будем поддерживать ваши труды.
    Искренняя признательность и благодарность автору.
    С уважением Алексей.

    1. Дмитрий Амиров Автор

      Благодарю. Ваши комментарии — лучшая поддержка для меня! :)

  33. Иван

    Дмитрий, здравствуйте!

    присоединяюсь к похвалам по поводу стиля вашего изложения материала — он соответствует по ясности англоязычным учебникам по трудным дисциплинам :)

    Меня очень зацепили слова из вашего текста:

    К сожалению, все имеющиеся алгоритмы до сих пор требуют снятия шифров в той очереди в которой они были применены. Боюсь назвать это аксиомой (так как история уже знает случаи когда такие аксиомы разбивались в пух и прах), но это так до сих пор.

    Я не побоюсь сказать: за последние два дня я такой алгоритм придумал. Спасибо за постановку задачи, вы — соучастник :)

    1. Дмитрий Амиров Автор

      Спасибо за теплые слова =)

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

      1. Иван

        Я это отследил быстро.

        Перехватив все три сообщения человек-в-середине мог бы восстановить ключи простыми алгебраическими операциями. Но. Мы тоже не лыком шиты.

        Я добавил неопределенности и таким образом повысил стойкость.

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

        Как протестировать или даже померить стойкость — не знаю/не умею:)

  34. Николай

    Аналогию с цветами понял, математику — нет. Гуманитарий, что тут скажешь.

  35. Михаил

    Дмитрий,

    Отличная статья! Все разложено доступным языком. Спасибо!

  36. Аноним

    Замечательная статья!!! Спасибо! Все написано доступно и очень интересно=)

  37. Иван

    Здравствуйте! Немного не понятно в последовательности:

    1) Вы шифруете сообщение закрытым ключом
    2) Присылаете его мне
    3) Я обращаюсь к вам, и получаю от вас Ваш публичный ключ
    4) Полученное сообщение расшифровываю Вашим публичным ключом
    5) Если сообщение расшифровалось — значит послали его именно вы

    В пункте 3, как понять обращаюсь, т.е. нужно чтобы свой публичный ключ мне прислал человек по электронке? Так что ли?

  38. хусейн

    В математике будущего нет такого понятия необратимая функция «смешанную краску разделить на первоночальные цвета Еве удасться» Потому что она знает один из цветов:желтый. Если бы вместо краски была нефть смешанная с водой, электролиз разделит воду и нефть.Фантастика? Нет после того, как математичка решила задачу с диффузией сахара в чае.

    1. Евгений

      Здесь описаны не «необратимые» функции, а односторонние. Это те, для которых сложность вычисления прямого и обратного значения сильно различаются. Собственно, их существование на данный момент не доказано и не опровергнуто, но принято пользоваться допущением, что они существуют (подобное происходит с гипотезой Римана).

  39. Дмитрий

    Огромное спасибо. Наконец-то впервые лет этак за 10 я все по этой теме уяснил.

  40. Артем

    Очень хорошо написано, сразу все стало понятно :) спасибо за статью!

  41. МиR

    статья супер!
    по методу: если на почте Бобу под видом «замок Алисы» дадут «замок Евы», то Ева перехватив послание сможет его открыть своим ключом. Так что безопасность под сомнением.

  42. Бронислав

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

    Ты такой странный !!!
    Описание RSA ничем не сложнее протокола Диффи-Хеллмана в плане использования математического аппарата.
    Ты привёл описание для Диффи-Хеллмана, но отказался расписать RSA, хотя там те же функции и понятия используются. Это очень странно выглядит со стороны.

  43. pi

    Подскажите, пожалуйста, какую роль играет пароль к ключу шифрования? Например, в truecrypt или pgp предлагается защитить ключ дополнительно паролем. Он шифрует ключ, или дополняет его? Насколька велика опасность если ключ скомпроментирован но пароль от него не известен злоумышленнику?

    1. Дмитрий Амиров Автор

      Насколька велика опасность если ключ скомпроментирован но пароль от него не известен злоумышленнику?

      Без пароля от ключа злоумышленник не сможет им воспользоваться. Т.е. да, пароль фактически защищает ключ от непреднамеренного использования, но не дополняет/усиливает его.

  44. Павел

    1. Алиса — 1л жёлтой краски , Боб — 1л жёлтой краски
    2. Алиса — 1л Жёл + 1л Зел краски, Боб — 1л жёл + 1л Син
    3. Обмен: Алиса — 1л Жёл + 1л Зел Боб — 1л жёл + 1л Син =
    Боб — 1л Жёл + 1л Зел , Алиса — 1л жёл + 1л Син
    4. Боб добавляет секретную краску (Гол) , Алиса добавляет ( чёр)
    5. В Результате у Боба находится 1л Жёл+1л Зел+1л Гол
    6. В результате у Алисы находит 1л Жёл+1л Син+1л Чёр

    С чего вдруг написано, что у них краска в банках стала одинакового цвета?

  45. Виталий Монастырский

    «Но суть в том что не существуют таких шифров, которые бы позволили снять шифр из под другого шифра.»
    Уже существует… :)
    Скоро выложу на гитхаб…

  46. гость

    Шифрование это независимый участок кода и там же и ключ есть?

    31.20.33.43.19.24.32.7.33.39.26.39.34.30.27.36.35.21.40.31.30.33

    То есть сели завели и поехали?

Добавить комментарий

Прочли запись? Понравилась? Не стесняйтесь, оставьте, пожалуйста, свой комментарий. Мне очень интересно, что вы думаете об этом. Кстати в комментарии вы можете задать мне любой вопрос. Я обязательно отвечу.

Вы можете оставить коментарий анонимно, для этого можно не указывать Имя и email. Все комментарии проходят модерацию, поэтому ваш комментарий появится не сразу.