МАКСИМ СМИРНОВ,
Опубликовано: 22.2.2000
Архитектура Crypto API/CSP
Порядок взаимодействия приложений с криптографическими модулями операционной системы регламентирует документ, который называется Microsoft Cryptographic Application Programming Interface (MS Crypto API). Функции, описанные в нем, поддерживаются Windows 95/98, Windows NT и Windows 2000. В последней ОС функции Crypto API содержатся в модулях crypt32.dll и advapi32.dll. На самом деле эти модули не реализуют криптографические алгоритмы, а обращаются к другим модулям, называемым Cryptographic Service Providers (CSP). Одновременно в операционной системе можно установить несколько CSP. При первом обращении к Crypto API прикладная программа выбирает, с каким именно модулем CSP она будет работать, в зависимости от того, какие криптографические алгоритмы ей необходимы (см. рис. 1).
Не оспаривая преимущества такой архитектуры, следует обратить внимание на три тонких момента.
Во-первых, вы не сумеете просто так встроить в Windows разработанный вами CSP: чтобы этот модуль работал, его необходимо заверить цифровой подписью Microsoft [1].
Во-вторых, даже если вы получите лицензию и встроите свой CSP в Windows, прикладные программы сторонних разработчиков не обязаны использовать именно ваш CSP. Вы не обнаружите, например в Outlook Express, кнопку, позволяющую выбрать CSP для шифрования сообщения электронной почты. Outlook Express будет использовать только тот CSP, который в полном объеме реализует алгоритмы, рекомендуемые открытыми Internet-стандартами защиты электронной почты S/MIME. Конечно же, можно написать свою программу отправки e-mail-сообщений, которая будет вызывать ваш CSP, но сможете ли вы убедить пользователя работать именно с вашей программой?
В-третьих, непременным условием надежной защиты является использование CSP, реализующих стойкие, а не ослабленные криптоалгоритмы, поставляемые в связи с существовавшими до недавнего времени экспортными ограничениями. Во всем остальном крипторешения Microsoft являются вполне надежным и эффективным средством, предоставляющим прикладным программам все необходимые функции по криптографической обработке данных. Итак, какие же задачи можно решить при помощи предлагаемых средств?
Функциональность CRYPTO API
Целью Crypto API является предоставить разработчику программ универсальный способ для использования криптографических модулей, поэтому интерфейс не ограничен какими-либо конкретными алгоритмами. Модули Crypto API не содержат функций, позволяющих зашифровать текст, например, с использованием именно алгоритма DES. Выбор конкретного алгоритма задается параметрами функции и зависит от используемого CSP, а универсальный набор функций определен для каждого типа криптографических операций, основные из которых перечислены ниже.
Шифрование и расшифровка данных. Crypto API позволяет шифровать данные, размещенные в оперативной памяти в виде последовательности байтов. Для шифрования могут быть использованы как симметричные, так и асимметричные алгоритмы. В первом случае для шифрования и расшифровки [2] используются одинаковые ключи, во втором - разные. Ключ шифрования данных может быть известен многим (поэтому его обычно называют открытым ключом, public key), а ключ для расшифровки известен только одному лицу (личный, или закрытый, ключ, private key). Асимметричные алгоритмы используются для обмена сеансовыми ключами. Зашифровав сообщение электронной почты симметричным алгоритмом, вы добавляете к зашифрованному сообщению сам сеансовый ключ, зашифрованный на открытом ключе получателя с использованием асимметричного алгоритма. Это позволяет вам уничтожить сеансовый ключ сразу же после шифрования сообщения. Даже если ваш компьютер подвергнется взлому, злоумышленник все равно не узнает содержание сообщения. (Конечно же, если вы не оставили себе незашифрованную копию.)
Выработка и проверка цифровой подписи, хэширование. Основными криптографическими механизмами контроля целостности данных, проверки подлинности источника данных и предотвращения отречений от получения сообщения (non-repudiation) являются хэширование и цифровая подпись. Crypto API включает функции для последовательного хэширования одного или нескольких блоков данных произвольной длины, размещенных в оперативной памяти. Полученные значения используются функциями выработки и проверки цифровой подписи.
Аутентификация. Аутентификация является важным средством обеспечения безопасности при взаимодействии через незащищенные сети. Суть аутентификации состоит в том, что вы требуете от другого участника взаимодействия определенных доказательств того, что он действительно является тем, за кого себя выдает. Вы должны быть абсолютно уверены, что запущенное вами приложение обменивается данными именно с тем сервером сети, с которым необходимо. Такая уверенность может быть достигнута только при использовании цифровых сертификатов (цифровых удостоверений) и соответствующих сетевых протоколов, базирующихся на криптографических методах. Цифровой сертификат является набором данных, который объединяет название организации или имя частного лица и его открытый ключ. Сертификаты формируются надежной организацией, называемой Certificate authority (орган сертификации, издательство сертификатов), только после того, как она проверит соответствие указанного в сертификате имени и открытого ключа. Чтобы избежать подделки, сертификаты заверяются цифровой подписью издателя сертификатов. Начиная с версии 2.0, Crypto API предоставляет набор функций для работы с цифровыми сертификатами и списками отозванных сертификатов (certificate revocation lists).
Кодирование и декодирование данных. Международные стандарты на формат зашифрованных или заверенных цифровой подписью сообщений электронной почты, формат цифровых сертификатов и ряд других объектов разработаны в абстрактной форме с использованием языка Abstract Syntax Notation One (ASN.1). Так, документ CCITT X.509, определяющий формат цифрового сертификата, описывает назначение и типы полей, которые должен включать сертификат, но не детализирует способ представления конкретных значений. Другие рекомендации определяют порядок представления сертификатов в двоичной или какой-либо другой форме, например, для передачи по электронной почте используется представление сертификатов в кодировке base64, не содержащей неотображаемых символов. Кроме того, абстрактное задание формата позволяет легко его расширять, не нарушая совместимость с предыдущими версиями программ. Crypto API содержит функции для работы с данными в форме ASN.1, преобразования таких данных в "родные" для Windows байтовые последовательности и обратного преобразования.
Выработка и хранение криптографических ключей. Защищенность ключей является обязательным условием использования криптографических средств. Функции выработки и хранения ключей возлагаются на CSP. Различные CPS реализуют различные меры безопасности при хранении ключей, например разграничение доступа к ключам средствами операционной системы, дополнительное шифрование ключа на пароле и пр. С Windows 2000 поставляются специальные CSP, которые позволяют хранить ключи на пластиковых картах.
Кроме того, стойкость зашифрованных данных зависит не только от алгоритма шифрования, но и от того, насколько случайно выбран ключ. Выработка действительно случайных ключей является большой проблемой. Для всех используемых ключей Crypto API предусматривает специальные функции экспорта и импорта, тем самым давая разработчику прикладной программы возможность расширять средства выработки ключей, предлагаемые CSP.
Что умеет CSP
Эффективность криптозащиты зависит не только от использования определенных механизмов (криптопротоколов), таких как шифрование или цифровая подпись, но и от выбора конкретных алгоритмов (криптопримитивов), реализуемых конкретным CSP. Список всех CSP (криптопровайдеров), установленных в Windows 2000, можно получить в разделе HKEY_LOCAL_MACHINE\SOFTWARE\ Microsoft\Cryptography\Defaults\Provider системного реестра Windows. Репертуары примитивов, реализуемых некоторыми CSP, приведены в таблице, и можно видеть, чем Base CSP, который до недавнего времени только и можно было экспортировать, отличается от полнофункционального Enhanced CSP, который поставлялся лишь "своим".
Большинство сетевых протоколов требует использования конкретных криптоалгоритмов. Для того чтобы прикладные программы соответствовали общепринятым стандартам, Crypto API вводит специальные типы CSP, например PROV_RSA_FULL или PROV_RSA_SCHANNEL. Криптопровайдер указанного типа должен реализовывать все криптоалгоритмы, определенные соответствующим стандартом. Так, к примеру, PROV_RSA_SCHANNEL используется для реализации протокола SSL и должен поддерживать алгоритм RSA для цифровой подписи и обмена ключами, алгоритмы хэширования SHA и MD5 и специальную функцию CALG_SSL3_SHAMD5.
Алгоритмы, реализуемые Microsoft Base CSP и Microsoft Enhanced CSP.
| Алгоритм | Тип алгоритма | Длина ключа (для хэш-функции - размер блока) |
| Microsoft Base Cryptographic Provider v.1.0 | ||
| RC2 | Шифрование (encrypt) | 40 |
| RC4 | Шифрование (encrypt) | 40 |
| DES | Шифрование (encrypt) | 56 |
| SHA-1 | Хэширование (hash) | 160 |
| MD2 | Хэширование (hash) | 128 |
| MD4 | Хэширование (hash) | 128 |
| MD5 | Хэширование (hash) | 128 |
| SSL3 SHAMD5 | Хэширование (hash) | 288 |
| MAC | Хэширование (hash) | 64 |
| RSA_SIGN | Цифровая подпись (signature) | 512 |
| RSA_KEYX | Шифрование сеансового ключа (exchange) | 512 |
| HMAC | Хэширование (hash) | 0 |
| Microsoft Enchanced Cryptographic Provider v.1.0 | ||
| RC2 | Шифрование (encrypt) | 128 |
| RC4 | Шифрование (encrypt) | 128 |
| DES | Шифрование (encrypt) | 56 |
| 3DES TWO KEY | Шифрование (encrypt) | 112 |
| 3DES | Шифрование (encrypt) | 168 |
| SHA-1 | Хэширование (hash) | 160 |
| MD2 | Хэширование (hash) | 128 |
| MD4 | Хэширование (hash) | 128 |
| MD5 | Хэширование (hash) | 128 |
| SSL3 SHAMD5 | Хэширование (hash) | 288 |
| MAC | Хэширование (hash) | 64 |
| RSA_SIGN | Цифровая подпись (signature) | 1024 |
| RSA_KEYX | Шифрование сеансового ключа (exchange) | 1024 |
| HMAC | Хэширование (hash) | 0 |
