Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lab1-theory.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
165 Кб
Скачать
☆

Криптографические провайдеры CryptoApi

 

Любой сеанс работы с CryptoAPI начинается с инициализации (получения контекста), выполняемой функцией CryptAcquireContext. В качестве параметров эта функция принимает имя контейнера ключей, имя криптопровайдера, его тип и флаги, определяющие тип и действия с контейнером ключей и режим работы криптопровайдера:

 

BOOL WINAPI CryptAcquireContext( HCRYPTPROV*phProv,//дескриптор провайдера LPCTSTRpszContainer,//имя контейнера ключей LPCTSTRpszProvider,//имя провайдера DWORDdwProvType,//тип провайдера DWORDdwFlags);//флаги

 

Существует около семи стандартных провайдеров, предустановленных в системе. Список установленных криптопровайдеров хранится в следующем разделе реестра:

HKLM\SOFTWARE\Microsoft\Cryptography\Defaults\Provider

и может быть получен с помощью функции CryptEnumProviders. Наиболее часто используются два стандартных криптопровайдера: Microsoft Base Cryptographic Provider (MS_DEF_PROV) и Microsoft Enhanced Cryptographic Provider (MS_ENHANCED_PROV). Следует заметить, что Enhanced-провайдер присутствует только на тех машинах, где установлена поддержка 128-битного шифрования (она автоматически устанавливается вместе с Internet Explorer 6.0).

Тип провайдера определяет множество поддерживаемых им криптоалгоритмов. Например, провайдер с типом PROV_RSA_FULL должен поддерживать алгоритмы DES и 3DES для симметричного шифрования, SHA1 и MD5 – для вычисления криптографического хеша и алгоритм RSA – для обмена ключами и постановки подписи.

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

Тип контейнера задается флагом при получении контекста. Для первоначального создания контейнера нужно вызвать CryptAcquireContext с флагом CRYPT_NEWKEYSET. Для удаления контейнера требуется указать флаг CRYPT_DELETEKEYSET. Если приложению не требуется доступа к контейнеру ключей (например, приложение вычисляет хеш MD5), то стоит вызывать CryptAcquireContext с флагом CRYPT_VERIFYCONTEXT, передавая NULL вместо имени контейнера. Инициализацию интерфейса CryptoAPI для последующего вычисления хеша MD5 демонстрирует следующий пример:

 

HCRYPTPROV hProv; if(!CryptAcquireContext(&hProv, NULL, MS_DEF_PROV, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT))  return 0; // ... CryptReleaseContext(hProv,0);

 

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

 

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]