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


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

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

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

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

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

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

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

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

  1. Создайте или извлеките содержимое, которое нужно хэшировать.

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

  3. Инициализировать структуру CMSG_HASHED_ENCODE_INFO.

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

  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.

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

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

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

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

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

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

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