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 для данных, не кратных размеру блока.
Принцип работы
- Подготовка буфера: вызывающая сторона выделяет буфер, в который помещает открытый текст. Размер буфера должен быть достаточным для размещения шифротекста, который может быть больше исходных данных из-за дополнения (padding).
- Вызов функции: передаётся дескриптор ключа, данные и их длина. Если установлен флаг Final, функция добавляет необходимое дополнение (обычно по стандарту PKCS#7).
- Шифрование: CSP выполняет преобразование данных в соответствии с выбранным алгоритмом и режимом.
- Возврат результата: функция записывает шифротекст в тот же буфер (заменяя открытый текст) и обновляет переменную длины.
Типичные ошибки и ограничения
- Недостаточный размер буфера: если 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 →