Весь интернет с его приватностью и защищенностью держится на замысловатых криптографических асимметричных алгоритмах. Постараюсь доступно объяснить, что это и как этим пользоваться.
Шифр
В базе своей асимметричное шифрование состоит из пары ключей - публичного и приватного. Иногда их называют открытым и закрытым. Именно пары - оба ключа создаются и используются вместе. Создает их получатель сообщения и выдает публичный ключ отправителю, а приватный - держит у себя в секрете. "Публичный" - от латинского слова 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)
Number571
16.07.2023 16:40Самый популярный ассиметричный алгоритм - RSA, но при этом - морально устаревший. На эту тему есть замечательная статья Хватит использовать RSA от @Scratch. Для генерации ключей рекомендуют использовать 2048-bit RSA или 256-bit ECDSA. Но ECDSA - быстрее и размер ключа меньше.
Это всё хорошо, но покажите мне стандартизированную и проверенную временем/криптографами программную реализацию ECIES на любом языке программирования, которой люди могли бы пользоваться как RSA для шифрования сообщений. Всё, что я видел - так это ECIES созданный в кустарных условиях.
Тут например, люди используют ECDH при помощи openssl для генерации сеансового ключа, а только потом его используют в качестве входа в AES для последующего шифрования, что является гибридной схемой шифрования, но не асимметричным шифрованием.
Одно дело говорить, что RSA - морально устарел, а другое дело - это реальность, когда не существует аналога к RSA на основе эллиптических кривых, который можно было бы легко и безопасно использовать (шифровать/расшифровывать информацию) в качестве уже готовой реализации.
ildarin Автор
16.07.2023 16:40ECDiffieHellmanCng Class в NET.7
Я и не говорю, что RSA - плохой, мне он очень нравится. И то, что EC оптимальнее, чем RSA - тоже не я придумал.
что является гибридной схемой шифрования, но не асимметричным шифрованием.
TLS и является гибридным, я же писал - ассиметричные ключи для аутентификации, симметричное шифрование.
Number571
16.07.2023 16:40+1ECDiffieHellmanCng - это протокол Диффи-Хеллмана на эллиптических кривых, созданный для распределения ключей, а далее используемый симметричными шифрами. Я же говорю конкретно про шифрование без участия каких бы то ни было симметричных алгоритмов.
TLS и является гибридным, я же писал - ассиметричные ключи для аутентификации, симметричное шифрование.
Я не про TLS говорю, а про то, что не существует какой бы то ни было программной реализации асимметричного алгоритма на базе EC, который мог бы самодостаточно (без какого-либо симметричного алгоритма) шифровать информацию и был бы при этом проверенным как временем, так и криптографами потратившими своё время на его анализ.
Тобишь моральное устарeвание означало бы, что всё что есть у RSA - уже давно есть у EC. А я говорю, что шифрования в EC на уровне программной реализации так и не завезли и поэтому вряд-ли можно говорить о каком-либо устаревании до тех пор, пока не будет аналогов. В этом был мой тезис.
ildarin Автор
16.07.2023 16:40Понял, я имел ввиду исключительно TLS для обмена ключами. Может дополню статью, спасибо за замечание.
Alesh
16.07.2023 16:40Что то я не пойму, вы утверждаете что с помощь ЕС нет надежного или вернее общепринятого надежным способа шифрования. Все что сейчас имеется, это все поделки что ли?
Ydhduucyw
16.07.2023 16:40Никогда не понимал как можно шифровать одним ключом а расшифровывать другим?
ildarin Автор
16.07.2023 16:40Представьте сейф с кодовым замком. Но закрыть его нельзя без правильного кода. Допустим, открывает его 1234, а закрывает 4321. Итого - два цифровых ключа.
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.
ildarin Автор
16.07.2023 16:40Это однозначно проще понять ????
Я специально не стал разбирать алгоритмы шифрования в статье, чтобы их проще объяснить - отдельная статья нужна. Для RSA уже тысячи написаны, о сложности факторизации полупростых чисел. Есть, например - ELGAMAL, там иной алгоритм. DCA, ECC и т.д.
sci_nov
16.07.2023 16:40Я пример с сейфом, честно, не понял
ildarin Автор
16.07.2023 16:40Например, шкаф с ячейками службы доставки в супермаркете. Аня заказала у Вики товар. Служба доставки говорит Вике код, чтобы ячейку закрыть, а Ане - чтобы открыть. Вика приходит, ячейка - открыта. Помещает товар, набирает код - ячейка закрывается. Потом приходит Аня - вводит код и открывает ячейку.
sci_nov
16.07.2023 16:40А, дак там наверное в памяти коды прописаны и нет математики, только сравнение
ildarin Автор
16.07.2023 16:40Зависит от реализации. Это просто пример ассиметричной криптографии в реальном мире, когда есть два ключа. Хз, спрашивал ли комментатор о математическом обосновании, но если да - в википедии все уже написано. А вот простым языком на аналогиях из реального мира - хз, есть ли где еще.
Так то можно было бы в пример шифр Цезаря. "Чу, я слышу пушек гром!" зашифровываем с k=3, получается "Ъц, в фоюыц тцызн ёусп!", а расшифровываем с ключом k=30, ибо с k=3 будет "Эщ, е чсбющ хщюкр ицфт!". Может и зря я его к симметричным отнес)
ildarin Автор
16.07.2023 16:40Ну, или идея почтового ящика с кодовым замком. Один код (публичный) - открывает щель для корреспонденции, второй (приватный) - открывает ящик полностью. И публичный код только у почтальона. И никаких рекламных брошюр и прочего мусора в ящике.
biff_33
Проще: публичный ключ — это замок. Приватный ключ — это ключ от замка.
Fodin
Ну, нет. Аналогия, где ключ - это замок, а другой ключ - это ключ, совсем не проще.
ildarin Автор
Замок - это ключ, звучит как загадка) Еще веселее то, что публичный ключ называют открытым. Получается, что открытый ключ для закрытия, а закрытый - для открытия.
ErshoffPeter
Нет никакого замка! Регулярно на собеседованиях спращиваю про электронную подпись и получаю ответ, что ЭП - это пара ключей, а ещё ЭП шифрует документы.
Очевидно, что никакая ЭП документы не шифрует, а ключи - это способ из хэша сделать ЭП (закрытым ключом), и проверить корректность ЭП и идентифицировать подписанта открытым ключом.
ildarin Автор
Речь именно о шифровании) В случае аутентификации (сертификат в статье или ЭЦП) - может быть по разному, есть разные алгоритмы. Можно и шифровать, тогда открытый ключ И аутентифицирует, И расшифрует (помимо проверки целостности, которую можно обеспечить просто хэшем). Открытый ключ будет подписью в таком случае. Хз как там в терминологиях по госту, я говорю с точки зрения логики - ЭП должен подтверждать авторство.
А насчет того, что подпись делают на хэш - не написал, но инфа полезная.
ErshoffPeter
Формально (с юридической точки зрения) ЭП - это аналог собственноручной подписи, не больше и не меньше. Шифрование - это отдельный процесс: когда мы ручкой подписываем документ, мы же не закрываем его тем самым от посторонних. Если мы просто зашифруем документ закрытым ключём, то вряд ли в суде такой документ будет признан подписанным. ????
ErshoffPeter
И еще три копейки с формальной точки зрения: ЭП не подтверждает авторство, ЭП подтверждает, что хозяин закрытого ключа поставил свою подпись под конкретной версией документа и эта версия осталась неизменной с момента подписания. То есть волеизъявление лица и неизменность документа (его версии).
ildarin Автор
Юридически, в РФ - да (пока опять не переписали одним днем пакет из 13 законов ????). Но в целом, в мире:
Ну не авторство, а подлинность (authenticity). В более общем случае - это сертификат подлинности. Те же самые NFT еще и авторство доказывают, помимо подлинности.
Ну, а если по ГОСТ 34.10-2018