Открыть сервис

wincrypt.h

wincrypt.h — это заголовочный файл для языка программирования C/C++, входящий в состав Microsoft Windows SDK (Software Development Kit). Он предоставляет объявления функций, структур данных, констант и типов, необходимых для использования встроенных криптографических служб операционной системы Windows, известных под общим названием CryptoAPI (Cryptographic Application Programming Interface). Файл wincrypt.h является основным интерфейсом для разработчиков, желающих реализовать в своих приложениях шифрование, хеширование, создание и проверку цифровых подписей, управление сертификатами и другие криптографические операции без использования сторонних библиотек.

История

Криптографическая инфраструктура Windows начала формироваться с выходом Windows NT 4.0 (1996 год), когда компания Microsoft представила CryptoAPI 1.0. Заголовочный файл wincrypt.h появился одновременно с первыми версиями API и эволюционировал вместе с ним. В Windows 2000 была добавлена поддержка CryptoAPI 2.0, включающая расширенные возможности для работы с сертификатами X.509 и инфраструктурой открытых ключей (PKI). В Windows Vista и Windows Server 2008 была представлена более современная криптографическая библиотека Cryptography API: Next Generation (CNG), однако для обратной совместимости wincrypt.h продолжает поддерживать как старый CryptoAPI, так и новые функции CNG. Последние значительные обновления файла связаны с добавлением поддержки эллиптической криптографии (ECDSA, ECDH) в Windows 7 и последующих версиях, а также с интеграцией с шифрованием диска BitLocker и защитой данных через DPAPI (Data Protection API).

Основные компоненты

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

Криптографические провайдеры (CSP)

CryptoAPI использует модель криптографических провайдеров (Cryptographic Service Provider, CSP) — программных или аппаратных модулей, реализующих конкретные алгоритмы. Wincrypt.h содержит объявления для работы с CSP: функции для открытия и закрытия провайдера (CryptAcquireContext, CryptReleaseContext), генерации ключей (CryptGenKey), импорта и экспорта ключей (CryptImportKey, CryptExportKey). Типичные CSP, поддерживаемые в Windows, включают Microsoft Base Cryptographic Provider, Microsoft Enhanced Cryptographic Provider и Microsoft Strong Cryptographic Provider, которые различаются набором поддерживаемых алгоритмов и длиной ключей.

Хеширование и цифровые подписи

Для работы с хеш-функциями wincrypt.h предоставляет функции CryptCreateHash, CryptHashData, CryptGetHashParam. Поддерживаемые алгоритмы хеширования включают MD2, MD4, MD5, SHA-1, SHA-256, SHA-384, SHA-512 (последние три — через CNG). Для создания и проверки цифровых подписей используются функции CryptSignHash и CryptVerifySignature, которые работают с асимметричными ключами (RSA, DSA, ECDSA).

Шифрование и расшифрование

Симметричное шифрование реализуется через функции CryptEncrypt и CryptDecrypt. Поддерживаются алгоритмы RC2, RC4, DES, 3DES, AES (в современных версиях). Асимметричное шифрование выполняется с помощью CryptEncrypt с использованием открытого ключа и CryptDecrypt с закрытым ключом. Файл определяет константы для указания режимов шифрования (CBC, ECB, CFB, OFB) и дополнения (PKCS7, Zeros, ANSI X.923).

Сертификаты и PKI

Одна из наиболее обширных частей wincrypt.h связана с управлением сертификатами X.509. Включает структуры для представления сертификатов (CERT_INFO, CERT_CONTEXT), списков отзыва (CRL), запросов на сертификат (PKCS#10). Функции для работы с хранилищами сертификатов (CertOpenStore, CertAddCertificateContextToStore, CertFindCertificateInStore) позволяют управлять сертификатами в системных хранилищах (личные, доверенные корневые центры, промежуточные центры). Также поддерживается проверка цепочек сертификатов через CertGetCertificateChain и CertVerifyCertificateChainPolicy.

Криптография следующего поколения (CNG)

Начиная с Windows Vista, wincrypt.h включает объявления для CNG, которая является более гибкой и современной альтернативой CryptoAPI. CNG использует модель поставщиков ключей (Key Storage Provider, KSP) и алгоритмов (Algorithm Provider). Функции, такие как BCryptOpenAlgorithmProvider, BCryptGenerateSymmetricKey, NCryptCreatePersistedKey, позволяют работать с новыми алгоритмами (AES-GCM, ECDH, SHA-3) и аппаратными модулями безопасности (TPM). Wincrypt.h также содержит структуры для поддержки шифрования на основе эллиптических кривых (ECC) и протокола Диффи-Хеллмана.

Ключевые структуры данных

Wincrypt.h определяет множество структур, используемых для обмена данными между приложением и криптографическими службами. Наиболее важные из них:

  • CRYPT_INTEGER_BLOB — универсальная структура для хранения двоичных данных (например, ключей или сертификатов) с полями cbData (размер) и pbData (указатель на данные).
  • CRYPT_ALGORITHM_IDENTIFIER — идентификатор алгоритма, содержащий OID (Object Identifier) и параметры.
  • CERT_INFO — полная информация о сертификате X.509, включая серийный номер, издателя, срок действия, открытый ключ.
  • CRYPT_KEY_PROV_INFO — информация о ключевом контейнере провайдера CSP.
  • BCRYPT_ALG_HANDLE — дескриптор алгоритма для CNG.

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

Типичный сценарий применения wincrypt.h — шифрование файла с использованием симметричного алгоритма AES. Для этого приложение вызывает CryptAcquireContext для получения дескриптора CSP, генерирует сеансовый ключ через CryptGenKey, шифрует данные с помощью CryptEncrypt и сохраняет зашифрованный результат. Другой распространённый пример — проверка цифровой подписи исполняемого файла или документа: приложение загружает сертификат из хранилища, извлекает открытый ключ, вычисляет хеш данных и вызывает CryptVerifySignature.

Ограничения и критика

Несмотря на широкое распространение, CryptoAPI и wincrypt.h имеют ряд недостатков. Во-первых, API считается устаревшим по сравнению с CNG: он не поддерживает современные алгоритмы (например, AES-GCM изначально отсутствовал) и имеет ограничения на длину ключей (до 1024 бит для RSA в базовом провайдере). Во-вторых, модель CSP является закрытой: сторонние разработчики могут создавать свои CSP, но это требует глубоких знаний и сертификации Microsoft. В-третьих, безопасность реализации некоторых функций (например, генерации случайных чисел в ранних версиях) подвергалась критике. CNG решает многие из этих проблем, но требует переписывания кода. Кроме того, wincrypt.h не поддерживает кроссплатформенность — он доступен только в Windows, что ограничивает его использование в многоплатформенных проектах.

Применение

Wincrypt.h используется в широком спектре приложений: от системных утилит Windows (например, certmgr.msc для управления сертификатами) до стороннего программного обеспечения, требующего криптографической защиты. Он применяется в веб-браузерах (для HTTPS-соединений), почтовых клиентах (для шифрования S/MIME), программах для электронной подписи документов, антивирусах (для проверки цифровых подписей файлов) и системах управления цифровыми правами (DRM). Разработчики на языках C, C++, C# (через P/Invoke) и даже Python (через библиотеку pywin32) могут использовать wincrypt.h для интеграции криптографии в свои проекты.

Источники

  • Microsoft Docs: «Cryptography API (CryptoAPI)» (раздел MSDN).
  • Microsoft Docs: «Cryptography API: Next Generation (CNG)» (раздел MSDN).
  • Заголовочный файл wincrypt.h из Windows SDK (версия 10.0.22621.0).
  • Книга: «Windows Security: A Practical Guide» (автор: John D. Howard, 2005).
  • Статья: «A History of Windows Cryptography» (журнал «Windows IT Pro», 2008).

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →