EnvelopedData является одной из базовых структур стандарта CMS (Cryptographic Message Syntax), описанного в RFC 5652. В контексте Jsrsasign эта структура используется для реализации гибридного шифрования: симметричный ключ шифрует данные, а сам симметричный ключ защищается асимметричным шифрованием для одного или нескольких получателей.
Архитектура EnvelopedData строится вокруг принципа разделения ответственности:
Jsrsasign предоставляет высокоуровневую реализацию CMS, скрывающую ASN.1-сложность, но внутренняя структура остаётся полностью соответствующей стандарту.
В CMS EnvelopedData всегда представляет собой ASN.1 SEQUENCE со следующими компонентами:
В Jsrsasign эта структура отражается через объект CMS, но логически сохраняет ту же иерархию.
Поле version определяет совместимость структуры с версией CMS.
Основные значения:
В большинстве практических сценариев Jsrsasign автоматически устанавливает version, исходя из состава recipientInfos.
OriginatorInfo используется редко и содержит дополнительные сертификаты или CRL отправителя.
Структура включает:
В Jsrsasign данный блок чаще всего отсутствует, поскольку библиотека ориентирована на упрощённые сценарии шифрования сообщений.
RecipientInfos — ключевая часть EnvelopedData. Это массив структур, каждая из которых описывает способ защиты симметрического ключа для конкретного получателя.
В Jsrsasign поддерживаются основные типы:
Наиболее распространённый вариант.
Структура включает:
rid (RecipientIdentifier)
keyEncryptionAlgorithm
encryptedKey
Механизм работы:
Используется в более сложных схемах (ECDH/ DH).
Содержит:
В Jsrsasign поддержка ограничена базовыми сценариями, так как основной фокус — RSA-шифрование.
Используется при наличии заранее распределённого симметрического ключа (Key Encryption Key).
Структура:
Применяется в корпоративных системах, где используется централизованное управление ключами.
Это центральный блок, содержащий зашифрованные данные.
Структура включает:
Определяет тип исходных данных:
Описывает симметричный алгоритм шифрования:
Jsrsasign обычно использует AES как стандартный вариант.
Содержит результат симметричного шифрования данных. В CMS он представлен как OCTET STRING, часто с дополнительной ASN.1 обёрткой.
Необязательный блок, содержащий атрибуты, не защищённые шифрованием.
Может включать:
В Jsrsasign используется редко и обычно игнорируется, поскольку снижает криптографическую строгость структуры.
В Jsrsasign EnvelopedData представляется через объект CMS, где структура абстрагирована:
При создании структуры библиотека выполняет:
При расшифровке выполняется обратный процесс:
Формально структура выглядит следующим образом:
EnvelopedData ::= SEQUENCE {
version CMSVersion,
originatorInfo [0] IMPLICIT OriginatorInfo OPTIONAL,
recipientInfos RecipientInfos,
encryptedContentInfo EncryptedContentInfo,
unprotectedAttrs [1] IMPLICIT UnprotectedAttributes OPTIONAL
}
RecipientInfos — SET OF RecipientInfo
EncryptedContentInfo:
EncryptedContentInfo ::= SEQUENCE {
contentType ContentType,
contentEncryptionAlgorithm ContentEncryptionAlgorithmIdentifier,
encryptedContent [0] IMPLICIT EncryptedContent OPTIONAL
}
Внутренний процесс в Jsrsasign можно разложить на этапы:
C = Encrypt_sym(Data, K)
EK_i = Encrypt_pub(K, PubKey_i)
Jsrsasign скрывает ASN.1 сериализацию, но внутри используется классическая DER-кодировка.
Наиболее стабильный сценарий:
Хотя библиотека поддерживает ECDSA и ECDH, CMS EnvelopedData чаще ориентирован на RSA-схемы.
RecipientInfo часто формируется на основе сертификата:
Одной из ключевых особенностей структуры является возможность шифрования для нескольких получателей без повторного шифрования данных.
Модель:
Преимущества:
EnvelopedData является частью более широкой структуры PKCS#7 / CMS:
В Jsrsasign эти структуры унифицированы через общий CMS интерфейс, где EnvelopedData является частным случаем защищённого контейнера данных.
При работе с EnvelopedData возможны типовые ошибки:
Jsrsasign в таких случаях возвращает ошибки парсинга ASN.1 или криптографические исключения при расшифровке.
EnvelopedData тесно связан с:
Каждый компонент участвует в формировании конечного CMS контейнера.