Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Хэшированные данные состоят из содержимого любого типа и хэша этого содержимого. Его можно использовать, только если необходимо подтвердить, что содержимое сообщения не было изменено с момента создания хэша.
При создании хэшированного сообщения может быть несколько хэш-алгоритмов и нескольких хэшей. На следующем рисунке показаны задачи, необходимые для кодирования хэшированного сообщения. Процедура описана в тексте, следующем за иллюстрацией.
Создание хэшированного сообщения
- Получите указатель на данные, которые будут хэшироваться.
- Выберите хэш-алгоритм, который будет использоваться.
- Пропустите данные через хэш-функцию, используя хэш-алгоритм.
- Включите исходные данные, хэшированные алгоритмы и хэши в кодированном сообщении.
Чтобы использовать функции сообщения низкого уровня для выполнения только что описанных задач, используйте следующую процедуру.
Хэширование и кодирование сообщения с помощью функций сообщений низкого уровня
Создайте или извлеките содержимое, которое нужно хэшировать.
Получите поставщика шифрования.
Инициализировать структуру CMSG_HASHED_ENCODE_INFO.
Вызовите CryptMsgCalculateEncodedLength, чтобы получить размер кодированного объекта сообщения BLOB. Выделите память для него.
Вызовите CryptMsgOpenToEncode, передав CMSG_HASHED для параметра dwMsgType и указатель на CMSG_HASHED_ENCODE_INFO для параметра pvMsgEncodeInfo. В результате этого вызова вы получите дескриптор открытого сообщения.
Вызов CryptMsgUpdate, передавая дескриптор, полученный на шаге 5, и указатель на данные, которые должны быть хэшированы и закодированы. Эту функцию можно вызывать столько раз, сколько необходимо для завершения процесса кодирования.
Вызовите CryptMsgGetParam, передавая дескриптор, полученный на шаге 5, и соответствующие типы параметров для доступа к нужным, закодированным данным. Например, передайте CMSG_CONTENT_PARAM, чтобы получить указатель на все сообщение PKCS #7.
Если результат этого кодирования используется в качестве внутренних данных для другого закодированного сообщения, как вложенного сообщения, необходимо передать CMSG_BARE_CONTENT_PARAM. Пример, показывающий это, см. в разделе альтернативный код для кодированияконвертированного сообщения.
Результатом этой процедуры является закодированное сообщение, содержащее исходные данные, хэш-алгоритмы и хэш- этих данных. Указатель на закодированное сообщение BLOB получается на шаге 7.
Следующие две процедуры декодируются, а затем проверяют хэшированные данные.
Декодирование хэшированных данных
- Получите указатель на закодированный BLOB-объект.
- Вызов CryptMsgOpenToDecode, передав необходимые аргументы.
- Вызовите CryptMsgUpdate один раз, передав дескриптор, полученный на шаге 2, и указатель на данные, которые необходимо декодировать. Это приводит к тому, что на сообщение будут приняты соответствующие действия, в зависимости от его типа.
- Вызовите CryptMsgGetParam, передав дескриптор, полученный на шаге 2, и соответствующие типы параметров для доступа к нужным декодируемым данным. Например, передайте CMSG_CONTENT_PARAM, чтобы получить указатель на декодированное содержимое.
Проверка хэша
- Вызовите CryptMsgControl, передав CMSG_CTRL_VERIFY_HASH для проверки хэшей.
- Вызовите CryptMsgClose, чтобы закрыть сообщение.
Пример программы см. в разделе Пример программы C: кодировка и декодирование хэшированного сообщения.