Декодирование конвертированных данных
Общие задачи, необходимые для декодирования конвертированного сообщения, показаны на следующем рисунке и описаны в следующем списке.
Последовательность событий для декодирования конвертированных данных с помощью управления ключами транспорта ключа, как показано на предыдущем рисунке, выглядит следующим образом:
- Извлекается указатель на сообщение с цифровой оболочкой .
- Откроется хранилище сертификатов .
- Из сообщения извлекается идентификатор получателя (мой идентификатор).
- Идентификатор получателя используется для получения сертификата.
- Извлекается закрытый ключ , связанный с этим сертификатом.
- Закрытый ключ используется для расшифровки симметричного (сеансового) ключа.
- Алгоритм шифрования извлекается из сообщения.
- С помощью закрытого ключа и алгоритма шифрования данные расшифровываются.
В следующей процедуре используются низкоуровневые функции сообщений для выполнения только что перечисленных задач.
Декодирование конвертированного сообщения
- Получение указателя на закодированный BLOB-объект.
- Вызовите CryptMsgOpenToDecode, передав необходимые аргументы.
- Вызовите CryptMsgUpdate один раз, передав дескриптор, полученный на шаге 2, и указатель на декодируемые данные. Это приводит к выполнению соответствующих действий с сообщением в зависимости от типа сообщения.
- Вызовите CryptMsgGetParam, передав дескриптор, полученный на шаге 2, и CMSG_TYPE_PARAM, чтобы убедиться, что сообщение относится к типу данных с конвертом.
- Снова вызовите CryptMsgGetParam, передав CMSG_INNER_CONTENT_TYPE_PARAM, чтобы получить тип данных внутреннего содержимого.
- Если тип данных внутреннего содержимого — данные, перейдите к расшифровке и декодированию содержимого. В противном случае выполните процедуру декодирования, соответствующую типу данных содержимого.
- Если внутренний тип контента — "data", инициализируйте структуру данных CMSG_CTRL_DECRYPT_PARA и вызовите CryptMsgControl, передав CMSG_CTRL_DECRYPT и адрес структуры. Содержимое будет расшифровано.
- Вызовите метод CryptMsgGetParam, передав CMSG_CONTENT_PARAM, чтобы получить указатель на большой двоичный объект декодированных данных содержимого (строка BYTE ).
- Вызовите CryptMsgClose , чтобы закрыть сообщение.
Результатом этой процедуры является декодирование и расшифровка сообщения, а также получение указателя на большой двоичный объект данных содержимого.
Связанные темы