- •Структура и основные положения CryptoApi
- •Криптографические провайдеры CryptoApi
- •Работа с ключами с помощью CryptoApi
- •Симметричное шифрование с помощью CryptoApi
- •Аутентификация сообщений
- •1. Шифрование хеш-значения симметричным методом
- •2. Хеширование с использованием секретного значения
- •Электронная цифровая подпись с помощью CryptoApi
- •3. Шифрование хеш-значения асимметричным методом
- •Вычисление хешей с помощью CryptoApi
Симметричное шифрование с помощью CryptoApi
Для симметричного шифрования информации Microsoft CryptoAPI представляет целый ряд алгоритмов, реализуемых стандартными криптопровайдерами (смотри Таблицу 1). Размер ключа определяет криптографическую стойкость алгоритма. На сегодняшний день длина ключей в алгоритмах, входящих в состав стандартного криптопровайдера MS_DEF_PROV, считается недостаточной. Последний разрабатывался в то время, когда в США действовал запрет на экспорт стойких криптоалгоритмов. Пришедший ему на смену криптопровайдер MS_ENHANCED_PROV устранил это ограничение. Использование CryptoAPI позволяет легко перейти с одного криптопровайдера на другой – с помощью замены всего одного параметра при вызове функции CryptAcquireContext.
Для шифрования/дешифрования данных, независимо от выбранного алгоритма, в CryptoAPI используются функции CryptEncrypt и CryptDecrypt. Эти функции можно использовать для шифрования как одного блока информации, так и больших объемов данных. Следует иметь в виду, что при использовании блочных шифров размер зашифрованного сообщения может быть больше размера исходного текста, вплоть до длины одного шифроблока.
Таблица 1 Симметричные алгоритмы шифрования, реализованные в CryptoAPI
|
|
|
|
|
Алгоритм |
Провайдер |
Идентификатор ALG_ID |
Длина ключа, бит |
Размер блока, бит |
RC2 |
Base, Enhanced, AES |
CALG_RC2 |
40 |
64 |
RC4 |
Base |
CALG_RC4 |
40 |
– |
RC4 |
Enhanced, AES |
CALG_RC4 |
128 |
– |
DES |
Enhanced, AES |
CALG_DES |
56 |
64 |
2-key 3-DES |
Enhanced, AES |
CALG_3DES_112 |
112 |
64 |
3-key 3-DES |
Enhanced, AES |
CALG_3DES |
168 |
64 |
AES |
AES |
CALG_AES_128 |
128 |
128 |
AES |
AES |
CALG_AES_192 |
192 |
128 |
AES |
AES |
CALG_AES_256 |
256 |
128 |
Рассмотрим пример использования функций шифрования CryptoAPI:
|
BYTE *pbData = NULL; DWORD dwDataOutLen, dwDataInLen; //размер блока исходного текста кратен размеру блока алгоритма dwDataInLen = 1000 - 1000 % ENCRYPT_BLOCK_SIZE; //размер блока шифротекста учитывает размер заполнителя dwDataOutLen = dwDataInLen + ENCRYPT_BLOCK_SIZE; if ((pbData = new BYTE [dwDataOutLen + 1]) == NULL) return 0; do { dwCount = fread(pbData, 1, dwDataOutLen, *hSource); if (ferror(*hSource)) break; bFinal = (feof(*hSource) ? TRUE : FALSE); if (!CryptEncrypt(hKey,hHash,bFinal,0, pbData,&dwDataInLen,dwDataOutLen)) break; fwrite(pbData, 1, dwDataInLen, *hDestination); if(ferror(*hDestination)) break; } while (!feof(*hSource)); if(pbData) delete []pbData; |
В приведенном примере выполняется шифрование файла, открытого с помощью идентификатора hSource, результат помещается в файл hDestination. Параметр hHash позволяет параллельно с шифрованием/дешифрованием проводить хеширование данных для последующей электронной подписи или ее проверки. Флаг bFinal определяет, является ли шифруемый блок данных последним. Он необходим, поскольку для последнего блока всегда выполняется определенная деинициализация алгоритма (освобождаются внутренние структуры) и многие алгоритмы производят добавление (и проверку корректности при дешифровании) заполнителя после основных данных. Параметры pbData и dwDataLen задают адрес буфера и размер шифруемых данных. Для непоследнего блока данных (Final = FALSE) размер данных должен быть всегда кратен размеру шифруемого алгоритмом блока (для 3DES и DES этот размер равен 64 битам). Для последнего блока допускается нарушение этого условия. Заметим, что зашифрованные данные помещаются в тот же самый буфер поверх исходных.
