- •Структура и основные положения CryptoApi
- •Криптографические провайдеры CryptoApi
- •Работа с ключами с помощью CryptoApi
- •Симметричное шифрование с помощью CryptoApi
- •Аутентификация сообщений
- •1. Шифрование хеш-значения симметричным методом
- •2. Хеширование с использованием секретного значения
- •Электронная цифровая подпись с помощью CryptoApi
- •3. Шифрование хеш-значения асимметричным методом
- •Вычисление хешей с помощью CryptoApi
3. Шифрование хеш-значения асимметричным методом
Хеш-значение сообщения передается в зашифрованном закрытым ключом отправителя KS виде, составляя цифровую подпись сообщения (смотри рисунок ниже). Получатель может проверить правильность цифровой подписи, используя открытый ключ KO отправителя для дешифрования хеш-значения. Это доказывает, что тот, кто указан в качестве отправителя сообщения, является его создателем и что сообщение не было впоследствии изменено другим человеком, так как только отправитель владеет своим закрытым ключом, использованным для формирования цифровой подписи.
Аутентификация асимметричным шифрованием хеш-значения
Такой подход имеет два преимущества: он кроме аутентификации сообщений обеспечивает также цифровую подпись и не требует доставки секретного ключа сообщающимся сторонам. Кроме того, он защищает от «ренегатства» – отказа лица, поставившего подпись, от нее в последующем.
Вычисление хешей с помощью CryptoApi
Хеш создается вызовом функции CryptCreateHash, принимающей на входе контекст криптопровайдера, идентификатор алгоритма (CALG_MD5 или CALG_SHA) и дескриптор ключа (для автоматического вычисления кодов аутентификации MAC и HMAC). После этого хеш можно вычислять как явно, используя функцию CryptHashData, так и неявно, передавая дескриптор хеша в функцию CryptEncrypt. Вычисление хеша (так же, как и шифрование) можно производить по частям (например, читая данные в буфер и хешируя содержимое буфера в цикле). После окончания хеширования можно либо подписать хеш, либо получить его значение вызовом функции CryptGetHashParam с параметром HP_HASHVAL. После получения значения хеш использовать уже нельзя. Его нужно разрушить вызовом CryptDestroyHash. Проверка хеша производится точно так же, как и его создание, – нужно вычислить хеш и сверить полученное значение с сохраненным:
|
HCRYPTHASH hHash; CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash); CryptHashData(hHash,(BYTE *)&data, dwLen, 0); BYTE newHash[16]; dwLen = 16; CryptGetHashParam(hHash, HP_HASHVAL, newHash, &dwLen, 0); if(!memcmp(newHash, oldHash, 16)) { //хеш верен } else { //хеш не верен } CryptDestroyHash(hHash); |
Электронная цифровая подпись с помощью CryptoApi
Функции CryptoAPI позволяют подписывать только хеш-значения, но не сами данные. Хеш предварительно должен быть вычислен, а затем подписан с помощью функции CryptSignHash на закрытом ключе (AT_KEYEXCHANGE), находящемся в контейнере криптопровайдера. Проверка подписи осуществляется на открытом ключе AT_SIGNATURE, который нужно предварительно импортировать:
|
CryptSignHash(hHash, AT_SIGNATURE, NULL, 0, buf, &dwLen); if(CryptVerifySignature(hHash, buf, 1024/8, hPubKey, NULL, 0)) { // Верная подпись } else { // Неверная подпись или хеш } |
Размер подписи равняется размеру ключа асимметричного алгоритма, использованного для ее постановки (RSA или DSS). Вычисление/проверка подписи RSA и DSS выполняется одинаково, однако для работы с подписью DSS нужно использовать Microsoft DSS Cryptographic Provider (MS_DEF_DSS_PROV, тип PROV_DSS). Кроме того, подпись DSS работает только с алгоритмом хеширования SHA.
