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