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

CryptEncrypt

CryptEncrypt — это функция Windows CryptoAPI (Cryptographic Application Programming Interface), предназначенная для шифрования данных с использованием указанного криптографического ключа. Она входит в состав набора криптографических примитивов, предоставляемых операционными системами семейства Microsoft Windows, и используется для защиты конфиденциальной информации путём преобразования открытого текста в шифротекст.

История и контекст

Функция CryptEncrypt была введена в составе CryptoAPI 1.0, выпущенной вместе с операционной системой Microsoft Windows NT 4.0 в 1996 году. CryptoAPI стала первой стандартизированной криптографической библиотекой, встроенной непосредственно в операционную систему Windows, что позволило разработчикам реализовывать шифрование без необходимости интеграции сторонних библиотек.

В последующих версиях Windows (2000, XP, Vista, 7, 8, 10, 11) функция CryptEncrypt сохранялась для обратной совместимости, однако с выходом Windows Vista (2006) была представлена более современная криптографическая платформа — Cryptography Next Generation (CNG), которая постепенно вытесняет классическую CryptoAPI. Тем не менее, CryptEncrypt остаётся доступной во всех актуальных версиях Windows и широко используется в унаследованных приложениях.

Описание функции

Функция CryptEncrypt входит в состав Cryptographic Service Providers (CSP) — модулей, реализующих конкретные криптографические алгоритмы. Вызов функции осуществляется через дескриптор криптографического ключа, полученный ранее с помощью функций CryptGenKey или CryptImportKey.

Прототип функции (C/C++)

``c BOOL CryptEncrypt( HCRYPTKEY hKey, HCRYPTHASH hHash, BOOL Final, DWORD dwFlags, BYTE pbData, DWORD pdwDataLen, DWORD dwBufLen ); ``

Параметры

  • hKey — дескриптор ключа шифрования, полученный от CSP.
  • hHash — дескриптор хеш-объекта (опционально). Если передаётся действительный хеш, функция одновременно шифрует данные и вычисляет хеш (режим хеширования с шифрованием). Может быть NULL.
  • Final — флаг, указывающий, является ли текущий блок данных последним. Если TRUE, функция выполняет финальные операции (например, дополнение до размера блока).
  • dwFlags — зарезервированный параметр, должен быть равен 0.
  • pbDataуказатель на буфер с открытым текстом для шифрования (на входе) или на буфер с шифротекстом (на выходе).
  • pdwDataLen — указатель на переменную, содержащую длину открытого текста в байтах (на входе). После вызова содержит длину шифротекста.
  • dwBufLen — размер буфера pbData в байтах.

Возвращаемое значение

При успешном выполнении возвращает TRUE (ненулевое значение). При ошибке — FALSE. Код ошибки можно получить с помощью функции GetLastError.

Алгоритмы и режимы шифрования

Функция CryptEncrypt поддерживает широкий спектр симметричных алгоритмов, реализуемых конкретным CSP:

  • RC2блочный шифр с переменной длиной ключа (до 128 бит).
  • RC4 — поточный шифр (до 128 бит).
  • DES — блочный шифр с 56-битным ключом.
  • 3DES (Triple DES) — тройной DES с эффективной длиной ключа 112 или 168 бит.
  • AES (Rijndael) — современный блочный шифр с длиной ключа 128, 192 или 256 бит (доступен в CSP начиная с Windows XP SP3 и Windows Vista).

Режимы шифрования зависят от CSP и алгоритма. Наиболее распространённые:

  • ECB (Electronic Codebook) — каждый блок шифруется независимо.
  • CBC (Cipher Block Chaining) — каждый блок XOR-ится с предыдущим шифротекстом.
  • CFB (Cipher Feedback) — преобразует блочный шифр в поточный.
  • OFB (Output Feedback) — генерация ключевого потока.
  • CTS (Cipher Text Stealing) — вариант CBC для данных, не кратных размеру блока.

Принцип работы

  1. Подготовка буфера: вызывающая сторона выделяет буфер, в который помещает открытый текст. Размер буфера должен быть достаточным для размещения шифротекста, который может быть больше исходных данных из-за дополнения (padding).
  2. Вызов функции: передаётся дескриптор ключа, данные и их длина. Если установлен флаг Final, функция добавляет необходимое дополнение (обычно по стандарту PKCS#7).
  3. Шифрование: CSP выполняет преобразование данных в соответствии с выбранным алгоритмом и режимом.
  4. Возврат результата: функция записывает шифротекст в тот же буфер (заменяя открытый текст) и обновляет переменную длины.

Типичные ошибки и ограничения

  • Недостаточный размер буфера: если dwBufLen меньше, чем необходимо для размещения шифротекста, функция завершается с ошибкой NTE_BAD_DATA.
  • Неправильный ключ: использование ключа, несовместимого с алгоритмом CSP, приводит к ошибке NTE_BAD_KEY.
  • Режим Final: если функция вызывается с Final = TRUE для данных, не кратных размеру блока, она автоматически добавляет дополнение. Если Final = FALSE, данные должны быть кратны размеру блока.
  • Потоковое шифрование: для поточных шифров (RC4) дополнение не требуется, и флаг Final не влияет на размер выходных данных.

Пример использования (псевдокод)

```c HCRYPTPROV hProv = 0; HCRYPTKEY hKey = 0; BYTE pbData[1024]; DWORD dwDataLen = 512; DWORD dwBufLen = 1024;

// Получение контекста CSP CryptAcquireContext(&hProv, NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, 0); // Генерация ключа CryptGenKey(hProv, CALG_RC4, CRYPT_EXPORTABLE, &hKey); // Шифрование данных CryptEncrypt(hKey, 0, TRUE, 0, pbData, &dwDataLen, dwBufLen); // Очистка CryptDestroyKey(hKey); CryptReleaseContext(hProv, 0); ```

Критика и недостатки

  • Устаревшая архитектура: CryptoAPI является закрытой и непрозрачной системой, что затрудняет аудит безопасности.
  • Ограниченная поддержка современных алгоритмов: в классической CryptoAPI отсутствует поддержка современных режимов (GCM, CCM) и аутентифицированного шифрования.
  • Проблемы с управлением ключами: функция не предоставляет механизмов для безопасного хранения ключей в памяти.
  • Зависимость от CSP: поведение функции может различаться в зависимости от установленного провайдера, что снижает переносимость кода.
  • Уязвимости в реализации: в некоторых версиях Windows были обнаружены уязвимости в CSP (например, проблема с генерацией случайных чисел в Windows 2000).

Переход на Cryptography Next Generation (CNG)

Начиная с Windows Vista, Microsoft рекомендует использовать CNG для новых разработок. В CNG аналогом CryptEncrypt является функция BCryptEncrypt, которая предоставляет:

  • Поддержку современных алгоритмов и режимов (AES-GCM, AES-CCM, ChaCha20-Poly1305).
  • Аутентифицированное шифрование.
  • Более гибкую архитектуру с возможностью загрузки сторонних провайдеров.
  • Улучшенную безопасность и аудит.

Однако для обеспечения обратной совместимости с унаследованными системами CryptEncrypt остаётся востребованной.

Источники

  • Microsoft Docs: CryptEncrypt function (Windows)
  • Microsoft Docs: Cryptographic Service Providers (CSP)
  • Microsoft Docs: Cryptography Next Generation (CNG)
  • MSDN Magazine: "CryptoAPI and CNG: The Evolution of Cryptography in Windows"
  • RFC 2315: PKCS #7: Cryptographic Message Syntax Version 1.5
  • "Windows Internals" (Part 1, 7th Edition) — Pavel Yosifovich, Mark Russinovich, David Solomon, Alex Ionescu

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

На главную BFOmetr →