Секреты разработки csp для windows создание криптографического провайдера для windows


Содержание

Секреты разработки csp для windows создание криптографического провайдера для windows

Использование КриптоПро 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 в следующих разделах:

Инструментарий разработчика КриптоПро 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 также доступна на нашем сайте:

Тестовое ПО разработано с использованием компиляторов 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 и выше.

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

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

Интерфейс CryptoAPI

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

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

Для защиты информации специалистами 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:

Кроме инициализации криптопровайдера данную функцию можно использовать для создания и удаления контейнеров ключей. Для этого параметру dwFlags присваивается значение, соответственно, CRYPT_NEW-KEYSET и CRYPT_DELETEKEYSET.

Функция CryptAcquireContext работает в два этапа: сначала она ищет криптопровайдер по имени и типу, указанному в аргументах, а затем контейнер ключей с заданным именем.

По окончании работы с криптопровайдером необходимо вызвать функцию CryptReleaseContext (см. Листинг 1).

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Илон Маск рекомендует:  Что такое код ociexecute

Полученные в результате шифрования хеша двоичные данные и есть наша цифровая подпись (см. Рисунок 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.

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

Как установить КриптоПро: пошаговая инструкция

Как используют программу

Разработчик на сайте указывает, что такое КриптоПро — так называют средство криптографической защиты информации (СКЗИ). Эта программа защищает информацию через шифрование и создание электронных подписей (ЭП). Эти сертификаты подтверждают значимость и статус электронных документов при работе:

  • с электронными площадками;
  • электронной отчетностью;
  • клиент-банками;
  • при обмене между пользователями в сети.

Криптографическая защита основана на исполнении нацстандартов в этой области:

  1. ГОСТ Р 34.10-2012 (взамен 34.10-2001) об ЭЦП.
  2. ГОСТ Р 34.11-2012 (сменил 34.11-94) о кэшировании.
  3. ГОСТ 28147-89 об алгоритме криптопреобразования.


Компания ввела в действие программные модули CryptoPro Cryptographic Service Provider (CSP), которые совместимы с интерфейсом Microsoft. На форуме разработчика указано, что бесплатно установить КриптоПро CSP можно, если не выполняете операции с закрытыми ключи, например:

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

Получается, что бесплатно установить СКЗИ КриптоПро — это означает не вводить серийный номер.

Сервис сертификата электронной подписи

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

Через вкладку «Услуги» откроем «Сервис электронной подписи».

В случае активации этого сервиса установка ключа ЭЦП КриптоПро не требуется. Система хранит ключ и необходимый набор криптографических операций.

Если храните ключ ЭП на рабочем месте пользователя, обратитесь за услугой в Удостоверяющий центр.

Чтобы поработать с сертификатом ЭП в формате электронной загрузки, скачайте дистрибутив.

Руководства получите у разработчика. Производитель просит зарегистрироваться. Если e-mail и пароль уже занесены в базу, введите их, чтобы войти.

Перед новой загрузкой сайт удостоверится в готовности заключить лицензионное соглашение.

При согласии и начале работы с сервисом сертификата ЭП (СЭП) включается функция работы через Удостоверяющий центр компании. В нем создают сертификат ключа проверки подписи.

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

Сертификат ключа ЭП создается в неэкспортируемом формате. Он недоступен для использования на съемных носителях (и рабочем месте пользователя).

Когда переустанавливать

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

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

Утилита подходит для всех версий CSP. Для выполнения очистки запустите файл cspclean.exe, перезагрузите компьютер и повторно запустите утилиту.

Теперь установите новый продукт.

Как установить КриптоПро

Для загрузки и проверки электронной подписи на web-страницах с применением КриптоПро CSP понадобится плагин. Вот инструкция, как установить КриптоПро ЭЦП browser plug in для работы на электронной площадке:

Шаг 1. Скачайте актуальную версию плагина.

Шаг 2. Запустите исполняемый файл cadesplugin.exe.

Шаг 3. Подтвердите установку.

Шаг 4. Если потребуется, разрешите внести изменения путем нажатия кнопки «Да».

Шаг 5. Дождитесь окончания установки.

Шаг 6. После окончания установки нажмите «ОК».

Существует несколько версий программы. Д истрибутив приобретают:

  • у производителя или у официального дилера на материальном носителе;
  • на сайте производителя или официального дилера.

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

Во вкладке «Продукты» выберем раздел «Сертификаты». Ознакомимся с описанием.

Когда появятся предпочтения по выбору определенной версии, получите представление о возможных затратах. Опубликован прайс-лист услуг получения лицензий и сертификатов компании по состоянию на август 2020. Например, годовая техническая поддержка на рабочем месте стоит 850 рублей, а установка или обновление на рабочем месте или сервере — 5500 руб.

Как работать с КриптоПро

Имея необходимые сведения, используем программу в демонстрационном режиме. Вот инструкция, как бесплатно пользоваться КриптоПро:

Шаг 1. Загружаем файлы через продукты и вкладку СКЗИ КриптоПро CSP.

Шаг 2. Видим сообщение об ограниченном доступе. Пройдем предварительную регистрацию и ответим на несколько вопросов.

Шаг 3. Заполняем поля и отправляем запрос на регистрацию, совершаем дальнейшие действия на следующей странице. Обратим внимание на сообщение о сроке использования демонстрационной версии: 90 дней с момента установки. Передача прав на пользование приобретается в виде лицензии. Демо-версия рассчитана на работу при первичной установке продукта. При повторной попытке загрузки не произойдет.

Шаг 4. Выбираем дистрибутив, который соответствует операционной системе компьютера, и скачиваем его. Загружается быстро. Запускаем программный файл с расширением .ехе. Программная система безопасности предупредит о том, что в компьютер внесут изменения. Если согласны, нажимаем «Установить». Загружается модуль.

После того как установили последнюю версию, работайте с программой сразу. Если загружали предыдущие версии, перезагрузите компьютер сразу или отложите это действие.

Что такое криптопровайдер и для чего он нужен?

Криптопровайдер (Cryptography Service Provider, CSP) — это специальный независимый модуль, который позволяет осуществлять криптографические операции в операционных системах семейства Microsoft Windows и управление которым происходит по средствам функций криптографического интерфейса (CryptoAPI).

Иными словами, это специализированная программа посредник в операционной системе, которая помогает осуществлять криптографические (шифровальные) операции, работающая по зарубежным или российским криптографическим стандартам (ГОСТ) в операционной системе Windows.

Криптопровайдер Signal-COM CSP это один из распространенных криптопровайдеров в России, он поддерживает российские криптографические алгоритмы и обеспечивает к ним доступ из пользовательских приложений через стандартный криптографический интерфейс компании Microsoft — CryptoAPI 2.0.

Из выше описанного следует, что криптопровайдер (CSP) — необходимое ПО для работы квалифицированной электронной подписи в ОС Windows.

Приобрести криптопровайдер Signal-COM CSP и Квалифицированный сертификат электронной подписи [ЭП/ЭЦП] (для работы на сайтах Госуслуг, государственных ведомств и электронных торговых площадок [ЭТП]) Вы можете в нашем аккредитованном удостоверяющем центре «e-Notary» перейдя по ссылке: Тарифы на приобретение сертификата электронной подписи [ЭП/ЭЦП] и программного обеспечения


i: На некоторых порталах и площадках криптопровайдер (CSP) может не потребоваться пользователю, т.к. его функции реализованы на стороне сервера портала или площадки.

Разработка и установка криптопровайдера для компьютеров под управлением ОС windows

Уральский государственный технический университет – УПИ

Кафедра молекулярной физики

РАЗРАБОТКА И УСТАНОВКА КРИПТОПРОВАЙДЕРА ДЛЯ КОМПЬЮТЕРОВ ПОД УПРАВЛЕНИЕМ ОС WINDOWS

Отчет к проблемному заданию по дисциплине
«Языки программирования»

Постановка задачи. 6

Обзор проблемной области. 6

Установка криптопровайдера MinimalCrypt (ОС Windows 98 SE) 11

Приложение 1 – Выдержка из MSDN «Writing a CSP». 12

Приложение 2 — Описание функций библиотеки криптопровайдера (источник: MSDN Library – January, 2004) 13

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

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

В операционных системах семейства Windows разработан CryptoAPI, позволяющий абстрагироваться от конкретного алгоритма шифрования и представляющий собой стандартизированную обертку для используемых в системе средств защиты информации. Crypto API является основой средств защиты Microsoft Internet Security Framework. В его функционал входят базовые средства защиты безопасных каналов и подписи кода. Интерфейс CryptoAPI обеспечивает API высокого уровня для аутентификации, подписи, шифрования/дешифрации, а также полную инфраструктуру защиты с общим ключом. Благодаря данной инфраструктуре, можно воспользоваться функциями управления сертификатами, такими как запрос на создание сертификата, его сохранение или верификация. Реализация функций, предоставляемых Crypto API производится криптопровайдером.

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

Кроме различия в реализуемых стандартах, криптопровайдеры отличаются способом физической организации ключевой базы. С точки зрения программирования, способ физической организации ключевой базы значения не имеет. Однако он весьма важен с точки зрения эксплуатации и безопасности системы. Существующие криптопровайдеры Microsoft хранят свою ключевую базу на жестком диске (в Реестре или в файлах), а криптопровайдеры фирм Gemplus, Schlumberger и Infenion, которые включены в поставку Windows 2000, Windows XP и Windows ME, – на смарт-картах.

Каждый криптопровайдер характеризуется собственным именем и типом. Его имя – набор символов, по которому система распознает криптопровайдер. Так, базовый криптопровайдер Microsoft назван «Microsoft Base Cryptographic Provider vl.0». Тип криптопровайдера – целое число (в нотации языка С – DWORD), значение которого идентифицирует набор поддерживаемых алгоритмов цифровой подписи и несимметричного обмена ключей. Уже упомянутый криптопровайдер «Microsoft Base Cryptographic Provider vl.0» имеет тип 1 (в файле WinCrypt. h определена константа PROV RSAFULL), этот тип криптопровайдеров реализует в качестве алгоритмов цифровой подписи и несимметричного обмена ключей стандарт RSA. Другой базовый криптопровайдер Microsoft – «Microsoft Base DSS and Diffie-Hellman Cryptographic Provider» имеет тип 13 (в файле WinCrypt. h определена константа PROV_DSS_DH), этот тип криптопровайдеров реализует в качестве алгоритма цифровой подписи стандарт DSS, а для реализации ключевого обмена использует алгоритм Диффи – Хеллмана.

Разумеется, в системе могут существовать несколько различных криптопровайдеров одного и того же типа. Криптопровайдеры фирм Gemplus, Schlumberger и Infenion имеют тот же тип, что и криптопровайдер «Microsoft Base Cryptographic Provider vl.0» и реализуют цифровую подпись и ключевой обмен по алгоритму RSA.

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

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

Обзор проблемной области

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

Для того чтобы зарегистрировать в криптопровайдер в реестре, необходимо создать ветку «HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\ Defaults\Provider\ИмяПровайдера» и записать следующие ключи:

Image Path — полное имя файла библиотеки криптопровайдера

Type – тип криптопровайдера

Также необходимо создать ветку «HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\ Defaults\ProviderTypes\Type XXX», где XXX – тип криптопровайдера. В ней нужно создать ключи:

Name Имя криптопровайдера

TypeName Название типа криптопровайдера

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

Подписать библиотеку криптопровайдера позволяет утилита cspsign, разработанная корпорацией Microsoft. В MSDN утверждается, что после создания такой подписи «самопальный» криптопровайдер может быть использован в системе. Однако на деле это не так. Попытка запустить зарегистрированный и подписанный криптопровайдер не даст успеха, т. к. Windows не принимает подписи, сгенерированные cspsign. Все дело в том, что мы, конечные пользователи, используем release-версию Windows, в которой могут быть использованы только подписанные Microsoft криптопровайдеры (см приложение 1). Эту неприятность, как оказалось, можно обойти, заменив системный файл advapi32.dll его отладочной версией. Все необходимое для того, чтобы установить криптопровайдер, можно найти в пакете CSPDK (Crypto Service Provider Development Kit). В нем есть отладочные версии advapi32.dll для различных версий Windows. После того, как будут проделаны все эти операции, криптопровайдер можно будет использовать.

Как уже отмечалось ранее, криптопровайдер должен соответствовать стандарту. Ниже приведен список функций, которые должна предоставлять (экспортировать) библиотека криптопровайдера

Функции управления криптопровайдером

Используется для получения дескриптора

определенного ключевого контейнера в криптопровайдере.

Возвращает параметры криптопровайдера.

Используется для освобождения дескриптора криптопровайдера, созданного CPAcquireContext.

Устанавливает параметры криптопровайдера.

Функции работы с ключами и обмена криптографическими данными

Создает сессионные криптографические ключи из ключевого материала.

Освобождает дескриптор ключа.

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

Генерирует случайные сессионные ключи и

Генерирует случайную последовательность

Возвращает параметры ключа.

Возвращает дескриптор одной из постоянных ключевых пар.

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

Устанавливает параметры ключа


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

Используется для дешифрования данных.

Используется для шифрования данных.

Функции хеширования и цифровой подписи

Используется для инициализации хеширова ния потока данных.

Уничтожает объект хеш-функции.

Возвращает параметры объекта хеш-функции.

Используется для добавления данных к объекту хеш-функции.

Используется для добавления к объекту хеш-функции значения сессионного ключа.

Устанавливает параметры объекта хеш-функ ции.

Вычисляет значение ЭЦП от значения хеша, определенного дескриптором объекта хеширо вания.

Осуществляет проверку подписи, соответствующей объекту хеширования.

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

Замечание: В системах с поддержкой CAPICOM (Crypto API for COM) обращение к криптопровайдеру возможно с помощью внутреннего COMклиента, реализующего стандартные интерфейсы CAPICOM. Таким образом, теоретически, становится возможным, создав и зарегистрировав собственный сервер CAPICOM, подключить собственный криптопровайдер. (Достаточно подключить собственный COM-сервер CAPICOM, реализующий те же интерфейсы с теми же GUID)

В результате выполнения работы была создана библиотека криптопровайдера, обеспечивающая минимальную функциональность. Библиотека реализует функции, отвечающие за загрузку, выгрузку и проверку криптопровайдера, а также за генерацию случайных последовательностей. Остальные функции реализованы в виде заглушек. Библиотека носит чисто демонстративный характер. Основная ее задача – продемонстрировать возможность подключения собственного криптопровайдера в системах. В ходе выполнения работы выяснилось, что с помощью CSPDK собственный криптопровайдер может быть установлен только в ОС Windows следующих версий:

Windows NT 4 sp3, sp4, sp6

Windows 2000, sp1, sp2

Отладка и тестирование библиотеки производились под управлением ОС Windows 98 SE. Демонстрация приложения производится на компьютере под управлением Windows 2000 Server с использованием виртуальной машины Windows 98 SE. В системе удалось Windows XP зарегистрировать криптопровайдер, но не удалось воспользоваться им, поскольку в комплекте CSPDK нет измененной advapi32.dll для XP.

Установка криптопровайдера MinimalCrypt (ОС Windows 98 SE)

Для того, чтобы установить криптопровайдер MinimalCrypt в системе Windows 98 SE, необходимо:

1. Запустить Windows 98 в режиме MS DOS

2. Запустить файл Install.bat (командный файл замены advapi32.dll)

3. Перезагрузить Windows

4. Запустить TestSample. exe

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

Приложение 1 – Выдержка из MSDN «Writing a CSP»

A cryptographic service provider (CSP) must be digitally signed by Microsoft to be used with the released versions of the Windows operating system. The digital signature separates applicable legal export controls on the CSP from the host operating system and applications, thereby allowing broader distribution of encryption-enabled products than would be possible under other circumstances. Generally, U. S. export law limits the export outside the United States or Canada of products that host strong encryption or an open cryptographic interface. The digital signature requirement effectively prevents arbitrary use of CryptoAPI and allows export of the host operating system and CryptoAPI-enabled removing encryption services from host systems and applications, CryptoAPI places the burden of U. S. encryption export restrictions squarely on the CSP vendor, who is subject to those controls regardless.

In addition, the operating system validates this signature periodically to ensure that the CSP has not been changed.

Microsoft’s interests in applying signatures to CSPs are:

· To ensure the exportability of CryptoAPI-enabled systems and applications.

· To exercise due diligence under prevailing U. S. and other national export controls.

· To help maintain the integrity of the CSP.

Vendors should consult legal counsel or U. S. export authorities to determine whether an export approval or exemption applies to their CSP.

Questions and comments about the CSP signing mechanism, signing procedures, and CryptoAPI licensing policy can be sent by e-mail to *****@***com.

For assistance in the classification or export licensing of CSPs for export from the United States, CSP vendors can also consult the following office:

U. merce Department
Bureau of Export Administration
Office of Exporter Services

The U. merce Department’s export license process, encryption export controls, and points of contact are described on their Web site at http://www. bxa. doc. gov/encryption/default. htm.

Microsoft will sign CSPs subject only to the limitations of U. S. export controls. Microsoft will sign CSPs from competitors. At present, CSPs are signed at the Microsoft facilities in Redmond, Washington, USA.

Приложение 2 — Описание функций библиотеки криптопровайдера (источник: MSDN Library January, 2004)

Выбор криптопровайдера (КриптоПро CSP vs ViPNet CSP)?

В продолжение вопроса «ЭЦП для подписи файлов сотрудниками»: при использовании юридически значимой ЭЦП (по ФЗ №63) от аккредитованного УЦ, в чём разница между криптопровайдерами? Их много, я знаю, в заголовке я указал КриптоПро CSP и ViPNet CSP как самые распространённые, причём вторая бесплатная. Большинство УЦ если и указывает криптопровайдера, то это КриптоПро, но действительно ли это ограничивает выбор, или с тем же УЦ я могу использовать и бесплатную ViPNet CSP? В чём отличия, есть ли подводные камни?

Илон Маск рекомендует:  Что такое код is_readable

P.S. Про клиентский интерфейс не спрашиваю: я так понимаю, альтернатив КриптоАРМ нет (нагуглились только КриптЭК, КриптоЛайн и ViPNet CryptoFile, но инфы о них крайне мало).

UPD: По поводу клиентского интерфейса: ViPNet CryptoFile стал доступен для загрузки с сайта производителя, а также внесена ясность в права его использования: он бесплатен для использования с другим ПО ViPNet. Таким образом, ViPNet CSP и ViPNet CryptoFile составляют цельный и бесплатный стек для работы с ЭЦП. Ура :)

  • Вопрос задан более трёх лет назад
  • 50403 просмотра


УЦ практически всегда будет выдавать сертификаты с использованием Крипто-Про CSP, это текущее положение вещей.

А вот для формирования подписи на базе этих сертификатов вполне возможно использовать и ViPNet CSP, выданные в УЦ сертификаты вполне под это подойдут.

Эта тема обсуждалась на форуме Крипто-Про: ссылка.

Альтернативы КриптоАрму тоже можно найти, просто эта программа наиболее популярна.

Подписи в обоих криптопровайдерах формируются по одному ГОСТу и являются полностью совместимыми. Другое дело, что формат ключевых контейнеров действительно различный и если сертификат выпустило УЦ без запроса на сертификат то использование ViPNet CSP становится проблематичным, но возможным (пометка ключей как экспортируемых — загрузка в криптопровайдер от Крипто-Про — экспорт в *.pfx — импорт в ViPNet CSP).

Так что ЭЦП от обоих криптопровайдеров будут одинаковые, разные только форматы ключевых контейнеров, но и это можно решить.

Обзор BestCrypt — программы для криптографической защиты данных

Такова наша жизнь — надо что-то от кого-то прятать. Кому надо прятать интимные фото любовницы, кому документы от налоговой инспекции. Способов для прятания много, но лучше шифрования пока еще ничего не придумали. Программ для шифрования тоже много, у каждой есть свои плюсы и минусы. Но одной из лучших считается программа BestCrypt от финской компании Jetico. Одной из основных особенностей данной программы является то, что она позволяет создавать контейнер в контейнере. Другая особенность в том, что программа — мультиплатформенна. Есть версии для Windows и для Linux.

По поводу использования программ подобного типа для сохранности данных в Интернете ведется много споров. Кто-то считает, что программы, сертифицированные компетентными органами, обязательно имеют программные «закладки» для доступа к информации. (BestCrypt сертифицирована ФАПСИ.) Кто-то считает, что «закладки» не нужны, так как компетентные органы и так получат пароли особыми методами. Мы не вдаемся в эти споры, мы рассматриваем программу как средство для хранения информации от несанкционированного доступа.

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

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

Для шифрования данных в программе используется один из четырех предлагаемых алгоритмов:

  • алгоритм Rijndael (AES) в режиме сцепления блоков шифротекста (Cipher Block Chaining mode);
  • российский федеральный стандарт ГOСT 28147-89 в режиме с обратной связью по шифротексту (Cipher Feedback mode);
  • Blowfish в режиме сцепления блоков шифротекста (Cipher Block Chaining mode);
  • Twofish в режиме сцепления блоков шифротекста (Cipher Block Chaining mode).

Все они считаются наиболее сильными шифровальными алгоритмами из существующих, и все они реализованы с 256-битным ключом. При необходимости можно менять параметры шифрования: алгоритм и ключ. В новой, тестируемой сейчас версии предусмотрено уже восемь алгоритмов, причем один из них (Blowfish) допускает даже 448-битный ключ.

Создание контейнеров осуществляется довольно просто, но есть одна маленькая хитрость. После задания параметров контейнера вам придется немного посидеть перед экраном монитора, давя на любые клавиши клавиатуры, пока в диалоговом окне не заполнится полоса прогресса. Только после этого состоится собственно создание контейнера. При создании контейнеров надо учитывать, что максимальный размер контейнера ограничен для разных файловых систем. Если для NTFS ограничения не установлены, то для FAT 32 это ограничение составляет 4 Гб, а для FAT 16 — 2 Гб. Также программа не разрешит вам использование паролей для контейнеров меньше шести знаков. Еще одной особенностью можно назвать то, что программа при введении пароля считывает не символы, а коды нажатых клавиш, поэтому 1, набранная на цифровой клавиатуре, не эквивалентна 1, набранной на основной клавиатуре.

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

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

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

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

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

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

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

Национальная библиотека им. Н. Э. Баумана
Bauman National Library

Персональные инструменты

Windows CryptoAPI

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

Содержание

Основные понятия и термины

Криптография – наука о защите данных. Алгоритмы криптографии с помощью математических методов комбинируют входной открытый текст и ключ шифрования, в результате чего получаются зашифрованные данные. Применение криптографии обеспечивает относительно надёжную передачу данных и предотвращение их получения несанкционированной стороной. Применяя хороший алгоритм шифрования, можно максимально усложнить взлом защиты и получения открытого текста подбором ключа.
Шифрование – защита информации от несанкционированного просмотра или использования, особенно при передаче по линиям связи.
Дешифрование – процесс, обратный процессу шифрованию.
Аутентификация (authentication) – проверка подлинности, этот процесс надежного определения подлинности поддерживающих связь компьютеров. Аутентификация основана на методах криптографии, и это гарантирует, что нападающий или прослушивающий сеть не сможет получить информацию, необходимую для рассекречивания пользователя или другого объекта. Аутентификация позволяет поддерживающему связь объекту доказать свое тождество другому объекту без пересылки незащищенных данных по сети. Без «сильной» (strong) аутентификации и поддержания целостности, данных любые данные и компьютер, который их послал, являются подозрительными.
Шифр – обеспечивает возможность передачи сообщения по незащищенным каналам (не обязательно сетевым) с защитой этого сообщения от прочтения посторонними лицами.
Цифровая подпись – это двоичные данные небольшого объема, обычно не более 256 байт. Цифровая подпись есть не что иное, как результат работы хеш-алгоритма над исходными данными, зашифрованный закрытым ключом отправителя. Проще говоря, берем исходные данные, получаем из них хеш и шифруем хеш своим закрытым ключом (с помощью асимметричного алгоритма).
Сертификат – средство, позволяющее гарантированно установить связь между переданным открытым ключом и передавшей его стороной, владеющей соответствующим личным ключом. Сертификат представляет собой набор данных, зашифрованных с помощью цифровой, или электронной, подписи. Информация сертификата подтверждает истинность открытого ключа и владельца соответствующего личного ключа.

Общие положения

Интерфейс

В сфере защиты компьютерной информации криптография применяется в основном для: шифрования и дешифрования данных; а также создания и проверки цифровых подписей. Шифрование данных позволяет ограничить доступ к конфиденциальной информации, сделать ее нечитаемой и непонятной для посторонних. Применение цифровых подписей оставляет данные открытыми, но дает возможность верифицировать отправителя и проверять целостность полученных данных. Для защиты информации специалистами Microsoft был разработан интерфейс CryptoAPI, который является основой средств защиты Microsoft Internet Security Framework. Он позволяет создавать приложения, использующие криптографические методы и обеспечивает базовые функции защиты для безопасных каналов и подписи кода. Реализация CryptoAPI в Internet Explorer позволяет нам легко интегрировать со своими приложениями усиленные средства шифрования. Интерфейс CryptoAPI обеспечивает API высокого уровня для аутентификации, подписи, шифрования/дешифрации, а также полную инфраструктуру защиты с общим ключом. Благодаря данной инфраструктуре, можно воспользоваться функциями управления сертификатами, такими как запрос на создание сертификата, его сохранение или верификация.
Программный интерфейс CryptoAPI фирмы Microsoft предоставляет возможности для добавления в приложение, основанное на базе Win32, функций аутентификации, шифрования, дешифрования и электронной подписи. Задачами CryptoAPI являются:

  • Аутентификация сетевых пользователей
  • Шифрование и дешифрование сетевых сообщений
  • Шифрование и дешифрование данных
  • Создание цифровой подписи и ее подтверждение.

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

Открытость интерфейса: открытая архитектура CryptoAPI позволяет выбирать Cryptographic Service Provider (CSP) по своему усмотрению. CryptoAPI доступен в операционных системах Windows, Macintosh и UNIX. Кроме того, в CryptoAPI поддерживаются стандартные форматы сертификатов X.509 версии 3, ASN.1 и DER.

Симметричные и асимметричные шифры

Блочные шифры

Блочные шифры считаются более надежными, нежели поточные, поскольку каждый блок текста подвергается сложным преобразованиям. Тем не менее, одних только этих преобразований оказывается недостаточно для обеспечения должного уровня безопасности — важно, каким образом они применяются к исходному тексту в процессе шифрования. Наиболее простой и интуитивно понятный способ состоит в том, чтобы разбить исходный текст на блоки соответствующего размера, а затем отдельно каждый блок подвергнуть шифрующему преобразованию. Такой режим использования блочных шифров называют электронной кодовой книгой (ECB — electronic codebook). Его главный недостаток состоит в том, что одинаковые блоки исходного текста при шифровании дадут одинаковые же блоки шифр-текста — а это может существенно облегчить противнику задачу взлома. Поэтому режим ECB не рекомендуется использовать при шифровании текстов, по длине превышающих один блок — в таких случаях лучше воспользоваться одним из режимов, связывающих различные блоки между собой. По умолчанию в CryptoAPI блочные шифры используются в режиме сцепления блоков шифр-текста (CBC — cipher block chaining). В этом режиме при шифровании очередной блок исходного текста вначале комбинируется с предыдущим блоком шифр-текста (при помощи побитового исключающего ИЛИ), а затем полученная последовательность битов поступает на вход блочного шифра (рис. 2). Образующийся на выходе блок шифр-текста используется для шифрования следующего блока. Самый первый блок исходного текста также должен быть скомбинирован с некоторой последовательностью битов, но «предыдущего блока шифр-текста» еще нет; поэтому режимы шифрования с обратной связью требуют использования еще одного параметра — он называется инициализирующим вектором (IV — initialization vector).

Инициализирующий вектор должен генерироваться отдельно с помощью уже известной нам функции CryptGenRandom и, как и солт-значение, передаваться вместе с ключом в открытом виде. Размер IV равен длине блока шифра. Например, для алгоритма RC2, поддерживаемого базовым криптопровайдером Microsoft, размер блока составляет 64 бита (8 байтов).

Алгоритм RSA

Работа с CryptoAPI

Криптопровайдеры, инициализация и деинициализация

Любой сеанс работы с CryptoAPI начинается с инициализации (получения контекста). Инициализация выполняется при помощи функции CryptAcquireContext. В качестве параметров эта функция принимает имя контейнера ключей, имя криптопровайдера, тип провайдера и флаги, определяющие тип и действия с контейнером ключей и режим работы криптопровайдера:

BOOL WINAPI CryptAcquireContext(HCRYPTPROV* phProv,LPCTSTR pszContainer, LPCTSTR pszProvider,DWORD dwProvType,DWORD dwFlags);

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

Прежде чем использовать какие-либо функции Crypto API, необходимо запустить криптопровайдер. Делается это с помощью функции CryptAcquireContext:


BOOL CRYPTFUNC CryptAcquireContext( HCRYPTPROV* hCryptProvider,//дескриптор провайдера, out-параметр LPCTSTR pszContainer, // имя контейнера ключей LPCTSTR pszProvider, // имя провайдера DWORD dwProvType, // тип провайдера DWORD dwFlags // флаги )

Кроме инициализации криптопровайдера данную функцию можно использовать для создания и удаления контейнеров ключей. Для этого параметру dwFlags присваивается значение, соответственно, CRYPT_NEW-KEYSET и CRYPT_DELETEKEYSET. Функция CryptAcquireContext работает в два этапа: сначала она ищет криптопровайдер по имени и типу, указанному в аргументах, а затем контейнер ключей с заданным именем. По окончании работы с криптопровайдером необходимо вызвать функцию CryptReleaseContext. Криптопровайдеры отличаются друг от друга:

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

По составу функций и обеспечивающих их алгоритмов криптопровайдеры подразделяются на типы. Например, любой CSP типа PROV_RSA_FULL поддерживает как шифрование, так и цифровые подписи, использует для обмена ключами и создания подписей алгоритм RSA, для шифрования — алгоритмы RC2 и RC4, а для хеширования — MD5 и SHA. В зависимости от версии операционной системы состав установленных криптопровайдеров может существенно изменяться. Однако на любом компьютере с Windows можно найти Microsoft Base Cryptographic Provider, относящийся к уже известному нам типу PROV_RSA_FULL. Именно с этим провайдером по умолчанию будут взаимодействовать все программы. Приложение обращается к криптопровайдеру не напрямую, а через CryptoAPI. При этом вначале необходимо запросить у системы контекст криптопровайдера. Первым делом, хотя бы из любопытства, выясним, какие же криптопровайдеры установлены в системе. Для этого нам понадобятся четыре функции CryptoAPI:

  • CryptEnumProviders (i, резерв, флаги, тип, имя, длина_имени) — возвращает имя и тип i-го по порядку криптопровайдера в системе (нумерация начинается с нуля);
  • CryptAcquireContext (провайдер, контейнер, имя, тип, флаги) — выполняет подключение к криптопровайдеру с заданным типом и именем и возвращает его дескриптор (контекст). При подключении мы будем передавать функции флаг CRYPT_VERIFYCONTEXT, служащий для получения контекста без подключения к контейнеру ключей;
  • CryptGetProvParam (провайдер, параметр, данные, размер_данных, флаги) — возвращает значение указанного параметра провайдера, например, версии (второй параметр при вызове функции — PP_VERSION), типа реализации (программный, аппаратный, смешанный — PP_IMPTYPE), поддерживаемых алгоритмов (PP_ENUMALGS). Список поддерживаемых алгоритмов при помощи этой функции может быть получен следующим образом: при одном вызове функции возвращается информация об одном алгоритме; при первом вызове функции следует передать значение флага CRYPT_FIRST, а при последующих флаг должен быть равен 0;
  • CryptReleaseContext (провайдер, флаги) — освобождает дескриптор криптопровайдера.

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

Криптографические ключи и выполняемые функции

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

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

Сессионные ключи — это симметричные ключи, так как один и тот же ключ применяется и для шифрования, и для расшифровки. Сессионные ключи меняются. Алгоритмы, использующие сессионные ключи (так называемые симметричные алгоритмы), – RC2, RC4, DES. Microsoft RSA Base Provider работает с 40-разрядными сессионными ключами.
Пары открытый/закрытый ключ используются в так называемых асимметричных алгоритмах шифрования. Если шифрование выполнялось одним ключом из пары, то дешифрование производится другим. Открытые (public) ключи могут передаваться другим лицам для проверки цифровых подписей и шифрования пересылаемых данных. Длина открытого ключа в Microsoft RSA Base Provider составляет 512 разрядов. Закрытые (private) ключи не могут быть экспортированы; они используются для создания цифровых подписей и дешифровки данных. Закрытый ключ должен быть известен только его владельцу. При шифровании с открытым ключом жизненно важна абсолютно достоверная ассоциация открытого ключа и передавшей его стороны, поскольку в обратном случае возможна подмена открытого ключа и осуществление несанкционированного доступа к передаваемым зашифрованным данным. Необходим механизм, гарантирующий достоверность корреспондента, например, применение сертификата, созданного авторизованным генератором сертификатов. Обычно сертификаты содержат дополнительную информацию, позволяющую идентифицировать владельца личного ключа, соответствующего данному открытому ключу. Сертификат должен быть подписан авторизованным генератором сертификатов. Выполняемые функции:

  • Функции кодирования сертификатов:

Эти функции управляют сертификатами и сопутствующими данными через сеть OSI (соединение открытых систем, семиуровневая модель) как описано в CCIT X.200. Методы OSI, описывающие абстрактные объекты, используют абстрактную синтаксическую нотацию один (ASN.1), как описано в CCITT X.209.

  • Функции базы сертификатов:

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

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

Используются для наиболее полного использования криптографических возможностей в приложении. Это функции взаимодействующие с провайдером. Все криптографические операции выполняются независимыми модулями называемыми Cryptographic Service Providers (CSP). Каждый CSP предлагает различные реализации криптографической поддержки используемой через CryptoAPI. Некоторые провайдеры несут более сильные алгоритмы, некоторые содержат физические компоненты (смарткарты, криптоускорители). В дополнение, некоторые CSP могут напрямую работать с пользователем при использовании личного ключа или подписи.

  • Функции сообщений низкого уровня:

Используются для быстрого создания сообщений отвечающих требованиям PKCS#7(RFC2315 , RFC2316). Эти функции предназначены для шифрования данных при передаче и дешифровке их при приеме, а также для дешифровки и проверке подписей получаемых сообщений.

  • Упрощенные функции сообщений:

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

Илон Маск рекомендует:  Функция doevents

Криптопровайдер отвечает за хранение и разрушение ключей. Программист не имеет доступа непосредственно к двоичным данным ключа, за исключением операций экспорта открытых ключей. Вся работа с ключами производится через дескрипторы (handle). В CryptoAPI ключи для шифрования / дешифрования и создания / проверки подписей разделены. Называются они соответственно «пара для обмена ключами» и «пара для подписи». База данных ключей состоит из контейнеров, в каждом из которых хранятся ключи, принадлежащие определенному пользователю. Контейнер ключей имеет уникальное имя и содержит пару для обмена и пару для подписи. Все ключи хранятся в защищенном виде. По умолчанию для каждого пользователя создается контейнер с именем этого пользователя. Можно создавать дополнительные контейнеры и назначать им произвольные имена, которые обязательно должны быть уникальными (см. Рис. 4).

Генерация ключей и обмен ключами

Для генерации ключей в CryptoAPI предусмотрены две функции – CryptGenKey и CryptDeriveKey. Первая из них генерирует ключи случайным образом, а вторая – на основе пользовательских данных. При этом гарантируется, что для одних и тех же входных данных CryptDeriveKey всегда выдает один и тот же результат. Это способ генерации ключей может быть полезен для создания симметричного ключа шифрования на базе пароля. Более подробно следует остановиться на функции CryptGenKey, которая используется чаще всего. Эта функция имеет прототип:

Первый и четвертый параметры говорят сами за себя. Вторым параметром передается идентификатор алгоритма шифрования, для которого генерируется ключ (например, CALG_3DES). При генерации ключевых пар RSA для шифрования и подписи используются специальные значения AT_KEYEXCHANGE и AT_SIGNATURE. Третий параметр задает различные опции ключа, которые зависят от алгоритма и провайдера. Например, старшие 16 битов этого параметра могут задавать размер ключа для алгоритма RSA. Подробное описание всех флагов можно найти в MSDN. Здесь я упомяну только один флаг — CRYPT_EXPORTABLE, который позволяет экспортировать закрытые ключи RSA из контейнера (по умолчанию это запрещено). Для других ключей этот параметр смысла не имеет – открытые ключи являются свободно экспортируемыми, а сессионные ключи вообще не хранятся внутри контейнера, т.ч. их обязательно нужно экспортировать.

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

Обмен ключами в CryptoAPI реализуется с помощью функций CryptExportKey и CryptImportKey, имеющих следующие прототипы:

В качестве ключей экспорта/импорта могут использоваться либо ключевая пара RSA (с типом AT_KEYEXCHANGE), либо симметричный сеансовый ключ. Параметр dwBlobType зависит от того, какой ключ экспортируется (импортируется), и задает тип структуры, в которую помещается экспортируемый ключ. Для открытого ключа это PUBLICKEYBLOB, и ключ экспорта/импорта при этом лишен смысла и должен быть нулем. Для закрытого ключа это PRIVATEKEYBLOB, и в качестве ключа экспорта может использоваться сеансовый ключ. Для сеансового ключа это обычно SIMPLEBLOB, а экспортируется он, как правило, на открытом ключе получателя.

Описание флагов можно найти в MSDN. Можно выделить среди них флаг CRYPT_OAEP, который заставляет криптопровайдера использовать формат PKCS #1 версии 2 при сохранении сессионного ключа с шифрованием RSA. Ключ, сохраненный в этом формате, затем может быть расшифрован другими системами шифрования. Если же этот флаг не указан, то ключ сохраняется в каком-то известном только CryptoAPI формате, и использовать его где-либо еще вряд ли удастся.

И, наконец, параметры pbData и pdwDataLen задают адрес и размер буфера под структуру экспортируемого ключа. Если размер структуры не известен при написании программы, то можно определить требуемый размер буфера, установив в pbData ноль. В этом случае нужный размер возвращается в pdwDataLen.

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

В качестве примера ниже будет рассмотрено создание и экспорт пары ключей для шифрования RSA и симметричного ключа 3DES:

Обмен симметричными ключами
За обмен сессионными ключами в .NET отвечают классы RSAOAEPKeyExchangeFormatter/Deformatter и RSAPKCS1KeyExchangeFormatter/Deformatter. Они унаследованы от базовых классов AsymmetricKeyExchangeFormatter/Deformatter, предоставляющих методы CreateKeyExchange и DecryptKeyExchange для шифрования и дешифрации сессионных ключей, соответственно. Рассмотрим передачу сессионного ключа на небольшом примере:

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

Получение дескриптора ключа

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

Экспорт ключей

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

Первый аргумент – дескриптор экспортируемого ключа. Второй аргумент – дескриптор ключа, которым шифруется экспортируемый ключ. Открытые ключи экспортируются в незашифрованном виде. В этом случае hCryptKey = 0. При экспорте сессионных и закрытых ключей необходимо их предварительно зашифровать. Аргумент hCryptKey должен содержать дескриптор открытого ключа получателя. При вызове с аргументом pbData = NULL функция вернет необходимую длину буфера по адресу, на который указывает аргумент pdwDataLen. После успешного завершения переменная dwSessionKeyLen будет содержать действительную длину BLOB-структуры ключа. Это значение необходимо сохранить для обратной операции – импорта ключа в криптопровайдер.

Импорт ключей


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

hCryptKey = 0 в том случае, если импортируемый ключ был, зашифрован асимметричным ключом или не был зашифрован вообще. Если импортируемый ключ шифровали сессионным ключом, то hCryptKey должен содержать дескриптор этого ключа. По окончании работы с ключом необходимо для его дескриптора вызвать функцию CryptDestroyKey(HCRYPTKEY hKey).

Цифровая подпись

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

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

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

Если они эквивалентны, значит, данные были подписаны именно нами (см. Рис. 6).

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

Создание цифровой подписи

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

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

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

Проверка цифровой подписи

Проверка подписи выполняется так:

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

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

В CryptoAPI для шифрования и дешифрования используются и симметричный, и асимметричный алгоритмы. Симметричный алгоритм менее надежен, но работает намного быстрее, чем асимметричный. Поэтому в CryptoAPI применяется комбинация алгоритмов. Данные шифруются с помощью симметричного алгоритма с сессионным ключом, а сам сессионный ключ шифруется по асимметричному алгоритму открытым ключом получателя. Дешифрование происходит в обратном порядке: сначала закрытым ключом получателя дешифруется сессионный ключ, затем этим сессионным ключом дешифруются сами данные (см. Рис. 7 и 8).

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

Хеши MD5 и SHA

Хеш создается вызовом функции CryptCreateHash, принимающей на входе контекст криптопровайдера, идентификатор алгоритма (CALG_MD5 или CALG_SHA) и хендл ключа (для хешей с ключем типа MAC и HMAC). После этого хеш можно вычислять как явно, используя функцию CryptHashData, так и неявно, передавая хендл хеша в функцию CryptEncrypt. Использование CryptEncrypt обсуждалось в разделе про DES, поэтому остановимся на функции CryptHashData. Ее вызов может выглядеть следующим образом: CryptHashData(hHash,(BYTE *)&data,dwLen,0); Вычисление хеша (также как и шифрование) можно производить по частям (например, читая данные в буфер и хешируя содержимое буфера в цикле). После окончания хеширования можно либо подписать хеш (см. ниже), либо получить его значение вызовом: CryptGetHashParam(hHash,HP_HASHVAL,(BYTE *)&buf,&dwLen,0); Размер хеша MD5 равен 128 бит или 16 байтов. Для SHA это 160 бит или 20 байтов. После получения значения хеш использовать уже нельзя. Его нужно разрушить вызовом CryptDestroyHash. Проверка хеша производится точно также, как и его создание – нужно вычислить хеш и сверить полученное значение с сохраненным: HCRYPTHASH hHash;

BYTE newHash[16]; dwLen=16;

Заключение

И CryptoAPI, и .NET предоставляют богатый набор средств шифрования, позволяющих организовать собственную систему защиты данных без использования сторонних средств. В .NET, правда, эти средства пока плохо отлажены и документированы, но использовать их все равно можно. Основными препятствиями на пути использования средств CryptoAPI и .NET могут стать отсутствие на платформах ниже Windows 2000 поддержки “сильной” криптографии и требования, налагаемые Российским законодательством на средства шифрования, используемые в коммерческой деятельности. По Российскому законодательству эти средства обязательно должны быть сертифицированы ФАПСИ. Но ни один из алгоритмов, реализованных в CryptoAPI и .NET, не является сертифицированным. Правда, это не мешает разработчикам shareware-программ использовать алгоритмы типа RSA для защиты своих продуктов.

Секреты разработки CSP

Секреты разработки CSP

Эта статья для тех, кто по тем или иным причинам решил написать собственный крипто-провайдер для OC семейства Windows. Если Вы хотите реализовать в вашем провайдере нестандартные алгоритмы, то вам предстоит столкнуться с определенными трудностями. Трудности могут возникнуть, например, при попытках использования вашего крипто-провайдера для проверки сертификатов в MS Internet Explorer.

Под нестандартными алгоритмами здесь понимаются не всемирные DES, RSA, DSA и т.д, а, например, алгоритмы семейства ГОСТ. Дело в том, что для RSA и подобных алгоритмов все необходимые идентификаторы уже зашиты в систему, а для ГОСТ-ов (или многих других алгоритмов) надо отдельно позаботиться о том, чтобы система их “увидела”.

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

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

Интеграция провайдера в Windows

Помимо наличия библиотеки самого провайдера дополнительно требуется:

зарегистрировать провайдер и крипто-алгоритмы в системе, прописав определенные параметры в реестре;

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

заменить функцию I_CryptGetDefaultCryptProvider в библиотеке crypt32.dll

Только после выполнения этих действий провайдер нормально интегрируется в систему и вы сможете, например, генерировать сертификаты при помощи вашего провайдера на основе стандартного компонента ОС Windows Server — Сertification services или на тестовом УЦ КриптоПро http://www.cryptopro.ru/certsrv

Корректно будет отображаться статус проверки подписи у сертификатов, подписанных вашим “нестандартным” алгоритмом и т.п.

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

Регистрация крипто-провайдера и алгоритмов в системе

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

Процесс регистрации самого CSP подробно описан в MDSN, и повторять эту информацию здесь смысла нет. Все это подробно описано в [1]. Также здесь мы не будем останавливаться на проблеме подписи нового CSP в Microsoft и путях ее обхода. Эта проблема уже многократно обсуждалась на различных форумах, например смотрите [3]. Гораздо интереснее рассмотреть регистрацию криптографических алгоритмов. Каждый алгоритм имеет свой уникальный ASN.1 идентификтор Оbject Identifier — OID. Например, алгоритм подписи ГОСТ-34.10-2001 имеет такой OID (представленный в виде строки) – “1.2.643.2.2.3”. Идентификатор каждого поддерживаемого вашим CSP алгоритма следует занести в реестр. Помимо OID у каждого крипто-алгоритма в Windows существует еще идентификатор в виде четырех-байтового числа – AlgID, по которому алгоритмы идентифицируются в провайдере. Этот идентификатор заноситься в CSP и его можно узнать перечислив алгоритмы посредством вызова CPGetProvParam. В КриптоПро, например, для алгоритма хеширования ГОСТ-34.11-94 AlgID используется значение 0x801e

Пусть нам необходимо зарегистрировать алгоритм подписи ГОСТ-34.10-2001. Тогда в реестре необходимо прописать следующие идентификаторы:

“1.2.643.2.2. 9!1” – Хэш ГОСТ-34.11-94

“1.2.643.2.2.19!3” – Ключ подписи ГОСТ-34.10-2001

“1.2.643.2.2.3!4” – Подпись ГОСТ-34.10-2001 – Алгоритм Хэша + Алгоритм Ключа


Рисунок 1 — Идентификаторы алгоритмов

Далее приведен пример кода регистрации OID алгоритма ГОСТ-34.11-94

Архитектура криптографических функций в Windows

При разработке СКЗИ КриптоПРО CSP учитывалась существующая в операционной системе Windows архитектура использования криптографических функций. В соответствии с этой архитектурой собственно криптографические функции реализуются через специфицированный Microsoft интерфейс — Cryptographic Service Providers (CSP). При этом возможно подключение дополнительных криптографических модулей, удовлетворяющих формату CSP и SSPI для использования как в составе стандартного программного обеспечения, так и для встраивания в прикладное программное обеспечение.
В соответствии с существующей в операционной системе Windows архитектуре использования криптографических функций КриптоПро CSP возможно использовать как в стандартном программном обеспечении Microsoft, так и встраивать в разрабатываемое прикладное программное обеспечение.

Использование в программном обеспечении Microsoft

Встраивание СКЗИ КриптоПро CSP

Иерархическая архитектура криптографических функций в операционной системе Windows позволяет использовать российские криптографические алгоритмы, реализованные в КриптоПро CSP на самых различных уровнях.

Для работы с любым отладчиком контроль целостности в драйвере должен быть отключен. Для этого следует в реестре значение HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\CProIntegrity\CheckMode установить в 0. После этого для Windows XP, 2003 необходимо перестартовать сервис, а для Windows 2000 перегрузить машину.

Подключение на уровне CSP

КриптоПро CSP может быть непосредственно подключено к прикладному программному обеспечению путем загрузки модуля с использованием функции LoadLibrary(). Для этих целей в комплект поставки включается «Руководство программиста», описывающее состав функций и тестовое ПО. При такой реализации прикладному ПО доступен лишь ограниченный набор низкоуровневых криптографических функций, соответствующий интерфейсу Microsoft CSP.

Подключение на уровне CryptoAPI 2.0

КриптоПро CSP может быть подключено к прикладному программному обеспечению (как и любой другой криптопровайдер, поставляемый с ОС Windows) через интерфейс CryptoAPI 2.0, подробное описание которого приведено в программной документации MSDN (Microsoft Developer Network). В этом случае способ выбора криптографического алгоритма в прикладном ПО может определятся информацией, описывающей алгоритм открытого ключа отправителя/получателя, содержащейся в сертификатах открытых ключей Х.509.

Использование интерфейса CryptoAPI 2.0 в ОС Windows преследует две главные цели:

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

Функционально интерфейс CryptoAPI 2.0 делится на 5 групп.

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

К базовым функциям относятся функции:

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

По своей функциональности базовые функции повторяют низкоуровневый интерфейс CSP.

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

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

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

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

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

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

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

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

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

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

Использование COM интерфейсов

КриптоПро CSP может быть использовано из COM интерфейсов, разработанных Microsoft.

  • CAPICOM 1.0 ( CAPICOM 2.0);
  • Certificate Services;
  • Certificate Enrollment Control.

Certificate Enrollment Control

COM интерфейс Certificate Enrollment Control (реализованный в файле xenroll.dll) предназначен для использования ограниченного количества функций CryptoAPI 2.0, связанных с генерацией ключей, запросов на сертификаты открытых ключей и обработкой сертификатов, полученных от Центра Сертификации, с использованием языков программирования Visual Basic, C++, JavaScript, VBScript и среды разработки Delphi.

Именно этот интерфейс используют различные Центры Сертификации (Verisign, Thawte и т. д.) при формировании сертификатов открытых ключей пользователей на платформе Windows.

CAPICOM

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

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

Компонент CAPICOM является свободно распространяемым и поставляется в составе Redistributable инструментария разработчика Microsoft Platform SDK.

Certificate Services

Certificate Services включает в себя несколько COM интерфейсов, позволяющих изменить функциональность Центра Сертификации, входящего в состав ОС Windows 2000 Server. При помощи данных интерфейсов возможно изменить:

  • обработку поступающих от пользователей запросов на сертификаты
  • состав данных (в том числе дополнений X.509), записываемых в издаваемые центром сертификаты
  • способ публикации (хранения) изданных центром сертификатов.

Использование протокола TLS в прикладном ПО

Кроме использования протокола TLS в интерфейсе Internet Explorer, прикладное программное обеспечение может использовать протокол TLS с СКЗИ КриптоПро CSP для аутентификации и защиты данных, передаваемых по собственным протоколам на основе TCP/IP и HTTPS.

Примеры WebClient и WebServerДля встраивания протокола TLS входят в комплект примеров, поставляемых вместе с Platform SDK.

Примеры использования средств криптографической защиты

СКЗИ КриптоПро CSP поставляется с тестовым программным обеспечением, содержащим примеры вызовов основных функций CryptoAPI 2.0. Большое количество примеров использования функций CryptoAPI 2.0, CAPICOM, Certificate Services содержится в документации MSDN и в инструментарии разработчика Platform SDK.

На сервере Крипто-Про ведется Форум по вопросам использования криптографических функций и сертификатов открытых ключей. Соответствующие конференции по отдельным темам ведутся на сервере Microsoft:

Rezume

СКЗИ КриптоПро CSP позволяет использовать стойкие сертифицированные средства криптографической защиты информации в составе обширного инструментария и программного обеспечения корпорации Microsoft, для реализации различных защищенных систем документооборота и электронной коммерции, на основе Инфраструктуры Открытых Ключей (Public Key Infrastructure), соответствующей международным рекомендациям X.509, RFC 3280.

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL