- •Структура и основные положения CryptoApi
- •Криптографические провайдеры CryptoApi
- •Работа с ключами с помощью CryptoApi
- •Симметричное шифрование с помощью CryptoApi
- •Аутентификация сообщений
- •1. Шифрование хеш-значения симметричным методом
- •2. Хеширование с использованием секретного значения
- •Электронная цифровая подпись с помощью CryptoApi
- •3. Шифрование хеш-значения асимметричным методом
- •Вычисление хешей с помощью CryptoApi
Криптографические провайдеры 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, единственным значащим параметром которой является полученный ранее идентификатор криптографического контекста.
