Поделиться через


Кодирование и декодирование хэшированного сообщения

Хэшированные данные состоят из содержимого любого типа и хэша содержимого. Его можно использовать, если необходимо только подтвердить, что содержимое сообщения не было изменено с момента создания хэша.

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

создание хэшированного сообщения

Создание хэшированного сообщения

  1. Получение указателя на хэшированные данные.
  2. Выберите используемый хэш-алгоритм.
  3. Поместите данные через хэш-функцию с помощью хэш-алгоритма.
  4. Включите исходные данные для хэширования, алгоритмы хэширования и хэши в закодированное сообщение.

Чтобы использовать низкоуровневые функции сообщений для выполнения только что описанных задач, используйте следующую процедуру.

Хэширование и кодирование сообщения с помощью низкоуровневых функций сообщений

  1. Создание или получение хэшированного содержимого.

  2. Получение поставщика служб шифрования.

  3. Инициализируйте структуру CMSG_HASHED_ENCODE_INFO .

  4. Вызовите CryptMsgCalculateEncodedLength , чтобы получить размер большого двоичного объекта закодированного сообщения. Выделите для него память.

  5. Вызовите CryptMsgOpenToEncode, передав CMSG_HASHED для параметра dwMsgType и указатель на CMSG_HASHED_ENCODE_INFO для параметра pvMsgEncodeInfo . В результате этого вызова вы получаете дескриптор для открытого сообщения.

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

  7. Вызовите CryptMsgGetParam, передав дескриптор, полученный на шаге 5, и соответствующие типы параметров для доступа к нужным закодированным данным. Например, передайте CMSG_CONTENT_PARAM, чтобы получить указатель на все сообщение PKCS 7 .

    Если результат этой кодировки должен использоваться в качестве внутренних данных для другого закодированного сообщения, например конвертированного сообщения, необходимо передать CMSG_BARE_CONTENT_PARAM. Пример, демонстрирующий это, см. в разделе Альтернативный код для кодирования конвертированного сообщения.

  8. Закройте сообщение, вызвав CryptMsgClose.

Результатом этой процедуры является закодированное сообщение, содержащее исходные данные, алгоритмы хэширования и хэш этих данных. Указатель на закодированный большой двоичный объект сообщения получен на шаге 7.

Следующие две процедуры декодируют и проверяют хэшированные данные.

Декодирование хэшированных данных

  1. Получение указателя на закодированный BLOB-объект.
  2. Вызовите CryptMsgOpenToDecode, передав необходимые аргументы.
  3. Вызовите CryptMsgUpdate один раз, передав дескриптор, полученный на шаге 2, и указатель на декодируемые данные. Это приводит к выполнению соответствующих действий с сообщением в зависимости от типа сообщения.
  4. Вызовите CryptMsgGetParam, передав дескриптор, полученный на шаге 2, и соответствующие типы параметров для доступа к нужным декодируемым данным. Например, передайте CMSG_CONTENT_PARAM, чтобы получить указатель на декодированное содержимое.

Проверка хэша

  1. Вызовите CryptMsgControl, передав CMSG_CTRL_VERIFY_HASH для проверки хэшей.
  2. Вызовите CryptMsgClose , чтобы закрыть сообщение.

Пример программы см. в разделе Пример программы C: кодирование и декодирование хэшированного сообщения.