Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CNG.doc
Скачиваний:
3
Добавлен:
06.08.2019
Размер:
79.87 Кб
Скачать

0)); //Флаги

Вспомогательная функция BCryptSetProperty (уже упомянутая ранее) может применяться для установки различных свойств ключей, зависящих от конкретного алгоритма.

Для завершения создания объекта ключа необходимо вызвать функцию BCryptFinalizeKeyPair (key, 0);

Далее возможно шифрование и расшифровывание данных с помощью уже известных функций BCryptEncrypt и BCryptDecrypt.

Цифровые подписи и проверка

Асимметричная криптография зачастую применяется для создания цифровых подписей, которые могут быть активно использованы системой Windows для подтверждения подлинности сообщений, исполняемых модулей и сборок. Создаются цифровые подписи с помощью закрытого ключа, а проверяются с использованием доступного открытого ключа.

Создание цифровых подписей, а также и их проверка являются несложным механизмом, который требует выполнения предварительно ряда операций (определение данных, которые необходимо подписать, затем хэширование этих данных).

Для вычисления подписи необходимо дважды вызвать функцию BCryptSignHash (при первом вызове вычисляется размер результирующей подписи, при втором – соответственно само вычисление цифровой подписи):

ULONG signatureSize = 0;

NT_VERIFY(::BCryptSignHash(keyPair,

0, //доп. информация о заполнении

hashValue.GetData(), //данные хэша

hashValue.GetSize(), //размер буфера хэша

0, // буфер для выходного значения

0, // размер буфера

&signatureSize, //предполагаемый размер буфера

0)); // флаги

Buffer signature;

NT_VERIFY(signature.Create(signatureSize));

NT_VERIFY(::BCryptSignHash(keyPair,

0,

hashValue.GetData(),

hashValue.GetSize(),

signature.GetData(),

signature.GetSize(),

&signatureSize,

0)); // флаги

Стоит отметить, что в зависимости от величины значения хэша и используемого алгоритма может стать необходимым указание аргумента в поле заполнения (доп. информация).

Идея проверки цифровой подписи состоит в том, чтобы вычислить хэш независимо, а затем передавать функции проверки подписи BCryptVerifySignature это значение хэша, открытый ключ подписавшего и саму полученную подпись для проверки. Функция проверки возвращает значение STATUS_SUCCESS, если подпись соответствует значению хэша, и STATUS_INVALID_SIGNATURE в противном случае:

NTSTATUS status = ::BCryptVerifySignature(publicKey, //открытый ключ

0, // доп. информация

hashValue.GetData(), //буфер со значением хэша

hashValue.GetSize(), //размер буфера

signature.GetData(), //буфер с подписью

signature.GetSize(), //размер буфера

0); // флаги

Заключение.

Подводя итоги, можно выделить основные шаги технологии использования CNG в общем случае:

  1. Открыть соединение с поставщиком алгоритмов

  2. Получить/установить параметры алгоритма

  3. Создание/импорт ключа шифрования

  4. Кодирование с помощью выбранного алгоритма

  5. Закрыть соединение с поставщиком алгоритмов

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