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

Cng (Cryptography api: Next Generation) – использование криптографии в Windows Vista.

Введение.

Интерфейс был представлен в Windows Vista и предназначен для замены устаревшего криптографического интерфейса CryptoAPI (CAPI), который появился еще в ранних версиях Windows NT и Windows 95. Интерфейс CNG поддерживает все алгоритмы, которые предоставлял CryptoAPI, но вместе с этим содержит большое количество новых алгоритмов и является более гибким, чем предшественник.

Архитектура CNG:

Интерфейс состоит из двух больших подмножеств: BCrypt (BaseCrypt) и NCrypt (NewCrypt). BCrypt обеспечивает примитивы криптографии – такие, как: функции хэширования, генерация случайных чисел, цифровые подписи, ключи шифрования. Эти примитивы могут быть доступны для приложений, работающих в пользовательском режиме, а также для приложений режима ядра. NCrypt же может быть доступным только для приложений пользовательского режима и необходим для обеспечения средствами хранения ключей.

Подходы к примитивам криптографии интерфейса CNG:

  1. Примитивы есть набор логических объектов, предоставляющих методы (которые могут быть вызваны) и свойства (могут быть запрошены и иногда изменены). В число этих объектов входят:

  • Поставщики алгоритмов (отвечают за алгоритмы генерации случайных чисел, инициализацию объектов хэширования и ключей и т.п.)

  • Функции хэширования

  • Ключи (могут быть использованы для создания цифровых подписей и проверки контрольных сумм)

  • Секретные соглашения и т.д.

  1. CNG – посредник для операций криптографии.

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

Поставщики (провайдеры) алгоритмов

Являются своеобразным универсальным интерфейсом CNG. Как можно догадаться, исходя из названия, поставщик алгоритмов – это некий инструмент, который позволяет использовать определенный алгоритм(-ы).

Для инициализации поставщика алгоритмов используется функция BCryptOpenAlgorithmProvider:

BCRYPT_HANDLE algorithmProvider = 0;

NTSTATUS status = ::BCryptOpenAlgorithmProvider(

&algorithmProvider, algorithmName,

implementation, flags);

if (NT_SUCCESS(status))

{

// Используем поставщик алгоритмов

}

В большинстве случаев для параметров реализации и флагов передается нулевое значение.

Завершение работы с провайдером алгоритмов – выгрузка его из памяти:

status = ::BCryptCloseAlgorithmProvider (algorithmProvider, flags);

Генерация случайных чисел

Возможность генерировать случайные числа предоставляет функция BCryptGenRandom:

BCRYPT_HANDLE algorithmProvider = 0;

NT_VERIFY(::BCryptOpenAlgorithmProvider(

&algorithmProvider,

BCRYPT_RNG_ALGORITHM, //название требуемого алгоритма – генерации случайных чисел в данном примере

0,

0));

UINT random = 0;

NT_VERIFY(::BCryptGenRandom(

algorithmProvider, //дескриптор провайдера

reinterpret_cast<PUCHAR>(&random), //буфер для записи числа

sizeof(UINT), //размер буфера

0)); //флаг

Для обеспечения дополнительной энтропии при генерации случайных чисел в качестве флага можно установить значение BCRYPT_RNG_USE_ENTROPY_IN_BUFFER.

Функции хэширования

Как и генерация случайных чисел, функции хэширования имеют большое значение в обеспечении функций и мер безопасности для многих задач. В CNG функции хэширования представляются объектами.

Прежде чем создать новый объект хэширования, необходимо выделить буфер памяти, который функция хэширования будет использоваться для обработки. Размер буфера, необходимый для создания объекта хэша, является свойством поставщика алгоритма, и идентификатор BCRYPT_OBJECT_LENGTH предоставляет имя свойства для создания запроса. Свойства поставщика алгоритма можно получить с помощью функции BCryptGetProperty:

BCRYPT_HANDLE algorithmProvider = 0;

NT_VERIFY(::BCryptOpenAlgorithmProvider(

&algorithmProvider,

BCRYPT_SHA256_ALGORITHM,

0,

0));

ULONG hashBufferSize = 0;

ULONG bytesCopied = 0;

NT_VERIFY(::BCryptGetProperty(

algorithmProvider,

BCRYPT_OBJECT_LENGTH, //имя свойства – размер объекта

reinterpret_cast<PUCHAR>(&hashBufferSize), //буфер для записи значения свойства

sizeof(ULONG),

&bytesCopied, 0));

Стоит отметить, что для установки значений свойств используется функция BCryptSetProperty (управление свойствами объектов происходит посредством NCrypt).

Теперь создание объекта хэширования можно провести после выделения участка памяти для него:

Buffer hashBuffer;

NT_VERIFY(hashBuffer.Create(hashBufferSize));

BCRYPT_HANDLE hash = 0;

NT_VERIFY(::BCryptCreateHash(algorithmProvider,

&hash, // дескритор объекта хэша

hashBuffer.GetData(), // буфер хэша

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

0, // аргумент секретных данных

0, // размер секретных данных

0)); // флаги

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

По завершении работы с объектом хэша необходимо уничтожить его с помощью функции BCryptDestroyHash, а затем освободить память буфера объекта хэша.

В качестве примеров работы с объектом хэша можно продемонстрировать:

  • Однонаправленное хэширование буфера

NT_VERIFY(::BCryptHashData(hash, buffer, bytesRead, 0)); //аргументы: дескриптор объекта хэша, буфер и его размер, флаги

  • Вычисление результирующего значения хэша

Buffer hashValue;

NT_VERIFY(hashValue.Create(hashValueSize));

NT_VERIFY(::BCryptFinishHash(hash, //дескриптор объекта хэша

hashValue.GetData(), //буфер итогового значения

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

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