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


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

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

Синтаксис криптографических сообщений (CMS) можно использовать для кодирования зашифрованных сообщений. CMS поддерживает три метода управления ключами: транспорт ключей, соглашение о ключе и ранее распределенные симметричные ключи шифрования ключей (KEK). Ранее распределенная симметричная KEK также называется распределением ключей списка рассылки.

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

Управление транспортировкой ключей использует открытый ключ ожидаемого получателя для шифрования ключа сеанса. Получатель расшифровывает ключ сеанса с помощью закрытого ключа, связанного с открытым ключом, который использовался для шифрования. Затем получатель использует расшифрованный ключ сеанса для расшифровки зашифрованных данных. Если используется транспорт ключей, получатель не подтвердил информацию о личности отправителя.

В управлении ключевым соглашением временный Diffie-Hellman закрытый ключ создаётся и используется для шифрования сеансового ключа. Открытый ключ, соответствующий временному закрытому ключу, включается в состав сведений получателя сообщения. Получатель расшифровывает ключ сеанса с помощью полученного эфемерного ключа и использует этот расшифрованный ключ сеанса для расшифровки запечатанного сообщения. Используя эфемерное соглашение ключа в сочетании с закрытым ключом получателя, получатель сообщений имеет подтвержденную информацию об удостоверении отправителя.

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

Типичная последовательность шагов CMS для кодирования зашифрованных данных показана на следующем рисунке.

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

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

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

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

  1. Создайте или получите доступ к содержимому.

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

  3. Получение сертификата получателя.

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

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

  6. Вызов CryptMsgOpenToEncode, передавая CMSG_ENVELOPED для dwMsgType и указатель на CMSG_ENVELOPED_ENCODE_INFO для pvMsgEncodeInfo. В результате этого вызова вы получите дескриптор открытого сообщения.

  7. Вызов CryptMsgUpdate, передав дескриптор, полученный на шаге 6, и указатель на данные, которые должны быть зашифрованы, обернуты и закодированы. Эту функцию можно вызывать столько раз, сколько необходимо для завершения процесса кодирования.

  8. Вызовите CryptMsgGetParam, передав дескриптор, полученный на шаге 6, и соответствующие типы параметров для доступа к нужным, закодированным данным. Например, передайте CMSG_CONTENT_PARAM, чтобы получить указатель на все сообщение PKCS #7.

    Если результат этой кодировки должен использоваться в качестве внутренних данных для другого закодированного сообщения, например конвертированного сообщения, необходимо передать параметр CMSG_BARE_CONTENT_PARAM. Для примера см. раздел Альтернативный код для кодирования конвертированного сообщения.

  9. Закройте сообщение, вызвав CryptMsgClose.

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

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