Что такое Windows CryptoAPI?

Защита информации в цифровой век - область знаний весьма важная, а для разработчиков прикладных приложений ещё и весьма хлебная. Хотя, конечно, во многом борьба с хакерами всех мастей в наши неспокойные времена напоминает истерию. Но и на истериях можно неплохо зарабатывать. И если заказчик просит сделать такую защиту для базы данных или для своих Word'овских файлов на любой флэшке, почему бы и нет, если он готов платить?

Набор программных интерфейсов Windows для работы с криптографией имеет название CryptoAPI. Но прежде чем говорить непосредственно о CryptoAPI, стоит посвятить читателей в сам предмет криптографии.


Что такое современная криптография?

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

Ключевым понятием современной криптографии является шифр. Это совокупность алгоритмов криптографических преобразований, которые называются шифрованием, которые переводят открытые данные в закрытые (математики говорят, что множество открытых данных отображаются на множество закрытых), и обратных им преобразований. Секретность криптографического процесса обеспечивается ключом - параметром алгоритма, который задаёт точное преобразование из всей совокупности возможных для данного алгоритма. Шифры подразделяются на симметричные и асимметричные в зависимости от того, совпадает ли ключ шифрования с ключом расшифрования. У симметричных они совпадают, у асимметричных, соответственно, нет. Симметричные шифры, в свою очередь, подразделяются на блочные и потоковые. Особенностью блочного шифра является обработка блока нескольких байт за одну итерацию, поточные же шифры отличаются тем, что в них каждый символ открытого (исходного) текста преобразуется в символ шифрованного текста в зависимости не только от используемого ключа, но и от его расположения в потоке открытого текста.

Где есть защита, там и взлом. Ещё одна из важных областей современной криптографии как раз и занимается тем, что взламывает всевозможные зашифрованные данные. Называется она криптоанализом. Под термином "криптоанализ" также понимается попытка найти уязвимость в криптографическом алгоритме или протоколе. Хотя основная цель осталась неизменной с течением времени, методы криптоанализа претерпели значительные изменения, эволюционировав от использования лишь ручки и бумаги до широкого применения вычислительных мощностей компьютеров в наши дни. Если раньше криптоаналитиками были большей частью лингвисты, то в наше время это удел математиков. И главную роль в этом сыграли цифровые технологии.

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


Архитектура CryptoAPI

Как и большая часть других программных интерфейсов от Microsoft, CryptoAPI старается скрыть все сложности процессов шифрования и расшифрования от прикладного программиста. Естественно, такое возможно только в том случае, если непосредственно криптографический процесс возложен на плечи какого-то стороннего приложения или библиотеки. В системе CryptoAPI используются именно DLL-библиотеки, которые называются криптопровайдерами. Именно с ними, в конечном счёте, работает прикладное приложение через интерфейс CryptoAPI. Более наглядно эта схема изображена на иллюстрации.

Глядя на такую схему, легко увидеть её главный недостаток. Это именно уязвимость криптопровайдеров, поскольку один из них можно подменить другим, и в итоге данные могут оказаться незащищёнными. Специально для того, чтобы такое не происходило, криптопровайдеры защищаются цифровой подписью, которая проверяется при каждом обращении к ним. Таким образом и обеспечивается подлинность криптопровайдеров. Что представляет собой цифровая подпись, я расскажу чуть ниже, но сначала хочу сказать, что, несмотря на этот недостаток, такая схема работы CryptoAPI имеет множество преимуществ. И главное из них - гибкость. То есть, если в процессе эксплуатации программы выяснится, что есть необходимость применять более серьёзную систему защиты, достаточно выбрать (или создать самостоятельно) более мощный криптопровайдер, который будет удовлетворять поставленным перед разработчиками задачам.


Что такое электронная цифровая подпись?

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

Строгое определение ЭЦП таково: это реквизит электронного документа, предназначенный для удостоверения источника данных и защиты данного электронного документа от подделки. Фактически, в мире электронных документов цифровая подпись заменяет множество элементов защиты из мира документов бумажных: водяные знаки, объёмная печать, специальные печатные материалы, чувствительные к ультрафиолетовому излучению, и т.д. и т.п.

В настоящее время электронная цифровая подпись реализуется с помощью криптографических систем с открытым ключом. Чуть выше мы уже говорили о различных видах шифров, и, если помните, были там такие шифры с асимметричным ключом. Система с открытым ключом использует именно такие виды криптографических алгоритмов. Открытость системы подразумевает, что ключ, которым зашифровывается сообщение, а также и само зашифрованное сообщение передаётся по открытому (т.е. незащищённому) каналу. Для генерации открытого ключа и для прочтения зашифрованного сообщения получатель использует секретный ключ. То есть, сначала получатель генерирует ключ, который разбивается на открытую и закрытую часть. Открытая часть ключа отправляется отправителю по незащищённому каналу, и отправитель с помощью открытого ключа шифрует сообщение. И, в конце концов, получатель с помощью закрытого ключа дешифрует сообщение. Задача защиты ключей от подмены решается с помощью сертификатов. Сертификат позволяет удостоверить помещённые в него данные о владельце и его открытый ключ подписью какого-либо доверенного лица. Имеется два вида систем сертификации ключей. В централизованных системах сертификатов (например, PKI) используются центры сертификации, поддерживаемые доверенными организациями. В децентрализованных системах (например, PGP) сертификат удостоверяется путём перекрёстного подписывания сертификатов знакомых и доверенных людей каждым пользователем - строится так называемая "сеть доверия".

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


Функции CryptoAPI

Однако вернёмся к нашему CryptoAPI. Можно долго говорить об общих положениях и схеме работы, но без конкретных функций здесь не обойтись. Поскольку справочный материал по каждой конкретной функции можно найти в Platform SDK, я не буду рассказывать здесь о них подробно. Расскажу лишь об основных группах функций и выполняемых ими задачах.

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

Вторая группа - функции хеширования и работы с сертификатами. Хеширование - это преобразование входного массива данных в короткое число фиксированной длины (которое называется хешем или хеш-кодом) таким образом, чтобы, с одной стороны, это число было значительно короче исходных данных, а с другой стороны, с большой вероятностью однозначно им соответствовало. Поскольку обычно документы, которые подписываются цифровой подписью, очень велики, подпись ставится на хеш этого документа. Что касается сертификатов, то CryptoAPI поддерживает сертификаты спецификации X.509, в которые входит информация о версии сертификата, его серийном номере, периоде действия, алгоритмах шифрования публичного ключа и др.

Отдельно стоит выделить функции для работы с сообщениями и функции обмена ключами. Это разные группы, но обе они небольшие. Под сообщениями в CryptoAPI понимаются данные в стандартизованном формате PKCS #7, разработанном RSA Laboratories. Функции для работы с ними делятся на две части: высокоуровневые функции (упрощенные) и низкоуровневые. О ключах в CryptoAPI можно говорить долго, но кратко всё выглядит так: CryptoAPI предоставляет функции для работы с сессионными (симметричными) и с открытыми ключами. При этом для большей безопасности все ключи управляются и используются при помощи неких идентификаторов, непосредственный доступ приложения к этим самым ключам отсутствует. Сессионные ключи называются так потому, что меняются от сессии к сессии, и криптопровайдер не сохраняет их никуда, кроме оперативной памяти. А вот открытые ключи и их закрытые части хранятся криптопровайдером в контейнерах ключей в зашифрованном виде. Для обмена обоими видами ключей используются функции CryptImportKey и CryptExportKey. Работа с асимметричными ключами позволяет прикладному приложению подключиться к какой-либо криптографической службе, запросить у нее хранилище пар ключей шифрования, передать открытый ключ приемной стороне, сгенерировать сессионный ключ, экспортировать сессионный ключ и передать приемной стороне, зашифровать данные и расшифровать на приемной стороне или же подписать данные. При этом вся "грязная" работа, которой, как видите, львиная доля, ложится на плечи криптопровайдера.


Стандартные криптопровайдеры

И всё же интересно узнать, что скрывается под такой абстракцией, как криптопровайдер, не так ли? Корпорация Microsoft предоставляет разработчикам и пользователям ряд криптопровайдеров собственного производства, которые идут вместе с системой и потому называются стандартными. Вот их список:

  • Microsoft Base Cryptographic Provider;
  • Microsoft Strong Cryptographic Provider;
  • Microsoft Enhanced Cryptographic Provider;
  • Microsoft AES Cryptographic Provider;
  • Microsoft DSS Cryptographic Provider;
  • Microsoft Base DSS and Diffie-Hellman Cryptographic Provider;
  • Microsoft DSS and Diffie-Hellman/Schannel Cryptographic Provider;
  • Microsoft RSA/Schannel Cryptographic Provider.

Список, конечно же, не сказать чтобы слишком велик, но не так уж и мал. Я, конечно, сейчас не рассказывал о самых известных и самых мощных криптографических алгоритмах, но, если поищете в Интернете, увидите, что Microsoft реализовала самые важные из них (например, те же RSA и AES). Ну и не следует забывать, что этот список содержит только стандартные криптопровайдеры. А на самом деле их гораздо больше.

Вадим СТАНКЕВИЧ

Версия для печатиВерсия для печати

Номер: 

29 за 2007 год

Рубрика: 

Software
Заметили ошибку? Выделите ее мышкой и нажмите Ctrl+Enter!

Комментарии

Страницы

Аватар пользователя mike
>Ошибка: всё наоборот.

Точно.

Аватар пользователя Вадим Станкевич
Сорри. Я, наверное, имел в виду вычисление подписи. А может и нет... Кто ж теперь разберёт? В любом случае, спасибо за замечание.

Алекс, если можно, поправьте, пожалуйста, в онлайновой версии статьи. Вместо

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

нужно

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

Аватар пользователя Инкогнито
да уж. а еще сколько возмущался раньше. лучше про аду писать - никто ж проверять не булет, так как никто не юзает и не знает. а вот с ключиками люди знакомы больше. гы.
Аватар пользователя SF
Инкогнито, а сам-то ты про криптоапи не написал! Вот тебе и гы.
Аватар пользователя Инкогнито
SF, а ты про все пишешь, знаток, понимаешь. теперь тебе - гы.
Аватар пользователя Андрей Ходотов
Я бы предложил в правки к онлайновой версии во избежание путаницы всё же уточнить, что имеются в виду именно ключи отправителя. (Возможный вариант фразы был выше: тот "Инкогнито" - я).

P.S. Кстати, об источниках. Один из возможных - логика: подпись - она потому и подпись, что ею владеет только автор. В применении к алгоритмам с ОК это может быть только личный (секретный) ключ автора.

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

Страницы