Привет, Хабр! Сегодня мы решили помочь аналитикам, менеджерам проектов и другим людям, которым нужно быстро освоить или вспомнить базовые понятия криптографии. Может быть, вы присоединились к проекту, в котором эта информация необходима для общения с командой, или вы просто хотите освежить свои знания, а времени на чтение учебников у вас нет. Возможно, вы пытаетесь подготовиться к собеседованию в компанию, которая занимается разработкой продуктов в сфере криптографической защиты информации, но ранее вы в этой области не работали. Ситуации могут быть разными, но в любом случае мы постараемся помочь вам разобраться! Не нужно бояться, что ваши возможности упущены, если у вас нет образования в этой сфере. Например, в нашу команду приходят специалисты с разным бэкграундом и при желании быстро «добирают» необходимые знания у коллег. Наставничество и обучение – одна из наших сильных сторон. В этой статье по опыту таких сотрудников и их кураторов мы расскажем, с какими сложностями они столкнулись при изучении, что помогало им систематизировать информацию, а что путало.  Часто на вопрос о сложностях нам показывали Анжелу - это любимый мем отдела криптографии :) Важно отметить, что глубокое погружение в криптографию без знания математики невозможно, так как все криптографические механизмы основаны на математических операциях. Но в этой статье мы хотели бы поговорить про прикладную часть вопроса, и не будем говорить про математику.  Изучение любой предметной области начинается с изучения терминологии. Необходимые для погружения в контекст криптографические термины и их определения всегда указывают в нормативных документах. Есть и обобщающие материалы, например, отдельный словарь криптографических терминов, созданный Техническим комитетом №26 (TK26)..  Что такое ТК26? Это комитет, который выпускает методические рекомендации и рекомендации по стандартизации криптографических алгоритмов.  Регулирование в области криптографии осуществляет ФСБ России. В области информационной безопасности существуют и другие регуляторы, но именно ФСБ работает со средствами криптографической защиты информации. Запомните это! Такой вопрос могут задать на собеседовании или во время промежуточного тестирования знаний на испытательном сроке.  Конечно, не только в РФ существуют организации, формирующие нормативную базу по криптографии. Так, в США выпуском национальных стандартов по криптографии (FIPS) занимается национальный институт стандартов и технологий (NIST). Что касается прикладной части использования криптографии, это различные стандарты и спецификации: RFC, ISO/IEC, PKCS и другие. Их выпуском занимаются такие организации, как Инженерный совет Интернета (IETF), Международная организация по стандартизации (ISO), Европейский институт телекоммуникационных стандартов (ETSI), консорциум OASIS.  В прикладном смысле криптография направлена на решение проблем обеспечения безопасности информации: обеспечение конфиденциальности, контроль целостности, подтверждение аутентичности и обеспечение невозможности отказа сторон (информационного взаимодействия) от авторства. Столпы криптографии — шифрование, хэширование, электронная подпись и имитовставка. Иными словами, все это — криптографические методы защиты информации. И каждый отдельный метод необходим для достижения одного или нескольких свойств безопасности информации, и, как правило, на практике все указанные методы используются в комплексе. Знаем, что многие начинают путаться, например, на вопросе “а каким способом обеспечить целостность?” Давайте поговорим о тонкостях в понимании свойств безопасности информации, чтобы в дальнейшем разобраться, какие криптографические методы защиты информации за что отвечают.  Конфиденциальность (или секретность) предполагает невозможность несанкционированного доступа к информации. Проще говоря, информация должна быть недоступна тем, для кого она не предназначена.  Целостность предполагает невозможность несанкционированного изменения информации. Важно понимать, что при выполнении данного свойства мы активно не защищаемся от каких-либо манипуляций с информацией (вставка, удаление, подмена), а лишь гарантируем целостность информации. Для гарантии целостности, необходим механизм, который позволит указать на то, что информация не была изменена, т.е. осуществить контроль целостности.   Обратите внимание на одну ловушку! Если механизм контроля целостности бесключевой, то имеем дело по сути с некоторой контрольной суммой, и тогда возможно только обнаружение случайных искажений. Если хотим защититься от целенаправленного изменения исходной информации, то механизм контроля целостности должен зависеть от секретного ключа.  Аутентичность — есть подлинность. А аутентификация означает установление подлинности. Здесь тоже есть нюансы: в широком смысле аутентификация включает проверку подлинности взаимодействующих сторон и самой информации (сообщения).  Аутентификация сторон предполагает проверку одной из сторон того, что взаимодействующая с ней сторона — именно та, за которую себя выдает. Здесь работают протоколы аутентификации, но в этой статье не о них. Аутентификация информации (часто можно встретить термин аутентификация данных) может затрагивать немало аспектов, например, подлинность содержания, источника, времени создания и другое. Остановимся только на содержании и источнике. Проверка подлинности содержания сводится к контролю целостности. Проверка подлинности источника (аутентификация источника данных) подтверждает, что информация (сообщение) создана именно заявленным источником. В нашей статье, говоря “аутентификация”, будем подразумевать именно последнее.  Неотказуемость. Здесь два аспекта. Во-первых, необходимо подтвердить авторство, во-вторых, обеспечить невозможность отказа от него (или, наоборот, присвоения авторства). Теперь смотрите таблицу ниже, мы постарались разложить для вас все сразу и по полочкам. Ц — контроль целостности; К — обеспечение конфиденциальности; А — подтверждение аутентичности источника; Н — обеспечение неотказуемости. 1 — только контроль целостности при случайных искажениях. 2 — при доверии сторон друг другу. Первое направление криптографических методов защиты информации, с которым мы вас познакомим — шифрование.  Прежде всего нужно понимать, что называется шифром. На этом моменте вас легко бы могли подловить, если бы вы не знали, что шифром (или шифрсистемой) называют совокупность криптографических алгоритмов зашифрования, расшифрования и генерации соответствующих ключей.  В свою очередь под шифрованием понимают два процесса: зашифрование и расшифрование.  Чтобы разобраться, рассмотрим связанные определения: Открытый текст (исходный текст или сообщение) — подлежащие защите данные. Шифртекст — защищенные данные, полученные посредством зашифрования. Ключ — элемент данных, который является параметром криптосистемы. А теперь – о самом шифровании: Зашифрование — преобразование открытого текста в шифртекст.  Расшифрование — преобразование шифртекста в исходный (открытый) текст. Таким образом, зашифрование и расшифрование являются парой взаимосвязанных криптографических преобразований.  Будьте осторожны! Коварные приставки могут погубить вас на собеседовании или обречь на невыносимый спор с коллегой. Скорее всего приравнивание зашифрования шифрованию пропустят мимо ушей, но использование термина дешифрование в неверном контексте без внимания не останется. Все дело в том, что термин дешифрование принадлежит области криптоанализа и подразумевает процесс преобразования шифртекста в исходный текст без знания секретного ключа. К тому же, не вздумайте назвать шифрование кодированием — это в корне неверно и смерти подобно. Кодирование совсем не про защиту информации. Оно необходимо лишь для преобразования данных из одной формы представления в другую, например, потому что так сейчас удобно.   И теперь самое интересное: зачем оно (ну, в смысле шифрование) вообще нам надо? Шифрсистема по своему определению – криптосистема, цель которой – обеспечение конфиденциальности данных. «Но ведь криптография отвечает не только за конфиденциальность», – скажете вы, – «сами же табличку показывали с аутентичностями и целостностями!». Согласны :) Настала пора ввести термин криптосистема… Нам нравится определение из упомянутого ранее словаря: Криптосистема — система обеспечения решения поставленных задач защиты информации на основе применения методов криптографической защиты информации. А какие еще бывают криптосистемы?  Давайте разберем характерные черты симметричных криптосистем: В симметричных криптосистемах в парах взаимосвязанных криптографических преобразований применяется один и тот же криптографический ключ.  Секретный ключ, как несложно догадаться, должен храниться в секрете, на то он и секретный.  Симметричные криптосистемы предполагают, что отправитель и получатель должны заранее согласовать секретный ключ. Причем должно существовать взаимное доверие между сторонами, участвующими в информационном обмене.  Безопасность симметричных систем завязана на ключе: компрометация ключа фактически равноценна взлому криптосистемы.   Симметричные криптосистемы в современном мире могут быть основой для: (Симметричного) шифрования. Имитовставки. Думаем, что вы уже поняли, где слабые места симметричных криптосистем: Распределение ключей.  Обеспечение конфиденциальности секретного ключа. Нет никаких гарантий, что ключ не будет скомпрометирован.   К тому же, представьте, что требуется обмениваться секретным ключом с каждым получателем. Это ведет к тому, что количество ключей в системе многократно увеличивается. Очевидно, что такая система не может похвастаться хорошей масштабируемостью.  Может показаться, что симметричная криптография — полная шляпа. Но это совсем не так! Для симметрии характерна высокая производительность и криптографическая стойкость.  Даже появление квантового компьютера не ставит под угрозу существование большинства современных симметричных алгоритмов: для сохранения такой же криптостойкости потребуется вдвое увеличить длину секретного ключа, тогда как для асимметричных алгоритмов, например, для RSA, увеличивать длину ключа потребуется экспоненциально.  Примерами применения симметричных криптосистем могут послужить различные сервисы для коммуникаций, где таким образом посредством шифрования защищается переписка.  К слову, почти всегда для защищенного обмена информацией и используются симметричные шифры, что обусловлено их высокой производительностью.  Возвращаясь к шифрованию…если схема шифрования симметричная, то для зашифрования и расшифрования будет использовать один и тот же ключ. Чуть-чуть скажем о том, что современная криптография выделяет только два типа симметричных шифров: блочные и поточные (потоковые).  Блочные шифры работают с группами бит открытого (или шифртекста) текста, т.е. обрабатываемый текст разбивается на блоки равного размера. Сейчас типичный размер блока составляет немного-немало 64 или 128 бит. Потоковые же шифры обрабатывают открытый текст (или шифртекст) побитово (иногда побайтно).  В зависимости от того, как информация поступает в систему, выбирают разные типы симметричных криптосистем. Если данные поступают непрерывно, можно использовать поточные шифры: они полезны, когда количество поступающей для зашифрования информации неизвестно. Если же данные для зашифрования известны сразу целиком, то предпочтительно использовать блочные шифры, так как они являются более стойкими к криптоанализу. Как можно применить симметричное шифрование так, чтобы стали возможными контроль целостности исходной информации и проверка аутентичности ее источника? Сразу скажем, что здесь нас выручит имитовставка, но есть маленькое “но”. По своей сути имитовставка — это дополнительная информация, которая вырабатывается по определенному алгоритму на основе исходных данных и секретного ключа, имеет ограниченный (фиксированный) размер и добавляется к этим же исходным данным.  Секретный ключ здесь будем называть ключом аутентификации. В зарубежной терминологии имиту (говорите так, чтобы сойти за своего) называют кодом аутентичности сообщения (Message Authentication Code — MAC). К тому же, термин MAC часто используется и в нашей стране. Если схема имитовставки построена на симметричном (блочном) шифре, то ключом аутентификации будет все тот же секретный ключ шифрования. Такие имитовставки принято называть CMAC. Простецкий способ выработать имитовставку в этом сценарии — взять определенный “кусочек” шифртекста.  Будем с вами честны: MAC вычисляется не только на основе симметричной криптографии, но и по другим схемам. Не пугайтесь, если встретите где-то аббревиатуру HMAC. Буква H в начале означает, что имитовставка была вычислена с использованием функции хэширования. Здесь ключ аутентификации смешивается с сообщением по определённому правилу, а уже к результату смешения применяется хэш-функция. О функции хэширования поговорим чуть позже.  Возвращаемся к обеспечению аутентичности с помощью имитовставок и тому маленькому “но”. Здесь проблема заключается в том, что один и тот же ключ есть у обеих сторон. Отправитель может отказаться от факта передачи сообщения, сославшись на то, что получатель мог сгенерировать сообщение и самостоятельно с использованием того же ключа. Все описанное кратко называется красивым термином ренегатство.  Помимо этого, также возможна подмена сообщения или модификация оригинального сообщения получателем. Так что, свойство аутентичности возможно закрыть только в том случае, когда стороны друг другу доверяют. Решение этих проблем (да и не только, вспомните еще и про сложности при распределении секретных ключей) находится в другой области — асимметричная криптография. Так, а что там характерно для асимметричной криптографии?  Для осуществления пары криптографических преобразований используются два различных криптографических ключа. Эти ключи образуют так называемую ключевую пару. Открытый ключ — общедоступный ключ из ключевой пары. Закрытый ключ — ключ из ключевой пары, сохраняемый в секрете.  Открытый ключ доступен всем желающим. Фокус состоит в том, что при этом криптосистема не подвергается опасности. Закрытый ключ хранится в тайне и известен только одной стороне обмена информацией. Ключи из пары связаны математически, причем так, что, зная открытый ключ, вычислить закрытый на практике за разумное время невозможно. Все перечисленные выше свойства асимметричной криптографии нашли свое приложение по следующим направлениям: (Асимметричное) шифрование. Системы электронной подписи. Одна из фундаментальных проблем криптографии — управление ключами.  Сюда можно включить как вопросы управления открытыми ключами, так и задачи транспортировки и согласования секретных ключей, где применимы и симметричные, и асимметричные схемы.  Тема управления ключами достаточно обширна, поэтому в данной статье касаемся ее лишь вскользь, и только для того, чтобы обратить ваше внимание на важные преимущества асимметричной криптографии относительно симметричной. Пока достаточно отметить, что асимметричная криптография позволяет существенно уменьшить количество ключей, которые распределяются физически (например, в PKI только ключи центров сертификации распределяются физически). Асимметричные криптосистемы не предполагают передачу секретного ключа, желающие участвовать в информационном обмене с владельцем секретного ключа используют связанный с ним открытый ключ. Проблема обеспечения секретности при передаче ключа по открытому каналу утратила актуальность. Но избавившись от одной проблемы, мы нажили другую: нельзя быть уверенным в том, что открытый ключ, который доступен всем и вся, действительно является открытым ключом соответствующего владельца и не был подменен. Кстати, здесь владелец ключа — это совсем необязательно человек, чаще это вычислительное устройство. Отсюда, возникло такое понятие, как привязка ключа. Бывают разные формы привязки (к примеру, сертификат из PKI), но сейчас не об этом. Теперь поговорим о том, как использовать асимметричную криптографию.  Часто асимметричные криптосистемы (имеются в виду шифрсистемы) именуют криптосистемами с открытым ключом…нууу, потому что он там есть. В таких криптосистемах зашифрование осуществляется с помощью открытого ключа получателя, а расшифрование с помощью закрытого ключа все того же получателя. Асимметричная криптография — очень и очень тяжеловесная история, которая требует немалых затрат процессорного времени. Поэтому она в редких случаях применяется для осуществления шифрования. Часто на основе асимметричной криптографии осуществляется распределение ключей, а вот шифрование данных отдается на откуп симметрии.  Еще не поговорили об одном важнейшем в прикладном смысле криптографическом механизме — электронной подписи.  Электронная подпись является аналогом обычной рукописной подписи, да и по большому счету имеет те же свойства. ЭП позволяет осуществить контроль целостности и идентифицировать подписавшего при невозможности отказа от авторства, т.е. гарантированно подтвердить авторство, а также, подобно имитовставке, которую мы обсуждали ранее, ЭП вырабатывается по определенному алгоритму и присоединяется в виде некоторой избыточной информации к защищаемым (подписываемым) данным. В схеме электронной подписи должно быть две части: одна отвечает за формирование (создание) подписи, другая за проверку. Вторая часть является общедоступной. Многие заблуждаются, считая, что реализация ЭП может быть основана только на асимметричной криптографии. Отнюдь, есть схемы ЭП и на симметрии, но это весьма прохладная история:  как мы знаем, в симметричных криптосистемах участники информационного обмена должны быть непогрешимы, чтобы избежать ренегатства; для проверки подписи потребуется тот же секретный ключ, на котором выполнена подпись, т.е. каждый, кто проверяет подпись, должен узнать секретный ключ.  А вот асимметричная криптография здесь это то, что доктор прописал. Итак, закрытый ключ применяется для подписания данных и называется ключом ЭП, открытый ключ используется для проверки подписи и соответственно именуется ключом проверки ЭП. Как мы говорили, тяжело и больно работать с асимметрией, поэтому в целях повышения производительности подписывают не все данные целиком, а, как правило, их хэш.  Хэширование относится к бесключевым криптографическим методам, то есть, для систем такого типа вообще не используется ключ, а данные, которые необходимо преобразовать, являются единственным входным параметром в хэш-функцию. Хэш-функция — функция, осуществляющая преобразование исходных данных произвольного размера в битовую строку фиксированной длины. Результат преобразования называется «хэшем», «хэш-кодом» или «хэш-суммой». Хэш-функции, использующиеся в криптографии, должны удовлетворять особым требованиям. Будем называть такие функции криптографическими хэш-функциями.  В некриптографических приложениях основными требованиями к ним являются легкость реализации (как программной, так и аппаратной) и скорость работы. В криптографии же хэш-функции должны быть однонаправленными (необратимыми) и защищенными от коллизий (хотя требований по простоте реализации и скорости преобразований также никто не отменял). Если хэш-функция обладает свойством необратимости, то по значению хэш-функции не получится за разумное время вычислить исходное сообщение. Это свойство делает хэш-функции полезными в сценариях, когда надо доказать, что данные не были изменены после того, как от них получили хэш-сумму, или, когда нужно сравнить эталонные данные с заново полученными.  Как вы уже могли заподозрить, данных в мире бесконечное множество, а хэш-сумма имеет ограниченную длину, и велик риск, что хэш-сумма от совершенно разных данных будет одинаковой. Поэтому к каждой хэш-функции, которая претендует на звание стойкой, предъявляются следующие требования по стойкости к коллизиям. стойкость к коллизиям первого рода): должно быть невозможно за разумное время, по данному сообщению, найти другое сообщение с тем же хэшем.  стойкость к коллизиям второго рода: должно быть невозможно за разумное время подобрать пару сообщений с одинаковым хэшем. Важно отметить, что все хэш-функции должны обладать достаточно сильным лавинным эффектом: это когда от одного бита входной информации зависят все выходные биты информации. То есть, хэш от данных, в которых изменили даже одну запятую, будет сильно отличаться от изначального.  Где можно применить хэш-функции? Да, вы абсолютно верно вспомнили, что хэш-функции нашли свое применение и в схеме вычисления ЭП, и в схеме вычисления имитовставки (HMAC).  Пока не забыли, расскажем, что HMAC также называют ключевым хэшированием, хотя само по себе хэширование — это бесключевой механизм. Такой оксюморон не должен вас пугать, попросту стоит запомнить этот термин.  Свойства и самой функции хэширования, и так называемого ключевого хэширования оказываются полезными во многих криптографических механизмах. К примеру, псевдослучайные функции (PRF) для протоколов TLS и IPsec и функции порождения новых ключей (KDF) построены на HMAC. Рассматривая примеры, более приближенные к жизни, скажем, что с помощью хэш-функций можно не бояться за сохранность паролей пользователей на серверах: любое приложение или сайт не хранит сам пароль, а только хэш-код от него. При попытке пользователя авторизоваться хэш-код от введённого пароля сравнивается с тем, который хранится в базе данных, и, если коды одинаковы –  пользователю дают доступ в личный кабинет. Однако при атаке на базу данных у злоумышленника не будет самих паролей (при условии, конечно, что пароли были придуманы стойкие и разные! а пароль 123456 ещё никому не помог). Чтобы совсем запутать злоумышленника, к хэшу пароля ещё подмешивается случайное значение (соль), так что даже для одинаковых паролей хэши выглядят по-разному. Кроме хранения паролей, хэш-функции используются для обеспечения целостности в данных, которые непрерывно формируются и дополняются: например, чтобы защитить транзакции в блокчейне от искажения и “привязать” новый блок к цепочке предыдущих.  На самом деле тема блокчейна довольно непростая для осознания, и перегружать статью и ваши головы этой информацией мы не будем (вы уже слышите облегчённые вздохи студентов после трёхчасового семинара?). Но если вам стало очень интересно, можно сходить почитать вот эту статью.  Это была только часть базового набора для тех, кто пытается разобраться с криптографией. Очень надеемся, что при прочтении у вас не возникло ощущение закипающих мозгов :)  Напишите в комментариях, с какими сложностями в этой области сталкивались вы!  Если после нашего текста вы поняли только то, что надо обратиться к учебникам, то вот наша подборка полезной литературы:  Алферов А.П., Зубов А.Ю., Кузьмин А.С., Черемушкин А.В. “Основы криптографии” Шнайер Б. “Прикладная криптография” Смарт Н. “Криптография”  Здесь кибербезопасно!