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

Шифр

В базе своей асимметричное шифрование состоит из пары ключей - публичного и приватного. Иногда их называют открытым и закрытым. Именно пары - оба ключа создаются и используются вместе. Создает их получатель сообщения и выдает публичный ключ отправителю, а приватный - держит у себя в секрете. "Публичный" - от латинского слова publicus - публика, poplicus - люди, т.е. общественный. "Популярный", "попса" - почти однокоренные. Приватный - от слова privus - единичный, индивидуальный, т.е. личный.

Передача ключа
Передача ключа

Отправитель использует публичный ключ чтобы зашифровывать (закрыть) сообщение. Зашифрованное сообщение очень сложно расшифровать без приватного ключа, поэтому можно, в целом, без опаски передавать его получателю по открытым каналам связи. Получатель расшифровывает (открывает) сообщение своим секретным, приватным ключом. Слово шифр (англ. ciphers) - образованны от арабского ṣifr (صفر, сифр), т.е. ноль. Слово "цифра" - тоже.

Шифрование
Шифрование

Сертификаты

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

Атака посредника
Атака посредника

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

Подпись сертификата
Подпись сертификата

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

Недействительный сертификат
Недействительный сертификат

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

Подпись и проверка сертификата
Подпись и проверка сертификата

Интернет

Автоматически под капотом все эти механизмы обрабатывает браузер. Например, хром:

Строки адреса браузера
Строки адреса браузера

В вебе для шифрования используется протокол https, поверх протокола TLS (и его предшественник SSL, который морально устарел). Значок замочка обозначает, что сайт защищен (т.е. данные передаются по https). Если написано - "Не защищено" - значит это http без s (secure), данные передаются в открытую, их без проблем может прочитать кто угодно в цепочке передачи сообщения. Пароли, коды и сообщения, которые вы введете на этом сайте, смогут прочитать кто угодно: провайдер, тов.майор, сисадмин и т.д.

Если же https включен, но сертификат не валидный - браузер не пустит на страницу. В хроме - есть возможность продолжить на свой страх и риск. Современные сертификаты содержат в себе не только домен сайта, но и срок действия. Выдают их доверенные центры сертификации. Например, хабру сертификат выдан до 24.10.23 от "Sectigo ECC Domain Validation Secure Server CA", а им в свою очередь от корневого "USERTrust ECC Certification Authority". Посмотреть это можно нажав на замочек.

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

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

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

Для ускорения - подпись создается не из всего подписываемого документа, а только из его хэша.

Как это работает

Для примера возьму один из древнейших шифров - Шифр Цезаря. Он довольно прост: в исходом сообщении сдвигаем каждую букву в алфавите на ключ (число) k. Для буквы "А", при k=1 будет "Б", при k=2 будет "В" и т.д.

Мы генерируем два ключа, k1 - для шифрования, k2 - для дешифрования:

k1 = 4 (выбрали случайно)

k2 = 33-k1 = 29 (33 - количество букв в алфавите)

Зашифруем сообщение "эчпочмак с горячим чаем". Получается "быутырдо х жтфгымр ыдир".

Если мы повторим на получившуюся фразу алгоритм с тем же ключом k1 = 4, то получится "еячцяфзт щ кцшжярф язмф". А значит, нужно использовать другой ключ, k2 = 29, в таком случае получим исходную фразу. Таким образом для шифрования мы использовали k1, а для дешифрования - k2

Шифр не криптостойкий и легко взламывается. На практике же применяются более сложные алгоритмы.

Практика

Разновидность ассиметричных шифров - криптосистемы с открытым ключом используются для: 1) генерации ключей, 2) обмена ключами 3) шифрования и дешифрования сообщения.

Самый популярный ассиметричный алгоритм - RSA. С помощью него можно как создать подпись, так и зашифровать/расшифровать сообщение. Работает он за счет сложности факторизации полупростых чисел. Но есть и другие: Elgamal, LUC и пр.

Для генерации ключей рекомендуют использовать 2048-bit RSA или 256-bit ECDSA. Но ECDSA  (эллиптическая криптография) - быстрее и размер ключа меньше. На эту тему есть статья Хватит использовать RSA от @Scratch и статья Эллиптическая криптография: теория от @NeverWalkAloner. Есть также и другие криптосистемы: DSA, "ГОСТ 34.10-2018" и пр.

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

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

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

Есть рекомендуемые наборы шифров (Cipher Suite) для TLS. Рекомендации бывают такие и сякие, в общем - разные. Можно проверить, что используется в вашем браузере и какие поддерживаются. Например, этот - TLS_CHACHA20_POLY1305_SHA256. По буквам:

TLS - transport layer security (протокол защитного транспортного уровня)

CHACHA20_POLY1305 - ChaCha20-Poly1305, AEAD - это шифрование с аутентификацией (AE) с дополнительными данными (AD). ChaCha20 - потоковый шифр, вот статья на тему. POLY1305 - код аутентификации, формирует одноразовый номер (nonce), имитовставка для защиты целостности сообщения.

SHA256 - алгоритм хеширования с 256 битным хешем.

Реализации этого как правило есть в криптографических библиотеках. Например, для NET.7 есть реализация шифра CHACHA20_POLY1305.

Для более глубокого ознакомления - рекомендую статью Заметки по выбору шифров для TLS 1.3 от @Delion.

Пример электронной подписи

В академических целях возьмем ECDSA (эллиптическая кривая) для построения ключей подписи, асимметричный алгоритм. Есть уже готовые онлайн кодеры и декодеры, воспользуемся этим. Выбираем secp256k1 (параметры кривой). Я сгенерировал публичный и приватные ключи.

Публичный ключ

-----BEGIN PUBLIC KEY-----
MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEGs+iqyttCXyioLEfV6i8AqTmVtV+zHBY 9v9YgH8y2GpvJbG6rr2pac9UjmAUYvD1WFPvU99g0rGY5Ecrpltnqw==
-----END PUBLIC KEY-----

Приватный ключ

Сообщением будет "Привет!" и подпись:

MEYCIQD/EDwwADIfIxn9prpiyeDxysaCmz2l58N0JESJtG+L1wIhANRu9UTYzvYMEvCIKS1RYuskgRaTbAGuxf69DUwSEzaG

Чтобы проверить: вставляем в "Public Key" публичный ключ, внизу в "For Signature Verification" - подпись и в "Plain Text Message" - "Привет!" без кавычек. Выбираем "Verify Signature" - подтвердить подпись.

В дальнейшем, даже на другом сайте я могу подтвердить, что я - автор этой статьи. Например: http://www.ildar.in/publickeyexample

Пример шифрования сообщения

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

Генерируем пару ключей на 2048 бит. Мой публичный ключ:

MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhmoR7gzuOtGEJzXKTBfyPH2H9o2cgVRzJ1Jdrhp7k/QAckHY8wP93ofJD7zLnCWHtRIvUa0OVKX895mdG7/PETmz4TKlaHyAxrEG+KGpQyC83U2hpuc82DjLcDLiW10XwhVVp6Kx/HmT19zjmtuVq8vtetP4chjEW3HiiHBr/TrxTeFcLJ49uBdVc5V7W+Fy83dA45tZLDf2hj/RcgHG3HPDGyL+QgYOMwxZAjptpwOZgqKNB4j84/kFHfZ9cWsixLUiOk54I1z5bYmn+OmG0oKBBPLcAZZsDzJJyB3D0Bv4MByHyDdBUjDABj/PkpMuTjTEI67XbRNXI29l8gnZjQIDAQAB

С помощью публичного ключа, я зашифрую сообщение сам себе "Это - пример зашифрованного сообщения." (Нажимаю Encrypt) и получаю шифровку:

fw4FSeYXU6tTrm/ibOqHv7fdwugOPHq9Swql/d2Jh+KGqr4DA9gis4sTiW5FCJsfZoytlZfz4Fw7G5rjVAhmN9t7EZTBRPQ20A182A0fhd702XaVYdCQwxyDPEbgjZlbjD8yrrD1Y+Q+4nM6S10r0Q+gi0/LjLdx/NVdMlct7APBbroWH3nSDCyOuYes2+8Tonylht4Psjlsyt08+YQ6zeWAd9KPB+DYLFunmoY1nLJE23vTgq950VYI6VO9dVvVJmtcGTdZPVWxfPR8f41Muon9aENsoiXsmwf427cLhmRVsa7VrT3NVYxQcrd8TgqUi1lQZfYaIcdgH76FDKgieA==

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

Термины

Слово криптография образованно от двух др. греческих слов: kryptós (криптос) - сокрытое, секрет; и graphein (графен) - писать. Значит - запись чего-то секретного, "секретописание".

Асимметричное - от Праиндоевропейской приставки *sem- единый, вместе; *meh₁- измерять + суффикс -τρον (-трон) второе склонение, означает "тематически". Приставка (префикс) a- означает отрицание. Т.е. симметрия - что-то измеряемое одновременно. И асимметрия - что-то, что одновременно не измеримо. Например, симметрия глаз - для обоих глаз что-то совпадает. И наоборот - асимметричные глаза - для каждого глаза - что-то разное. Асимметрия цвета глаз - гетерохромия, глаза разного цвета.

Многие слова на латыни легко понять просто из своего состава, например - сертификат. Слова сформировались исторически, изучением занимается этимология. Причем, слова в некоторых языках могли образоваться от одного и того-же слова, но разными путями. Например: "секрет" - от слова "крыть", предположительно от др. греческого κρύπτω (крипто, скрыть). Можете сравнить этимологию слова "сертификат" и его значение в словариках, словите кринж и лулзы.

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

Комментарии (23)


  1. biff_33
    16.07.2023 16:40
    +1

    Проще: публичный ключ — это замок. Приватный ключ — это ключ от замка.


    1. Fodin
      16.07.2023 16:40
      +2

      Ну, нет. Аналогия, где ключ - это замок, а другой ключ - это ключ, совсем не проще.


      1. ildarin Автор
        16.07.2023 16:40

        Замок - это ключ, звучит как загадка) Еще веселее то, что публичный ключ называют открытым. Получается, что открытый ключ для закрытия, а закрытый - для открытия.


    1. ErshoffPeter
      16.07.2023 16:40

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

      Очевидно, что никакая ЭП документы не шифрует, а ключи - это способ из хэша сделать ЭП (закрытым ключом), и проверить корректность ЭП и идентифицировать подписанта открытым ключом.


      1. ildarin Автор
        16.07.2023 16:40
        -1

        Речь именно о шифровании) В случае аутентификации (сертификат в статье или ЭЦП) - может быть по разному, есть разные алгоритмы. Можно и шифровать, тогда открытый ключ И аутентифицирует, И расшифрует (помимо проверки целостности, которую можно обеспечить просто хэшем). Открытый ключ будет подписью в таком случае. Хз как там в терминологиях по госту, я говорю с точки зрения логики - ЭП должен подтверждать авторство.

        А насчет того, что подпись делают на хэш - не написал, но инфа полезная.


        1. ErshoffPeter
          16.07.2023 16:40

          Формально (с юридической точки зрения) ЭП - это аналог собственноручной подписи, не больше и не меньше. Шифрование - это отдельный процесс: когда мы ручкой подписываем документ, мы же не закрываем его тем самым от посторонних. Если мы просто зашифруем документ закрытым ключём, то вряд ли в суде такой документ будет признан подписанным. ????


        1. ErshoffPeter
          16.07.2023 16:40
          +1

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


          1. ildarin Автор
            16.07.2023 16:40

            Юридически, в РФ - да (пока опять не переписали одним днем пакет из 13 законов ????). Но в целом, в мире:

            (ЦП, Digital signature) Цифровая подпись — это математическая схема проверки подлинности цифровых сообщений или документов.

            Ну не авторство, а подлинность (authenticity). В более общем случае - это сертификат подлинности. Те же самые NFT еще и авторство доказывают, помимо подлинности.

            Ну, а если по ГОСТ 34.10-2018

            3.1.15 [электронная цифровая] подпись (signature); ЭЦП: Строка бит, полученная в результате процесса формирования подписи... "электронная подпись", "цифровая подпись" и "электронная цифровая подпись" являются синонимами.

            Цифровая подпись предназначена для аутентификации лица, подписавшего электронное сообщение.


  1. Number571
    16.07.2023 16:40

    Самый популярный ассиметричный алгоритм - RSA, но при этом - морально устаревший. На эту тему есть замечательная статья Хватит использовать RSA от @Scratch. Для генерации ключей рекомендуют использовать 2048-bit RSA или 256-bit ECDSA. Но ECDSA - быстрее и размер ключа меньше.

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

    Тут например, люди используют ECDH при помощи openssl для генерации сеансового ключа, а только потом его используют в качестве входа в AES для последующего шифрования, что является гибридной схемой шифрования, но не асимметричным шифрованием.

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


    1. ildarin Автор
      16.07.2023 16:40

      ECDiffieHellmanCng Class в NET.7

      Я и не говорю, что RSA - плохой, мне он очень нравится. И то, что EC оптимальнее, чем RSA - тоже не я придумал.

      что является гибридной схемой шифрования, но не асимметричным шифрованием.

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


      1. Number571
        16.07.2023 16:40
        +1

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

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

        Я не про TLS говорю, а про то, что не существует какой бы то ни было программной реализации асимметричного алгоритма на базе EC, который мог бы самодостаточно (без какого-либо симметричного алгоритма) шифровать информацию и был бы при этом проверенным как временем, так и криптографами потратившими своё время на его анализ.

        Тобишь моральное устарeвание означало бы, что всё что есть у RSA - уже давно есть у EC. А я говорю, что шифрования в EC на уровне программной реализации так и не завезли и поэтому вряд-ли можно говорить о каком-либо устаревании до тех пор, пока не будет аналогов. В этом был мой тезис.


        1. ildarin Автор
          16.07.2023 16:40

          Понял, я имел ввиду исключительно TLS для обмена ключами. Может дополню статью, спасибо за замечание.


        1. Alesh
          16.07.2023 16:40

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


  1. Ydhduucyw
    16.07.2023 16:40

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


    1. ildarin Автор
      16.07.2023 16:40

      Представьте сейф с кодовым замком. Но закрыть его нельзя без правильного кода. Допустим, открывает его 1234, а закрывает 4321. Итого - два цифровых ключа.


    1. sci_nov
      16.07.2023 16:40
      +2

      Это просто математика. Например, берёте некоторое простое число, p=251. Берёте некоторый ключ шифрования, k=77. Далее формируете ключ расшифрования, q, такой что kq = 1 mod p. В данном случае q=163, потому что 77*163=12551, а последнее число даёт остаток от деления на p=251 равный единице. Далее шифруете некоторое сообщение v=22 путём умножения на ключ vk mod p = 188. Этот шифртекст можно расшифровать умножением на открытый ключ q: 188*163 mod p = 22 = v.


      1. ildarin Автор
        16.07.2023 16:40

        Это однозначно проще понять ????

        Я специально не стал разбирать алгоритмы шифрования в статье, чтобы их проще объяснить - отдельная статья нужна. Для RSA уже тысячи написаны, о сложности факторизации полупростых чисел. Есть, например - ELGAMAL, там иной алгоритм. DCA, ECC и т.д.


        1. sci_nov
          16.07.2023 16:40

          Я пример с сейфом, честно, не понял


          1. ildarin Автор
            16.07.2023 16:40

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


            1. sci_nov
              16.07.2023 16:40

              А, дак там наверное в памяти коды прописаны и нет математики, только сравнение


              1. ildarin Автор
                16.07.2023 16:40

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

                Так то можно было бы в пример шифр Цезаря. "Чу, я слышу пушек гром!" зашифровываем с k=3, получается "Ъц, в фоюыц тцызн ёусп!", а расшифровываем с ключом k=30, ибо с k=3 будет "Эщ, е чсбющ хщюкр ицфт!". Может и зря я его к симметричным отнес)


          1. ildarin Автор
            16.07.2023 16:40

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


  1. YiehraiS
    16.07.2023 16:40
    +1

    Аналогия прозвучала довольно хорошая относительно печати и оттиска.