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

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.

 

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