Pull to refresh

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);


Шифрование данных и расшифрование их на другом компьютере — тема отдельной статьи.
Спасибо за внимание.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.