Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lab1-theory.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
165 Кб
Скачать
☆

Симметричное шифрование с помощью 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 битам). Для последнего блока допускается нарушение этого условия. Заметим, что зашифрованные данные помещаются в тот же самый буфер поверх исходных.

 

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]