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

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

Вкратце о Microsoft CryptoApi

Итак, 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);


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


0 комментариев

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.