Кодирование конвертированных данных
Конвертированные данные состоят из зашифрованного содержимого любого типа и ключей сеанса шифрования содержимого для одного или нескольких получателей. Конвертированные сообщения сохраняют содержимое сообщения в секрете и позволяют извлекать содержимое только указанным лицам или сущностям.
Для кодирования конвертированных сообщений можно использовать синтаксис криптографических сообщений (CMS). CMS поддерживает три метода управления ключами: транспорт ключа, соглашение о ключе и ранее распределенные симметричные ключи шифрования ключей (KEK). Ранее распределенные симметричные KEK также называются распределением ключей списка рассылки.
В каждом из этих трех методов создается один сеансовый ключ для шифрования конвертированного сообщения. Проблемы с управлением ключами касаются того, как ключ сеанса шифруется отправителем и расшифровывается получателем. Одно зашифрованное сообщение можно распространить среди многих получателей с помощью сочетания методов управления ключами.
Управление ключами транспорта ключей использует открытый ключ предполагаемого получателя для шифрования ключа сеанса. Получатель расшифровывает ключ сеанса, используя закрытый ключ, связанный с открытым ключом, который использовался для шифрования. Затем получатель использует расшифрованный ключ сеанса для расшифровки конвертированных данных. При использовании транспорта ключа получатель не подтвердил сведения об удостоверении отправителя.
При управлении соглашениями ключей создается временный временный Diffie-Hellman закрытый ключ, который используется для шифрования ключа сеанса. Открытый ключ, соответствующий эфемерным закрытым ключом, включается как часть сведений о получателе сообщения. Получатель расшифровывает ключ сеанса с помощью полученного временного ключа и использует этот расшифрованный сеансовый ключ для расшифровки конвертированного сообщения. Используя эфемерное соглашение ключа в сочетании с закрытым ключом получателя, получатель сообщения имеет подтвержденные сведения об идентификаторе отправителя.
Для управления ключами с использованием ранее распределенных симметрических ключей каждое сообщение содержит ключ шифрования содержимого, зашифрованный ранее распределенным ключом шифрования ключей. Получатели используют ранее распределенный ключ шифрования ключей для расшифровки ключа шифрования содержимого, а затем используют расшифрованный ключ шифрования содержимого для расшифровки конвертированного сообщения.
На следующем рисунке показана типичная последовательность событий CMS для кодирования конвертированных данных.
- Извлекается указатель на сообщение в виде открытого текста .
- Создается симметричный (сеансовый) ключ.
- Симметричный ключ и указанный алгоритм шифрования используются для шифрования данных сообщения.
- Откроется хранилище сертификатов .
- Сертификат получателя извлекается из хранилища.
- Открытый ключ извлекается из сертификата получателя.
- С помощью открытого ключа получателя симметричный ключ шифруется.
- Из сертификата получателя извлекается идентификатор получателя.
- В сообщение с цифровой оболочкой включаются следующие сведения: алгоритм шифрования данных, зашифрованные данные, зашифрованный симметричный ключ и структура сведений о получателе.
Чтобы использовать низкоуровневые функции сообщений для выполнения только что перечисленных типичных задач, используйте следующую процедуру.
Кодирование конвертированного сообщения
Создайте или получите содержимое.
Получение поставщика служб шифрования.
Получите сертификат получателя.
Инициализируйте структуру CMSG_ENVELOPED_ENCODE_INFO .
Вызовите CryptMsgCalculateEncodedLength , чтобы получить размер большого двоичного объекта закодированного сообщения. Выделите для него память.
Вызовите CryptMsgOpenToEncode, передав CMSG_ENVELOPED для dwMsgType и указатель на CMSG_ENVELOPED_ENCODE_INFO для pvMsgEncodeInfo. В результате этого вызова вы получите дескриптор открытого сообщения.
Вызовите CryptMsgUpdate, передав дескриптор, полученный на шаге 6, и указатель на данные, которые должны быть зашифрованы, конвертированы и закодированы. Эту функцию можно вызывать столько раз, сколько необходимо для завершения процесса кодирования.
Вызовите CryptMsgGetParam, передав дескриптор, полученный на шаге 6, и соответствующие типы параметров для доступа к нужным закодированным данным. Например, передайте CMSG_CONTENT_PARAM, чтобы получить указатель на все сообщение PKCS #7.
Если результат этой кодировки будет использоваться в качестве внутренних данных для другого закодированного сообщения, например конвертированного сообщения, необходимо передать параметр CMSG_BARE_CONTENT_PARAM. Пример см. в разделе Альтернативный код для кодирования конвертированного сообщения.
Закройте сообщение, вызвав CryptMsgClose.
Результатом этой процедуры является закодированное сообщение, содержащее зашифрованные данные, симметричный ключ , зашифрованный с помощью открытых ключей получателя, и структуры данных получателя. Сочетание зашифрованного содержимого и зашифрованного симметричного ключа для получателя является цифровым конвертом для этого получателя. Содержимое любого типа может быть конвертировано для нескольких получателей.
Связанные темы