Pull to refresh

Асимметричная криптография для чайников

Level of difficultyEasy
Reading time7 min
Views21K

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

Шифр

В базе своей асимметричное шифрование состоит из пары ключей - публичного и приватного. Иногда их называют открытым и закрытым. Именно пары - оба ключа создаются и используются вместе. Создает их получатель сообщения и выдает публичный ключ отправителю, а приватный - держит у себя в секрете. "Публичный" - от латинского слова 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 и пр.

Для генерации ключей в SSL/TLS рекомендуют использовать 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- означает отрицание. Т.е. симметрия - что-то измеряемое одновременно. И асимметрия - что-то, что одновременно не измеримо. Например, симметрия глаз - для обоих глаз что-то совпадает. И наоборот - асимметричные глаза - для каждого глаза - что-то разное. Асимметрия цвета глаз - гетерохромия, глаза разного цвета.

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

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

Tags:
Hubs:
Total votes 17: ↑9 and ↓8+1
Comments23

Articles