Прочитать на английском

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


Декодирование обернутых данных

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

декодирование зашифрованных данных

Последовательность действий для декодирования закрытых данных с помощью управления ключами при их транспортировке, как показано на предыдущем рисунке, следующим образом:

  • Извлекается указатель на цифрово обёрнутое сообщение.
  • Хранилище сертификатов открыто.
  • Из сообщения извлекается идентификатор получателя (мой идентификатор).
  • Идентификатор получателя используется для получения сертификата.
  • Закрытый ключ , связанный с этим сертификатом, извлекается.
  • Закрытый ключ используется для расшифровки симметричного(сеанса) ключа.
  • Алгоритм шифрования извлекается из сообщения.
  • С помощью закрытого ключа и алгоритма шифрования данные расшифровываются.

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

Расшифровка обернутого сообщения

  1. Получите указатель на закодированный BLOB-объект.
  2. Вызов CryptMsgOpenToDecode, передав необходимые аргументы.
  3. Вызовите CryptMsgUpdate один раз, передав дескриптор, полученный на шаге 2, и указатель на данные, которые необходимо декодировать. Это приводит к тому, что в зависимости от типа сообщения принимаются соответствующие меры в отношении сообщения.
  4. Вызовите CryptMsgGetParam, передав дескриптор, полученный на шаге 2 и CMSG_TYPE_PARAM, чтобы убедиться, что сообщение имеет тип данных конверта.
  5. Снова вызовите CryptMsgGetParam, передав CMSG_INNER_CONTENT_TYPE_PARAM, чтобы определить тип данных для внутреннего содержимого .
  6. Если внутренний тип данных контента данных, перейдите к расшифровке и декодированию содержимого. В противном случае выполните процедуру декодирования, соответствующую типу данных контента.
  7. Предполагая, что внутренний тип контента — "data", инициализировать структуру данных CMSG_CTRL_DECRYPT_PARA, затем вызвать CryptMsgControl, передавая CMSG_CTRL_DECRYPT и адрес структуры. Содержимое будет расшифровывается.
  8. Вызовите CryptMsgGetParam, передавая CMSG_CONTENT_PARAM, чтобы получить указатель на декодированные данные содержимого BLOB (строку типа BYTE).
  9. Вызовите CryptMsgClose, чтобы закрыть сообщение.

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

Пример программы C: кодирование огражденного подписанного сообщения