Crypto API

Содержание
  1. Чтобы тайное не стало явным
  2. Структура CryptoAPI
  3. Криптографические ключи
  4. Хранение ключей
  5. Работа с CryptoAPI
  6. Криптопровайдер
  7. Работа с ключами
  8. Шифрование и дешифровка данных
  9. Цифровые подписи
  10. CryptoApi и Криптопровайдер VipNet CSP
  11. ViPNet CSP
  12. Совместимость
  13. Пример использования
  14. Использование Crypto API
  15. Строение и возможности Crypto API
  16. Криптопровайдеры
  17. КриптоПро | Использование КриптоПро CSP
  18. Использование КриптоПро CSP в ПО Microsoft
  19. Встраивание КриптоПро CSP в приложения
  20. Цели использования криптографических функций
  21. Использование CryptoAPI
  22. Базовые криптографические функции
  23. Функции кодирования/декодирования
  24. Функции работы со справочниками сертификатов
  25. Высокоуровневые функции обработки криптографических сообщений
  26. Низкоуровневые функции обработки криптографических сообщений
  27. Использование SSPI
  28. Инструментарий разработчика CAPICOM
  29. Инструментарий разработчика КриптоПро CSP SDK

Чтобы тайное не стало явным

Crypto API

20.09.2001 Виталий Ли

В сфере защиты компьютерной информации криптография применяется в основном для: шифрования и дешифровки данных; а также создания и проверки цифровых подписей. (Прим. автора: в русскоязычной литературе применяется термин «ЭЦП» — электронно-цифровая подпись. В этой статье для краткости используется термин «цифровая подпись».)

Шифрование данных позволяет ограничить доступ к конфиденциальной информации, сделать ее нечитаемой и непонятной для посторонних. Применение цифровых подписей оставляет данные открытыми, но дает возможность верифицировать отправителя и проверять целостность полученных данных.

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

Структура CryptoAPI

В Crypto API существует понятие «криптопровайдер» (Cryptography Service Provider, CSP). Криптопровайдер — это независимый модуль, содержащий библиотеку криптографических функций со стандартизованным интерфейсом.

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

е. сами функции) не меняется.

В операционную систему Windows включен криптопровайдер Microsoft RSA Base Provider.

Криптографические ключи

В CryptoAPI существуют ключи двух типов:

  • сессионные ключи (session keys
  • пары открытый/закрытый ключ (public/private key pairs).

Сессионные ключи. Это симметричные ключи, так как один и тот же ключ применяется и для шифрования, и для расшифровки. Сессионные ключи меняются. Алгоритмы, использующие сессионные ключи (так называемые симметричные алгоритмы), — RC2, RC4, DES. Microsoft RSA Base Provider работает с 40-разрядными сессионными ключами.

Пары ключей используются в так называемых асимметричных алгоритмах шифрования. Если шифрование выполнялось одним ключом из пары, то дешифровка производится другим. Открытые (public) ключи могут передаваться другим лицам для проверки цифровых подписей и шифрования пересылаемых данных. Длина открытого ключа в Microsoft RSA Base Provider составляет 512 разрядов.

Закрытые (private) ключи не могут быть экспортированы; они используются для создания цифровых подписей и дешифровки данных. Закрытый ключ должен быть известен только его владельцу.

Хранение ключей

Криптопровайдер отвечает за хранение и разрушение ключей. Программист не имеет доступа непосредственно к двоичным данным ключа, за исключением операций экспорта открытых ключей. Вся работа с ключами производится через дескрипторы (handle).

В CryptoAPI ключи для шифрования/дешифровки и создания/проверки подписей разделены. Называются они соответственно «пара для обмена ключами» и «пара для подписи».

База данных ключей состоит из контейнеров, в каждом из которых хранятся ключи, принадлежащие определенному пользователю. Контейнер ключей имеет уникальное имя и содержит пару для обмена и пару для подписи. Все ключи хранятся в защищенном виде.

По умолчанию для каждого пользователя создается контейнер с именем этого пользователя. Можно создавать дополнительные контейнеры и назначать им произвольные имена, которые обязательно должны быть уникальными (см. Рисунок 1).

Рисунок 1. База данных криптографических ключей.

Работа с CryptoAPI

Ниже приводятся примеры работы с некоторыми функциями CryptoAPI. Все примеры написаны на языке С++ в среде MS Visual C++ 6.0. Приведены прототипы наиболее интересных функций с пояснениями. Чтобы не перегружать читателя деталями, обработка ошибок в листинги не включена.

Названия функций 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).

Работа с ключами

Генерация ключей. В CryptoAPI имеются функции для генерации ключей любого типа. Функция CryptGenKey генерирует сессионные ключи и пары для обмена и подписи на основе случайного числа.

BOOL CRYPTFUNC CryptGenKey(HCRYPTPROV hProvALG_IG AlgidDWORD dwFlagsHCRYPTKEY* phKey)

Сессионные ключи можно сгенерировать также на основе некоторого заданного значения (пароля) при помощи функции CryptDeriveKey.

Это стоит делать, например, в том случае, когда нужно избежать пересылки сессионного ключа вместе с зашифрованными данными (см. Рисунок 2).

Получатель данных, зная пароль и алгоритм, может сам сгенерировать сессионный ключ и с его помощью расшифровать данные (см. Листинг 2).

Рисунок 2. Шифрование.

Получение дескриптора ключа. Дескриптор открытого ключа можно получить, вызвав функцию CryptGet-UserKey.

Экспорт ключей. Операция экспорта выполняется при сохранении сессионных ключей и при передаче ключей третьим лицам.

Двоичные данные ключа могут быть получены при помощи функции CryptExportKey:

BOOL CRYPTFUNC CryptExportKey (HCRYPTKEY hKeyToExportHCRYPTKEY hCryptKeyDWORD dwBlobTypeDWORD dwFlagsBYTE* pbData, // указатель на буферDWORD* pdwDataLen ) // длина буфера

Поясним значения аргументов. Первый аргумент — дескриптор экспортируемого ключа. Второй аргумент — дескриптор ключа, которым шифруется экспортируемый ключ.

Открытые ключи экспортируются в незашифрованном виде. В этом случае hCryptKey = 0.

При экспорте сессионных и закрытых ключей необходимо их предварительно зашифровать. Аргумент hCryptKey должен содержать дескриптор открытого ключа получателя.

При вызове с аргументом pbData = NULL функция вернет необходимую длину буфера по адресу, на который указывает аргумент pdwDataLen (см. Листинг 3).

После успешного завершения переменная dwSessionKeyLen будет содержать действительную длину BLOB-структуры ключа. Это значение необходимо сохранить для обратной операции — импорта ключа в криптопровайдер.

Импорт ключей. Ключи импортируются функцией CryptImportKey:

CryptImportKey ( HCRYPTPROV hProvBYTE* pbDataDWORD dwDataLenHCRYPTKEY hCryptKeyDWORD dwFlagsHCRYPTKEY* phImportedKey )

hCryptKey = 0 в том случае, если импортируемый ключ был зашифрован асимметричным ключом или не был зашифрован вообще.

Если импортируемый ключ шифровали сессионным ключом, то hCryptKey должен содержать дескриптор этого ключа.

https://www.youtube.com/watch?v=7Gdok1BPECw

По окончании работы с ключом необходимо для его дескриптора вызвать функцию CryptDestroyKey(HCRYPTKEY hKey).

Шифрование и дешифровка данных

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

Симметричный алгоритм менее надежен, но работает намного быстрее, чем асимметричный. Поэтому в CryptoAPI применяется комбинация алгоритмов.

Данные шифруются с помощью симметричного алгоритма с сессионным ключом, а сам сессионный ключ шифруется по асимметричному алгоритму открытым ключом получателя.

Дешифровка происходит в обратном порядке: сначала закрытым ключом получателя дешифруется сессионный ключ, затем этим сессионным ключом дешифруются сами данные (см. Рисунки 2 и 3).

Рисунок 3. Дешифровка.

Таким образом, расшифровать данные можно только, имея закрытый ключ из той же ключевой пары, что и открытый ключ, которым данные были зашифрованы.

Для шифрования и дешифровки применяется функция (см. Листинг 4).

BOOL CRYPTFUNC CryptEncrypt (HCRYPTKEY hKey, // дескриптор ключа для шифрованияHCRYPTHASH hHashBOOL bFinalBYTE* pbData, // параметр [in, outDWORD* pdwDataLen, // параметр [in, outDWORD dwBufferLen )

Последний и предпоследний параметры являются одновременно входными и выходными. Это означает, что зашифрованные данные записываются поверх исходных в буфер pbData, а длина данных, соответственно, в dwBufferLen.

Как и в случае с функцией Crypt-ExportKey, CryptEncrypt позволяет предварительно определить необходимый размер буфера под зашифрованные данные. Для этого нужно вызвать функцию с аргументами:

pbData = NULL;pdwDataLen = длина исходных данных.

Длину буфера функция вернет по адресу: pdwDataLen.

Дешифровка данных производится аналогично функцией CryptDecrypt.

Цифровые подписи

Цифровая подпись — это двоичные данные небольшого объема, обычно не более 256 байт. Цифровая подпись есть не что иное, как результат работы хеш-алгоритма над исходными данными, зашифрованный закрытым ключем отправителя. Проще говоря, берем исходные данные, получаем из них хеш и шифруем хеш своим закрытым ключом (с помощью асимметричного алгоритма).

Полученные в результате шифрования хеша двоичные данные и есть наша цифровая подпись (см. Рисунок 4).

Рисунок 4. Создание цифровой подписи.

Получатель, чтобы удостовериться, что данные присланы именно от нас и не были искажены, производит следующие операции:

  • получает хеш от данных (данные остались открытыми);
  • расшифровывает нашу цифровую подпись при помощи нашего открытого ключа;
  • сравнивает свой хеш и результат дешифровки. Если они эквивалентны, значит, данные были подписаны именно нами (ну, по крайней мере, нашим закрытым ключом, см. Рисунок 5).
Рисунок 5. Проверка цифровой подписи.

Подобный алгоритм позволяет любому лицу проверить подлинность подписи отправителя. Напомню, что открытый ключ отправителя, с помощью которого собственно и производится проверка, распространяется (как правило) свободно.

Для работы с цифровыми подписями используются функции CryptCreate-Hash, CryptHashData, CryptSignHash, CryptVerifySignature, CryptDestroy-Hash.

Создание цифровой подписи. Процесс создания подписи состоит из следующих этапов:

  • создание хеш-объекта функцией CryptCreateHash;
  • наполнение хеш-объекта данными (CryptHashData);
  • подписание хеша (CryptSignHash);
  • разрушение хеш-объекта (Crypt-DestroyHash).

Аналогично функциям CryptEncrypt, проверка длины буфера для подписи производится вызовом функции CryptSignHash с нулем вместо указателя на данные. Как и у функции CryptEncrypt, указатели на данные и их длину являются параметрами типа [in, out] (см. Листинг 5).

Проверка цифровой подписи. Проверка подписи (см. Листинг 6) выполняется так:

  • создается хеш-объект функцией CryptCreateHash;
  • хеш-объект наполняется данными (CryptHashData);
  • подпись расшифровывается и результат сравнивается со «своим» хешем (CryptVerifySignature);
  • хеш-объект разрушается (CryptDes-troyHash).

ВИТАЛИЙ ЛИ — разработчик ПО в компании «Киберплат.Ком». С ним можно связаться по адресу: vitaly1000@mail.ru.

Чтобы тайное не стало явным

Поделитесь материалом с коллегами и друзьями

Источник: https://www.osp.ru/winitpro/2001/05/174887

CryptoApi и Криптопровайдер VipNet CSP

Crypto API

На хабре довольно мало информации о Microsoft CryptoApi и нет упоминания о наших отечественных разработчиках, которые имеют лицензии в области шифрования информации, реализуют интерфейс CryptoApi и позволяют шифровать данные с использованием, например, ГОСТ 28147-89.

Так что, если возникла необходимость зашифровать и передать данные, и сделать это с использованием отечественных стандартов, то вовсе необязательно изобретать велосипед, а можно воспользоваться криптопровайдером VipNet CSP.

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

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

) полностью выведена из состава самого Crypto API и реализуется в отдельных, независимых динамических библиотеках – «криптопровайдерах» (Cryptographic Service Provider – CSP). Сам же Crypto API просто предъявляет определенные требования к набору функций (интерфейсу) криптопровайдера и предоставляет конечному пользователю интерфейс работы с CSP. Для использования всех функций криптопровайдера достаточно знать его строковое имя и номер типа.

ViPNet CSP

VipNet CSP – это программный комплекс, который реализует интерфейс Microsoft CryptoApi. ViPNet CSP обеспечивает выполнение следующих функций:

  • Генерация закрытых и открытых ключей ЭЦП и шифрования в соответствии с алгоритмом ГОСТ Р 34.10 – 2001.
  • Вычисление хеш-функции в соответствии с алгоритмом ГОСТ Р 34.11-94.
  • Вычисление и проверка ЭЦП в соответствии с алгоритмом ГОСТ Р 34.10-2001.
  • Выработка случайных и псевдослучайных чисел, сессионных ключей шифрования.
  • Шифрование и имитозащита данных в соответствии с алгоритмом ГОСТ 28147-89.
  • Аутентификация и шифрование при передаче данных по протоколам SSL/TLS.
  • Операции с сертификатами открытых ключей, соответствующих стандарту X.509 v3.

Совместимость

ViPNet CSP функционирует под управлением ОС Windows 2000 (32 бит)/XP (32 бит)/Server 2003 (32 бит)/Vista (32 бит) /Windows 7 (32/64 бит). К сожалению VipNet CSP – это платный продукт, но на сайте есть бета-версии, которые отлично функционируют.

Разобраться с криптопровайдером довольно легко, в скачиваемый пакет входит проработанная до мелочей документация, а также множество примеров кода. Скачать последнюю версию можно здесь.

Более подробно ознакомиться с описанным выше криптопровайдером можно здесь.

Пример использования

Итак, мы инсталлировали криптопровайдер, можем написать программу, шифрующую данные с использованием ГОСТ 28147-89. В скачиваемом пакете (архиве) есть папка «ViPNet CSP SDK (для разработчиков)», найдем там заголовочный файл importitccsp.h, в нем объявлены необходимые нам константы.

Смотрим пример:

HCRYPTPROV hProv; HCRYPTKEY hSessionKey; // Получение контекста криптопровайдера // VPN_DEF_PROV и VPN_PROV_TYPE — указывают на то, что мы используем ViPNet CSP if (!CryptAcquireContext(&hProv, NULL, VPN_DEF_PROV, VPN_PROV_TYPE, CRYPT_VERIFYCONTEXT)) { printf(«Error CryptAcquireContext»); return; } printf(«provider initialized»); // Генерация сессионного ключа // CPCSP_ENCRYPT_ID — используется ГОСТ 28147-89 if (!CryptGenKey(hProv, CPCSP_ENCRYPT_ID, CRYPT_ENCRYPT | CRYPT_DECRYPT, &hSessionKey)) { printf(«Error CryptGenKey»); return; } printf(«key generated»); // Данные для шифрования char data[]=»habrahabr»; DWORD count=strlen(data); // Шифрование данных if (!CryptEncrypt(hSessionKey, 0, true, 0, (BYTE*)data, &count, strlen(data))) { printf(«Error CryptEncrypt»); return; } printf(«encrypt done»); // Тестовый вывод на экран printf(«Encrypted string: %s», data); // Расшифровывание данных if(!CryptDecrypt(hSessionKey, 0, true, 0, (BYTE*)data, &count)) { printf(«Error CryptDecrypt»); return; } printf(«decrypt done»); // Тестовый вывод на экран printf(«Decrypted string: %s», data); // Освобождение контекста локальных переменных CryptDestroyKey(hSessionKey); CryptReleaseContext(hProv, 0);

Шифрование данных и расшифрование их на другом компьютере — тема отдельной статьи.

Спасибо за внимание.

CryptoApi, VipNet, CSP, шифрование, гост

Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.

Источник: https://habr.com/ru/sandbox/22763/

Использование Crypto API

Crypto API

    Сообщений 8    Оценка 165        Оценить  

Эта статья основана на моем личном опыте в деле написания программных продуктов криптографической направленности. Несмотря на данный, прежде всего коммерческий, опыт, здесь я постараюсь абстрагироваться от какого-то конкретного направления в Crypto API, и рассмотреть общий случай его применения.

Предполагается, что читатель знаком с некоторыми общими для криптографии понятиями: ключ шифрования, симметричные/ассиметричные алгоритмы шифрования, понятия протоколов шифрования и т.п. Также предполагается, что читатель имеет доступ к MSDN как можно более новой редакции.

Строение и возможности Crypto API

Прежде всего, постараемся описать круг задач, на решение которых ориентирован Crypto API:

  • надежное сокрытие данных;
  • возможность передачи сокрытых данных третьим лицам;
  • надежная система проверки достоверности пришедшей от третьих лиц информации;
  • расшифровывание полученных конфиденциальных данных;
  • работа с «идентификационными удостоверениями» третьих лиц;
  • обеспечение работы с признанными криптографическими стандартами;
  • возможность расширения и работы с пока еще неизвестными алгоритмами.

Сперва я постараюсь рассмотреть решение задачи расширения. В Crypto API эту задачу решили довольно элегантно. Реализация всех алгоритмов (шифрования, цифровой подписи и т.п.

) полностью выведена из состава самого Crypto API и реализуется в отдельных, независимых динамических библиотеках – «криптопровайдерах» (Cryptographic Service Provider – CSP).

Сам же Crypto API просто предъявляет определенные требования к набору функций (интерфейсу) криптопровайдера и предоставляет конечному пользователю унифицированный интерфейс работы с CSP. Конечному пользователю для полноценного использования всех функций криптопровайдера достаточно знать его строковое имя и номер типа.

Кроме задачи расширения одной из основных задач Crypto API является возможность однозначной идентификации передающей/принимающей стороны в протоколе передачи данных. Общепризнанным решением в данном вопросе является использование механизма сертификатов.

Сертификаты как бы стали «цифровыми паспортами», несущими информацию о своих владельцах. Полный рассказ о данном механизме последует несколько позже, а сейчас стоит упомянуть, что Crypto API также полно реализует весь спектр функций работы с ним.

Большинство функций Crypto API, работающих с передаваемыми данными, так или иначе, используют сертификаты в своей работе.

В программных решениях рано или поздно встает вопрос стандартизации передаваемых между приложениями данных. В сфере криптографии для решения данного вопроса уже давно и успешно применяет набор стандартов «PKCS», предложенный компанией RSA Security. В данном комплекте стандартов учитываются все возможные случаи, возникающие в криптографических приложениях.

Предусмотрены стандарты для обмена сертификатами, зашифрованными и подписанными данными и многое другое.

Crypto API, как основная библиотека для обеспечения работы с криптографическими данными в Windows, также достаточно полно поддерживает данный комплект стандартов и позволяет формировать криптографические приложения, которые могут быть обработаны в дальнейшем любыми программными продуктами.

Таким образом, мы можем разделить весь интерфейс Crypto API на 5 функциональных групп:

1. Базовые криптографические функции:

  • функции шифрования/расшифровывания данных;
  • функции хеширования и получения цифровой подписи данных;
  • функции инициализации криптопровайдера и работы с полученным контекстом;
  • функции генерации ключей;
  • функции обмена ключами.

2. Функции кодирования/декодирования. Под кодированием в данном случае подразумевается получение на выходе информации, кодированной в формате ASN.1 (Abstract Syntax Notation One).

3. Функции работы с сертификатами.

4. Высокоуровневые функции обработки криптографических сообщений.

5. Низкоуровневые функции обработки криптографических сообщений.

Криптопровайдеры

Криптопровайдером называют независимый модуль, обеспечивающий непосредственную работу с криптографическими алгоритмами. Каждый криптопровайдер должен обеспечивать:

  • реализацию стандартного интерфейса криптопровайдера;
  • работу с ключами шифрования, предназначенными для обеспечения работы алгоритмов, специфичных для данного криптопровайдера;
  • невозможность вмешательства третьих лиц в схему работы алгоритмов.

Как уже говорилось выше, сами криптопровайдеры реализуются в виде динамически загружаемых библиотек (DLL).

Таким образом, достаточно трудно повлиять на ход алгоритма, реализованного в криптопровайдере, поскольку компоненты криптосистемы Windows (все) должны иметь цифровую подпись (то есть подписывается и DLL криптопровайдера).

У криптопровайдеров должны отсутствовать возможности изменения алгоритма через установку его параметров. Таким образом решается задача обеспечения целостности алгоритмов криптопровайдера. Задача обеспечения целостности ключей шифрования решается с использованием контейнера ключей, о котором рассказывается ниже.

Функции работы c криптопровайдерами можно разделить на следующие группы:

  • функции инициализации контекста и получения параметров криптопровайдера;
  • функции генерации ключей и работы с ними;
  • функции шифрования/расшифровывания данных;
  • Функции хеширования и получения цифровой подписи данных.

В группу функций инициализации контекста входят следующие функции:

  • CryptAcquireContext. С помощью данной функции в первую очередь производится инициализация контекста криптопровайдера (получение ссылки на HANDLE, которую в дальнейшем можно использовать в других функциях). Также с помощью последнего параметра данной функции можно создать или удалить контейнер ключей.
  • CryptContextAddRef. Данная функция служит для увеличения внутреннего счетчика ссылок криптопровайдера. Эту функцию рекомендуется использовать при передаче контекста криптопровайдера в качестве члена различных структур, передаваемых функциям.
  • CryptReleaseContext. Данная функция предназначена для освобождения контекста криптопровайдера, полученного с помощью функции CryptAcquireContext. Фактически, производится только уменьшение внутреннего счетчика ссылок криптопровайдера (нечто вроде механизма подсчета ссылок у COM-объекта). Когда внутренний счетчик ссылок становится равным нулю, данный контекст криптопровайдера полностью освобождается и не может быть более нигде использован.
  • CryptGetProvParam. С помощью этой функции можно получить значение различных параметров криптопровайдера. Нужно сказать, что для всех криптопровайдеров стандартом определен лишь ограниченный набор параметров. Набор параметров криптопровайдера может сильно варьироваться в зависимости от реализации криптопровайдера.

В группу генерации и работы с ключами входят следующие функции:

  • CryptGenKey. Данная функция предназначена для генерации сессионного ключа (ключ, используемый только в течение текущей сессии работы), а также для генерации пар ключей для обмена (публичный и закрытый ключ) и цифровой подписи.
  • CryptDuplicateKey. Функция предназначена для копирования ключа.
  • CryptGetUserKey. Функция предназначена для получения значения публичного ключа для указанного контейнера ключей. Используется для получения значений публичных ключей, предназначенных для обмена ключами и цифровой подписи.
  • CryptDestroyKey. Функция предназначена для освобождения ранее полученного хэндла ключа. Функцию следует вызывать всегда для предотвращения утечек памяти в приложении.
  • CryptGetKeyParam. Функция предназначена для получения различных параметров ключа. В качестве параметров используются алгоритм ключа (его цифровой обозначение в системе), флаги разрешения использования ключа (например, если отсутствует установленный флаг ключа CRYPY_ENCYPT, данным ключом невозможно будет зашифровать данные), данные о длине блока ключа и многое другое. В практических реализациях данной функции следует уделять достаточно большое внимание, так как зачастую именно от параметров ключа зависит работа используемого алгоритма криптопровайдера.
  • CryptSetKeyParam. Функция, обратная предыдущей. Используется для установки параметров ключа.
  • CryptDeriveKey. Функция предназначена для генерации сессионного ключа на основе хеша данных. То есть данная функция генерирует один и тот же сессионный ключ, если ей передаются одинаковые значения хеша данных. Функция полезна в случае генерации сессионного ключа на основе пароля.
  • CryptGenRandom. Функция используется для заполнения переданного ей буфера случайными данными. Используется, например, для генерации нового имени контейнера ключей.
  • CryptExportKey. Функция экспорта ключа для его передачи по каналам информации. Возможны различные варианты передачи ключа, включая передачу публичного ключа пары ключей, а также передачу секретного или сессионного ключа.
  • CryptImportKey. Функция, обратная предыдущей. Предназначена для получения из каналов информации значения ключа.

В группу функций шифрования/расшифровывания данных входят:

  • CryptEncrypt. Основная базовая функция шифрования данных. В качестве параметров использует ранее полученные контексты криптопровайдера и сессионного ключа. Данные, генерируемые на выходе этой функции, не являются форматированными и не содержат никакой другой информации, помимо шифрованного контента (в отличие от, скажем, стандарта PKCS #7, использующего совместную передачу кодированных данных и экспортированного сессионного ключа).
  • CryptDecrypt. Основная базовая функция расшифровывания данных. В качестве параметров используются ранее полученные контекст криптопровайдера и хэндл сессионного ключа.

В группу функций хеширования и получения цифровой подписи входят:

  • CryptCreateHash. Функция создающая хеш-объект, предназначенный для генерации хеш-значения данных. В качестве основных параметров принимает ранее полученные контекст криптопровайдера и алгоритм формирования хеша данных.
  • CryptHashData. Основная функция хеширования данных. Самым важным параметром этой функции является ссылка на хешируемые данные.
  • CryptGetHashParam. Функция используется в основном для получения значения сформированного хеша данных. Функция CryptGetHashParam завершает процедуру создания хеш-значения, и дальнейшие вызовы функции CryptHashData будут возвращать ошибку.
  • CryptSetHashParam. Функция используется для установки параметров хеша. Может быть использована, скажем, для изменения алгоритма формирования хеша.
  • CryptDestroyHash. Функция используется для освобождения хеш-объекта.
  • CryptDuplicateHash. Функция получения копии хеша. Используется при передаче хеша между функциями.
  • CryptSignHash. Основная базовая функция получения цифровой подписи данных. Нужно отметить, что в Crypto API для уменьшения длины цифровой подписи (и ускорения работы ассиметричных алгоритмов, используемых для формирования цифровой подписи) в качестве входных данных используют хеш. Функций, использующих для получения цифровой подписи сами данные, в Crypto API нет.
  • CryptVerifySignature. Основная базовая функция проверки цифровой подписи. В качестве входных данных опять-таки используется значение хеша.

В Crypto API криптопровайдеры принято группировать по их названиям (строковые величины), а также по номерам их типов.

Тип криптопровайдера, в общем случае, ничего не сигнализирует обычному пользователю и служит лишь для вспомогательной группировки провайдеров.

Исключение составляет тип PROV_RSA_FULL (его номер – 1), который присваивают себе только те криптопровайдеры, которые полностью поддерживают работу со стандартом RSA.

Сначала получим полный перечень строковых имен криптопровайдеров. Наиболее простым способом для этого является использование функции CryptEnumProviders:

DWORD dwIndex=0; DWORD dwType; DWORD cbName; LPTSTR pszName; while (CryptEnumProviders(dwIndex, NULL, 0, &dwType, NULL, &cbName)) { if (!cbName) break; if (!(pszName = (LPTSTR)LocalAlloc(LMEM_ZEROINIT, cbName))) return; if (!CryptEnumProviders(dwIndex++, NULL, 0, &dwType, pszName, &cbName)) { Error(«CryptEnumProviders»); return; } std::cout

Источник: https://www.rsdn.org/article/crypto/usingcryptoapi.xml

КриптоПро | Использование КриптоПро CSP

Crypto API

Использование КриптоПро CSP позволяет решить сразу несколько задач:

  • для корпоративных пользователей — это возможность использовать стандартные и повсеместно используемые приложения компании Microsoft с надежной российской криптографией;
  • для системных интеграторов — это возможность создания новых, надежно защищенных приложений с использованием богатейшего и проверенного временем инструментария разработки компании Microsoft.

Использование КриптоПро CSP в ПО Microsoft

К стандартным приложениям, которые теперь могут использовать российские алгоритмы электронной цифровой подписи и шифрования, относятся:

  • Microsoft XML версии 5.0 (Microsoft Office 2003 и Microsoft XML Viewer) и версии 6.0 (Microsoft Visual Studio 2005);
  • Microsoft Certification Authority, входящее в состав ОС Windows Server 2000/2003/2008/2008R2 (см. особенности установки);
  • Microsoft Outlook Express, входящее в состав Internet Explorer версии 5.0 и выше;
  • Microsoft Outlook, входящее в состав MS Office 2000/XP/2003/2007/2010/2013 (при формировании сообщений в формате S/MIME). При использовании ПО Microsoft Outlook 2000 рекомендуем установить Набор исправлений Office 2000 SR-1a, который позволяет корректно обрабатывать кодировки KOI8 и Win1251 в подписанных сообщениях;
  • Microsoft Word/Excel, входящее в состав MS Office 2003/2007 (при формировании ЭЦП документов);
  • Средства формирования и проверки ЭЦП программного обеспечения, распространяемого по сети (Microsoft Authenticode);
  • Защита соединений в Интернете (TLS для HTTPS) от клиентов (Internet Explorer 5.0 и выше, КриптоПро Fox) до веб-серверов (Microsoft IIS, Apache, Tomcat);
  • Защита почтовых соединений (TLS для IMAPS/POP3S/SMTPS) в Microsoft Exchange и Microsoft Outlook;
  • Защита соединений удалённого администрирования при использовании Microsoft Terminal Server или серверов и клиентов Citrix;

Встраивание КриптоПро CSP в приложения

Для встраивания КриптоПро CSP в разрабатываемые приложения следует использовать функции Microsoft CryptoAPI, SSPI, CAPICOM, а так же КриптоПро ЭЦП Browser plug-in. Ниже приведено краткое описание этих интерфейсов. Более подробное описание можно найти в программной документации MSDN (Microsoft Developer Network).

Цели использования криптографических функций

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

В общем случае создание защищенной автоматизированной системы — это в каждом конкретном случае процесс индивидуальный, поскольку не бывает абсолютно одинаковых систем, а бывают лишь типовые решения, реализующие те или иные функции по защите информации.

В первую очередь при создании защищенной автоматизированной системы необходимо определить модель угроз и политику безопасности проектируемой системы.

Впоследствии, исходя из этого, можно определить тот набор криптографических функций и организационно-технических мер, реализуемых в создаваемой системе.

Ниже приведен основной перечень функций защиты информации, реализуемый при помощи криптографических функций библиотек СКЗИ.

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

Использование CryptoAPI

Использование CryptoAPI в ОС Windows/Solaris/Linux/FreeBSD преследует две главные цели:

  • Дать прикладному уровню доступ к криптографическим функциям для генерации ключей, формирования/проверки электронной цифровой подписи, шифрования/расшифрования данных. Эта цель была достигнута путем изолирования прикладного уровня от уровня реализаций криптографических функций. Приложениям и прикладным программистам не нужно детально изучать особенности реализации того или иного алгоритма или изменять код в зависимости от алгоритма.
  • Изолирование прикладного уровня от криптографических функций позволяет одновременно использовать разные алгоритмы и различные реализации этих алгоритмов, включая аппаратные.

На рисунке ниже приведена общая архитектура криптографических функций.

Общая архитектура CryptoAPI состоит из пяти основных функциональных групп:

Базовые криптографические функции

  • Функции инициализации (работы с контекстом). Эти функции предоставляют приложению возможность выбрать определенный криптопровайдер по типу имени или по требуемой функциональности.
  • Функции генерации ключей.

    Эти функции предназначены для формирования и хранения криптографических ключей различных типов.

  • Функции обмена ключами.

    Эти функции предназначены для того чтобы приложения могли обмениваться различными типами ключевой информации для обеспечения взаимодействия между собой.

Функции кодирования/декодирования

Данные функции предназначены для преобразование (кодирования) из внутреннего представления объектов, используемых в CryptoAPI, во внешнее представление и обратно. В качестве внешнего представления объектов используется формат ASN.1 (Abstracy Syntax Notation One), определенный серией рекомендаций X.680.

К этой же группе функций можно отнести набор функций, позволяющих расширить функциональность CryptoAPI, путем реализации и регистрации собственных типов объектов.

Функции работы со справочниками сертификатов

Эта группа функций предназначена для хранения и обработки сертификатов в различных типах справочников. Причем в качестве справочника могут использоваться самые различные типы хранилищ: от простого файла до LDAP.

Высокоуровневые функции обработки криптографических сообщений

Именно эта группа функций (Simplified Message Functions) в первую очередь предназначена для использования в прикладном ПО. С помощью этих функций можно:

  • Зашифровать/расшифровать сообщение от одного пользователя к другому.
  • Подписать данные.
  • Проверить подпись данных.

Эти функции (так же как и функции низкого уровня) оперируют сертификатами открытых ключей X.509 для адресации отправителя/получателя данных. В качестве формата данных, формируемых функциями, используется формат PKCS#7 (RFC2315) или CMS (RFC2630) в Windows.

Низкоуровневые функции обработки криптографических сообщений

Данная группа функция (Low Level Message Functions) предназначена для аналогичных целей, что и группа высокоуровневых функций, но обладает большей функциональностью. Вместе с тем большая функциональность потребует от прикладного программиста более детальных знаний в области прикладной криптографии.

Использование SSPI

Использование SSPI в ОС Windows/Solaris/Linux/FreeBSD преследует две главные цели:

  • Дать прикладному уровню доступ к криптографическим функциям аутентификации сторон сетевых соединений, а так же обеспечение конфиденциальности и имитозащиты данных передаваемых по этим соединениям. Эта цель была достигнута путем изолирования прикладного уровня от уровня реализаций криптографических функций. Приложениям и прикладным программистам не нужно детально изучать особенности реализации того или иного алгоритма или изменять код в зависимости от алгоритма.
  • Изолирование прикладного уровня от криптографических функций позволяет одновременно использовать разные алгоритмы и различные реализации этих алгоритмов, включая аппаратные.

Инструментарий разработчика CAPICOM

CAPICOM предоставляет COM-интерфейс, использующий основные функции CryptoAPI. Этот компонент является добавлением к уже существующему COM интерфейсу Certificate Enrollment Control (xenroll), который реализуют клиентские функции генерации ключей, запросов на сертификаты и обмена с центром сертификации.

С выпуском данного компонента стало возможным использование функций формирования и проверки электронной цифровой подписи, построения и проверки цепочек сертификатов, взаимодействия с различными справочниками сертификатов (включая Active Directory) с использованием Visual Basic, C++, JavaScript, VBScript и среды разработки Delphi.

Загрузить дистрибутив и примеры использования CAPICOM можно непосредственно с сайта Microsoft.

Подробную информацию о CAPICOM смотрите на сайте Microsoft в следующих разделах:

  • CAPICOM Versions;
  • Using CAPICOM;
  • CAPICOM Reference.

Инструментарий разработчика КриптоПро CSP SDK

КриптоПро CSP может использоваться для встраивания в прикладное программное путем непосредственного вызова функций КриптоПро CSP после загрузки модуля с использованием функции LoadLibrary.

Для этих целей в комплект поставки включается Руководство программиста (csp_2_0.chm, tls_2_0.chm для версии 2.0, CSP_3_0.chm, SSPI_3_0.chm, CAPILite_3_0.chm для версии 3.0), описывающее состав функций и тестовое ПО (sample2_0.zip для версии 2.0 и SDK для версии 3.0).

Руководство программиста и тестовое ПО для версии 3.6 доступны на странице загрузки.

Онлайн-версия руководства программиста для версии 3.6 также доступна на нашем сайте:

  • КриптоПро CSP;
  • КриптоПро SSPI;
  • КриптоПро CAPILite.

Тестовое ПО разработано с использованием компиляторов Microsoft Visual C++ (версия 2.0) и Microsoft Visual Studio .NET (для 3.0).

Для компиляции программ, входящих в тестовое ПО, дополнительно необходимы include файлы и библиотеки, входящие в Microsoft Windows Platform SDK.

В состав тестов входят примеры использования различных криптопровайдеров, входящих в состав Windows, для формирования/проверки электронной цифровой подписи, шифрования/расшифрования сообщений, создания и проверки сертификатов и другие примеры. Примеры используют функции CryptoAPI, подробное описание которых можно получить в MSDN, а также позволяют вызывать функции криптопровайдеров непосредственно на низком уровне.

Вы также можете получить уже скомпилированную тестовую программу csptest2_0.exe для версии 2.0 или SDK для версий 3.0 и выше.

Источник: https://www.cryptopro.ru/products/csp/usage

Все термины
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: