- •114. Синтаксис команд OpenGl
- •119. Состав и назначение интегрированной среды визуальной разработки. Использование визуальных компонентов.
- •120. Списки и их использование в Прологе
- •121. Способы и устройства получения стереоизображений
- •122. Средства распределения данных субд Oracle
- •1. Удаленные dml-операции.
- •2. Синхронные удаленные вызовы процедур (rpc)
- •124. Стек протоколов tcp/ip
- •125. Структура общего решения линейного однородного дифференциального уравнения 2-го порядка
- •126. Css. Подключение таблиц стилей. Способы использования.
- •127. Структурная схема эвм и процессоров Intel
- •128. Структурный анализ потоков данных. Методология dfd.
- •129. Структуры данных, используемые в пролог программе
- •130. Сущность структурного подхода при проектировании больших систем
- •131. Схема распределения данных. Теория сравнений
- •132. Техническое задание на разработку программы (в соответствии с гост 19.201-79)
- •133. Технология Web Broker. Структура серверного Web-приложения
- •134. Технология постановки/проверки электронной цифровой подписи посредством CryptoAip
- •135. Технология шифрования/расшифрования посредством CryptoAip
- •137. Транзакции в многопользовательском режиме работы
- •138. Управление криптографическими ключами посредством CryptoAip
- •139. Управление криптопровайдерами посредством CryptoAip
- •140. Управление открытыми ключами (cертификаты, стандарт х.509, инфраструктуры систем с открытыми ключами)
- •141. Упрощённая модель компилятора. Функции лексического, синтаксического, семантического анализатора, генератора кода. Взаимодействие блоков компилятора. Проходы компилятора
- •142. Формула полной вероятности и формула Байеса
- •145. Функции двух переменных
- •146. Функции переноса, поворота и масштабирования и их параметры в OpenGl
- •Void glMatrixMode (gLenum mode)
- •Void glLoadMatrix[f d] (gLtype *m)
- •Void glPushMatrix (void)
- •Void glPopMatrix (void)
- •Void glMultMatrix[f d] (gLtype *m)
- •147. Функции. Параметры функций. Способы обмена информацией между функциями
- •149. Функциональный стек lamp
- •150. Цветовые схемы rgba и cmyk
- •151. Что такое операционная система (ос). Основные понятия, концепции ос: системные вызовы; Прерывания; Файлы; Процессы, потоки; Оболочка; Адресное пространство
- •152. Язык JavaScript. Назначение. Способ использования
138. Управление криптографическими ключами посредством CryptoAip
Генерация ключей.
В CryptoAPI имеются функции для генерации ключей любого типа. Функция CryptGenKey генерирует сессионные ключи и пары для обмена и подписи на основе случайного числа.
BOOL CRYPTFUNC CryptGenKey(
HCRYPTPROV hProv
ALG_IG Algid
DWORD dwFlags
HCRYPTKEY* phKey
)
Сессионные ключи можно сгенерировать также на основе некоторого заданного значения (пароля) при помощи функции CryptDeriveKey. Это стоит делать, например, в том случае, когда нужно избежать пересылки сессионного ключа вместе с зашифрованными данными (см. Рисунок 2). Получатель данных, зная пароль и алгоритм, может сам сгенерировать сессионный ключ и с его помощью расшифровать данные.
Получение дескриптора ключа. Дескриптор открытого ключа можно получить, вызвав функцию CryptGet-UserKey.
Экспорт ключей. Операция экспорта выполняется при сохранении сессионных ключей и при передаче ключей третьим лицам.
Двоичные данные ключа могут быть получены при помощи функции CryptExportKey:
BOOL CRYPTFUNC CryptExportKey (
HCRYPTKEY hKeyToExport
HCRYPTKEY hCryptKey
DWORD dwBlobType
DWORD dwFlags
BYTE* pbData, // указатель на буфер
DWORD* pdwDataLen ) // длина буфера
Поясним значения аргументов. Первый аргумент - дескриптор экспортируемого ключа. Второй аргумент - дескриптор ключа, которым шифруется экспортируемый ключ.
Открытые ключи экспортируются в незашифрованном виде. В этом случае hCryptKey = 0.
При экспорте сессионных и закрытых ключей необходимо их предварительно зашифровать. Аргумент hCryptKey должен содержать дескриптор открытого ключа получателя.
При вызове с аргументом pbData = NULL функция вернет необходимую длину буфера по адресу, на который указывает аргумент pdwDataLen (см. Листинг 3).
После успешного завершения переменная dwSessionKeyLen будет содержать действительную длину BLOB-структуры ключа. Это значение необходимо сохранить для обратной операции - импорта ключа в криптопровайдер.
Импорт ключей. Ключи импортируются функцией CryptImportKey:
CryptImportKey ( HCRYPTPROV hProv
BYTE* pbData
DWORD dwDataLen
HCRYPTKEY hCryptKey
DWORD dwFlags
HCRYPTKEY* phImportedKey )
hCryptKey = 0 в том случае, если импортируемый ключ был зашифрован асимметричным ключом или не был зашифрован вообще.
Если импортируемый ключ шифровали сессионным ключом, то hCryptKey должен содержать дескриптор этого ключа.
По окончании работы с ключом необходимо для его дескриптора вызвать функцию CryptDestroyKey(HCRYPTKEY hKey).
139. Управление криптопровайдерами посредством CryptoAip
Интерфейс CryptoAPI
В сфере защиты компьютерной информации криптография применяется в основном для: шифрования и дешифровки данных; а также создания и проверки цифровых подписей. (Прим. автора: в русскоязычной литературе применяется термин «ЭЦП» - электронно-цифровая подпись. В этой статье для краткости используется термин «цифровая подпись».)
Шифрование данных позволяет ограничить доступ к конфиденциальной информации, сделать ее нечитаемой и непонятной для посторонних. Применение цифровых подписей оставляет данные открытыми, но дает возможность верифицировать отправителя и проверять целостность полученных данных.
Для защиты информации специалистами Microsoft был разработан интерфейс CryptoAPI, который позволяет создавать приложения, использующие криптографические методы.
Структура CryptoAPI
В Crypto API существует понятие «криптопровайдер» (Cryptography Service Provider, CSP). Криптопровайдер - это независимый модуль, содержащий библиотеку криптографических функций со стандартизованным интерфейсом. Криптопровайдер отвечает за реализацию функций интерфейса, а также играет роль хранилища для ключей всех типов. Подобная архитектура позволяет переходить от одного провайдера к другому с минимальными изменениями исходного кода, так как интерфейс (т. е. сами функции) не меняется.
В операционную систему Windows включен криптопровайдер Microsoft RSA Base Provider.
Названия функций CryptoAPI имеют префикс Crypt. Как правило, все они возвращают результат типа BOOL - TRUE при успешном завершении и FALSE, если произошла ошибка. В последнем случае для получения сведений об ошибке необходимо вызвать GetLastError().
Прототипы функций описаны в файле wincrypt.h. Для использования этих функций в свойствах проекта нужно определить константу _WIN32_WINNT и задать ей значение 0x0400 (или больше). Данная константа применяется в файле wincrypt.h для проверки версии Windows.
Для некоторых функций CryptAPI также требуются библиотеки crypt32.lib и advapi32.lib.
Криптопровайдер
Прежде чем использовать какие-либо функции Crypto API, необходимо запустить криптопровайдер. Делается это с помощью функции CryptAc-quireContext:
BOOL CRYPTFUNC CryptAcquireContext(
HCRYPTPROV* hCryptProvider,//дескриптор
провайдера, out-параметр
LPCTSTR pszContainer, // имя
контейнера ключей
LPCTSTR pszProvider, // имя
провайдера
DWORD dwProvType, // тип
провайдера
DWORD dwFlags // флаги
)
Кроме инициализации криптопровайдера данную функцию можно использовать для создания и удаления контейнеров ключей. Для этого параметру dwFlags присваивается значение, соответственно, CRYPT_NEW-KEYSET и CRYPT_DELETEKEYSET.
Функция CryptAcquireContext работает в два этапа: сначала она ищет криптопровайдер по имени и типу, указанному в аргументах, а затем контейнер ключей с заданным именем.
По окончании работы с криптопровайдером необходимо вызвать функцию CryptReleaseContext (см. Листинг 1).
