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

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

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

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

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

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

Декодирование конвертированного сообщения

  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, чтобы получить указатель на большой двоичный объект декодированных данных содержимого (строка BYTE ).
  9. Вызовите CryptMsgClose , чтобы закрыть сообщение.

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

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