T.M. SoftStudio

feci quod potui, faciant meliora potentes

Спецификация XML Encryption

Спецификация XML Encryption описывает механизм шифрования данных и представления их в XML-документе.

Процесс шифрования может быть применен ко всему XML-документу, к элементам XML-документа и к содержимому элементов XML-документа. При этом данные шифруются с помощью одного из блочных симметричных криптографических алгоритмов Triple DES (3DES) или Advanced Encryption Standard (AES) с использованием симметричного ключа. Для передачи ключа шифрования от шифрующей стороны дешифрующей стороне используется его ассиметричное шифрование алгоритмом RSA с применением публичного ключа или протокол передачи ключей Diffie–Hellman key exchange (DH). Дешифрование данных производится с помощью общего симметричного ключа после его расшифровки.

Алгоритм Triple DES — симметричный блочный алгоритм шифрования, созданный на основе алгоритма DES, имеющий длину ключа 168 бит и размер блока шифрования — 64 бита (эффективных 56 бит). Первая часть ключа шифрует первый блок, вторая часть ключа дешифрует второй блок, а третья часть ключа — шифрует третий блок данных.

Алгоритм AES представляет собой также симметричный блочный алгоритм шифрования, оперирующий 128-битным блоком данных. Существуют варианты AES-шифрования с ключами длиной 128, 192 и 256 бит. Кроме того, алгоритм AES может использоваться вместе с режимом GCM (Galois/Counter Mode), что эквивалентно одновременно шифрованию и созданию подписи HMAC, обеспечивая, таким образом, одновременно шифрование и аутентификацию данных.

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

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

ConcatKDF-ключ составляется из хэш-значений, полученных хэшированием исходного ключа, счетчика итерации и параметров алгоритма. В качестве параметров алгоритма выступают:

  • AlgorithmID — битовая строка, указывающая как производный ключ должен анализироваться, и для чего он предназначается, например, что биты 81—208 используются в качестве AES-ключа;

  • PartyUInfo — информация о стороне, создающей производный ключ;

  • PartyVInfo — информация о стороне, использующей производный ключ;

  • SuppPubInfo и SuppPrivInfo — дополнительная информация о производном ключе.

Алгоритм PBKDF2 принимает в качестве параметров исходный ключ и произвольное значение, которые затем хэширует определенное количество раз.

Для передачи расшифровывающей стороне симметричный ключ шифрования сам может зашифровываться алгоритмом RSA или RSA совместно с OAEP. Optimal Asymmetric Encryption Padding (OAEP) — алгоритм дополнительного шифрования путем дополнения исходных данных фиктивными данными.

Также передача симметричного ключа может осуществляться с помощью алгоритма Diffie-Hellman key agreement (DH), который может быть применен к оригинальному симметричному ключу или к производному ключу, или с применением алгоритма Elliptic Curve Diffie-Hellman (ECDH) Key Agreement, представляющего собой улучшенный вариант DH, основанный на алгебраической структуре эллиптических кривых. Суть алгоритма DH заключается в том, что обе стороны, применяющие симметричный ключ, выбирают по значению, которое используют как степень преобразования общего ключа, и передают друг другу полученные значения. Симметричный ключ получается следующим преобразованием с применением числа, которое было выбрано каждой из сторон.

Зашифрованные данные и зашифрованный симметричный ключ представляются в XML-документе с помощью элементов <EncryptedData> и <EncryptedKey> соответственно. При этом используются пространства имен http://www.w3.org/2001/04/xmlenc# (версия спецификации 1.0) и http://www.w3.org/2009/xmlenc11# (версия спецификации 1.1).

Элемент <EncryptedData> имеет следующие атрибуты и дочерние элементы:

  • необязательный атрибут Id — идентификатор элемента;

  • необязательный атрибут Type — тип зашифрованных данных. Возможные значения: http://www.w3.org/2001/04/xmlenc#Element (шифруется XML-элемент) и http://www.w3.org/2001/04/xmlenc#Content (шифруется содержимое XML-элемента);

  • необязательный атрибут MimeType — MIME-тип зашифрованных данных;

  • необязательный атрибут Encoding — кодировка данных (например, http://www.w3.org/2000/09/xmldsig#base64);

  • необязательный элемент <EncryptionMethod> — метод шифрования;

  • необязательный элемент <ds:KeyInfo> (пространство имен http://www.w3.org/2000/09/xmldsig#) — информация о ключе шифрования;

  • обязательный элемент <CipherData> содержит зашифрованные данные;

  • необязательный элемент <EncryptionProperties> — дополнительная информация о шифровании (дата шифрования, информация о программном обеспечении и т. д.).

Элемент <EncryptionMethod> описывает алгоритм шифрования данных. Обязательный атрибут Algorithm содержит в качестве значения URI-идентификатор алгоритма шифрования. Спецификация предопределяет следующие URI-идентификаторы для алгоритмов шифрования:

  • http://www.w3.org/2001/04/xmlenc#tripledes-cbc — алгоритм Triple DES.

  • http://www.w3.org/2001/04/xmlenc#aes128-cbc, http://www.w3.org/2001/04/xmlenc#aes192-cbc, http://www.w3.org/2001/04/xmlenc#aes256-cbc — алгоритм AES.

  • http://www.w3.org/2009/xmlenc11#aes128-gcm, http://www.w3.org/2009/xmlenc11#aes256-gcm — алгоритм AES-GCM.

Элемент <CipherData> содержит последовательность зашифрованных данных в формате Base64 в элементе <CipherValue> или ссылку на ресурс, содержащий зашифрованные данные. Ссылка на внешний ресурс осуществляется с помощью вложенного элемента <CipherReference>.

Элемент <CipherReference> имеет обязательный атрибут URI, указывающий URI-адрес внешнего ресурса. Кроме того, элемент <CipherReference> может содержать вложенный элемент <Transforms>, описывающий преобразования данных, которые необходимо произвести для извлечения зашифрованных данных из внешнего ресурса. Элемент <Transforms> содержит вложенные элементы <ds:Transform> (пространство имен http://www.w3.org/2000/09/xmldsig#), структура которых описывается спецификацией XML Signature.

Элемент <ds:KeyInfo> (пространство имен http://www.w3.org/2000/09/xmldsig#), структура которого регламентирется спецификацией XML Signature, описывает ключ шифрования данных. Как правило, для элемента <EncryptedData> в элементе <ds:KeyInfo> используются вложенные элементы <ds:KeyName> и <ds:RetrievalMethod>. Элемент <ds:RetrievalMethod> с помощью атрибутов URI и Type (http://www.w3.org/2001/04/xmlenc#EncryptedKey) указывает ссылку на элемент <EncryptedKey>, описывающий ключ шифрования. Хотя дополнительно к спецификации XML Signature элемент <ds:KeyInfo> может содержать элементы <EncryptedKey> и <AgreementMethod>, непосредственно в элементе <EncryptedData> описывающие ключ шифрования. Элемент <ds:RetrievalMethod>, также используя атрибуты URI и Type (http://www.w3.org/2009/xmlenc11#DerivedKey), может ссылаться на элемент <DerivedKey>. Элемент <DerivedKey> может и напрямую содержаться в элементе <ds:KeyInfo>, описывая производный ключ.

Элемент <EncryptedKey> может представлять отдельное описание ключа шифрования или быть дочерним элементом элемента <ds:KeyInfo> и описывать ключ шифрования непосредственно в элементе <EncryptedData>. Элемент <EncryptedKey> имеет следующие атрибуты и дочерние элементы:

  • необязательный атрибут Id — идентификатор элемента;

  • необязательный атрибут Recipient — получатель ключа шифрования;

  • необязательный элемент <EncryptionMethod> — метод шифрования симметричного ключа. Может содержать элементы <KeySize> (размер ключа) и <OAEPparams> (параметры шифрования алгоритма RSA-OAEP). Спецификация предопределяет следующие значения атрибута Algorithm элемента <EncryptionMethod>:

    – http://www.w3.org/2001/04/xmlenc#rsa-1_5 — алгоритм RSA-v1.5;

    – http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p — алгоритм RSA-OAEP;

  • необязательный элемент <ds:KeyInfo> (пространство имен http://www.w3.org/2000/09/xmldsig#) — информация о ключе шифрования. Помимо стандартных элементов спецификации XML Signature может содержать элемент <AgreementMethod>;

  • обязательный элемент <CipherData> содержит зашифрованный ключ. Содержит дочерний элемент <CipherValue> или <CipherReference>;

  • необязательный элемент <EncryptionProperties> — дополнительная информация о шифровании ключа (дата шифрования, информация о программном обеспечении и т. д.);

  • необязательный элемент <ReferenceList> содержит ссылки на данные, которые были зашифрованные этим ключом. Это могут быть элементы <EncryptedData> и <EncryptedKey> (зашифрованный ключ может быть повторно зашифрован). Дочерние элементы <DataReference> указывают ссылки на элементы <EncryptedData> с помощью атрибута URI, а дочерние элементы <KeyReference> указывают ссылки на элементы <EncryptedKey>, также используя атрибут URI;

  • необязательный элемент <CarriedKeyName> содержит идентификатор зашифрованного ключа.

Элемент <DerivedKey> (пространство имен http://www.w3.org/2009/xmlenc11#) может представлять отдельное описание производного ключа шифрования или быть дочерним элементом элемента <ds:KeyInfo> и описывать производный ключ шифрования непосредственно в элементе <EncryptedData>. Элемент <DerivedKey> имеет следующие атрибуты и дочерние элементы:

  • необязательный атрибут Id — идентификатор элемента;

  • необязательный атрибут Recipient — получатель производного ключа шифрования;

  • необязательный элемент <KeyDerivationMethod> (пространство имен http://www.w3.org/2009/xmlenc11#) описывает метод получения производного ключа из оригинального ключа. Спецификация предопределяет следующие значения атрибута Algorithm элемента <KeyDerivationMethod>:

    – http://www.w3.org/2009/xmlenc11#ConcatKDF — алгоритм ConcatKDF. В этом случае элемент <KeyDerivationMethod> содержит элемент <ConcatKDFParams> (параметры алгоритма) с вложенными элементами <ds:DigestMethod> (http://www.w3.org/2000/09/xmldsig#sha1, http://www.w3.org/2001/04/xmlenc#sha256, http://www.w3.org/2001/04/xmlenc#sha384, http://www.w3.org/2001/04/xmlenc#sha512), <AlgorithmID>, <PartyUInfo>, <PartyVInfo>, <SuppPubInfo> и <SuppPrivInfo>;

    – http://www.w3.org/2009/xmlenc11#pbkdf2 — алгоритм PBKDF2. В этом случае элемент <KeyDerivationMethod> содержит элемент <PBKDF2-params> (параметры алгоритма) с вложенными элементами <Salt> (дочерний элемент <Specified> или <OtherSource>), <IterationCount>, <KeyLength>, <PRF> (атрибут Algorithm);

  • необязательный элемент <ReferenceList> содержит ссылки на данные, которые были зашифрованные этим ключом. Дочерние элементы <DataReference> указывают ссылки на элементы <EncryptedData> с помощью атрибута URI, а дочерние элементы <KeyReference> указывают ссылки на элементы <EncryptedKey>, также используя атрибут URI;

  • необязательный элемент <DerivedKeyName> — идентификатор производного ключа;

  • необязательный элемент <MasterKeyName> — идентификатор оригинального ключа.

Элемент <AgreementMethod> является дочерним элементом элемента <ds:KeyInfo> и описывает алгоритм передачи общего ключа шифрования на основе алгоритма Key Agreement. Спецификация предопределяет следующие значения атрибута Algorithm элемента <AgreementMethod>:

  • http://www.w3.org/2009/xmlenc11#dh-es — алгоритм Diffie-Hellman Key Agreement with Explicit Key Derivation Functions. В этом случае элемент <ds:KeyValue> содержит элемент <DHKeyValue> с вложенными элементами <P>, <Q>, <Generator>, <Public>, <seed> и <pgenCounter>;

  • http://www.w3.org/2001/04/xmlenc#dh — алгоритм Diffie-Hellman Key Agreement with Legacy Key Derivation Function. В этом случае также элемент <ds:KeyValue> содержит элемент <DHKeyValue> с вложенными элементами <P>, <Q>, <Generator>, <Public>, <seed> и <pgenCounter>;

  • http://www.w3.org/2009/xmlenc11#ECDH-ES — алгоритм Elliptic Curve Diffie-Hellman (ECDH). В этом случае элемент <ds:KeyValue> содержит элемент <ECKeyValue>.

Элемент <AgreementMethod> может иметь следующие дочерние элементы:

  • <KA-Nonce> содержит значение DH-параметра, гарантирующего уникальность генерируемого общего ключа;

  • <KeyDerivationMethod> (пространство имен http://www.w3.org/2009/xmlenc11#) описывает алгоритм создания производного ключа;

  • <OriginatorKeyInfo> содержит информацию от отправителя документа, необходимую для создания общего ключа. Структура элемента аналогична структуре элемента <ds:KeyInfo>;

  • <RecipientKeyInfo> содержит информацию от получателя документа, необходимую для создания общего ключа. Структура элемента аналогична структуре элемента <ds:KeyInfo>.

При шифровании данные сериализуются в формате UTF-8, после этого Encryption-процессор должен получить ключ шифрования и создать элементы <ds:KeyInfo>, <EncryptedKey> или <DerivedKey>. Далее данные шифруются, и создается элемент <EncryptedData>. Дешифрование заключается в получении Decryption-процессором информации о ключе из элемента <ds:KeyInfo> и затем дешифровании данных элемента <CipherData>.