поиск по сайту
Стандарт X.690: BER, CER и DER

Стандарт X.690: BER, CER и DER

Красавин Александр

X.690 — один из стандартов ASN.1, разработанных совместно организациями ISO, IEC и ITU-T для удобства представления данных при их передаче в телекоммуникационных сетях. Правила кодирования, описанные в X.690, служат для представления структур данных, описанных по правилам ASN.1, в виде последовательностей байт. Такие последовательности удобнее передавать по линиям связи или сохранять в файлы, чем делать те же операции с самими структурами.

Правила кодирования, описанные в X.690 применяют в различных протоколах передачи данных и в криптографических протоколах, как-то: SMNP и LDAP, PKCS#7 (для кодирования сообщений), X.509 (для хранения сертификатов). В частности, в стандарте CMS (RFC #5652) говорится, что сообщение должно передаваться закодированным по правилам DER (описаны в X.690). Однако единой кроссплатформенной реализации правил кодирования на каждом из языков программирования, описанных в стандарте X.690, нет. Поэтому разработчикам ПО часто приходится реализовывать библиотеки для кодирования данных в соответствии с X.690. И тут возникает следующая проблема: очень сложно найти хорошее и понятное описание стандарта и правил кодирования на русском языке.

Собственно, задача этой статьи — дать именно такое описание.

Стандарт X.690 описывает следующие правила кодирования структур данных, созданных в соответствии с ASN.1: BER (Basic Encoding Rules), CER (Canonical Encoding Rules), DER (Distinguished Encoding Rules). Разберемся с этими правилами подробнее.

Basic Encoding Rules

Базовые правила кодирования или BER — правила для представления структуры, описанной с помощью ASN.1, в виде последовательности байт (или «октетов»). Такую последовательность удобнее передавать по линиям связи или сохранять в файл, чем делать те же операции с самими структурами.

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

  1. Идентификатор — один или несколько октетов, в которых содержится информация о типе закодированных данных;
  2. Часть, содержащая информацию о длине блока — один или несколько октетов, в которых содержится информация о длине закодированных данных (в октетах);
  3. Часть, содержащая закодированную информацию.

Рассмотрим подробнее эти части:

Идентификатор

Формат идентификатора строго фиксирован:

Биты 8 и 7 определяют класс данных (Universal (т.е. определенный в ASN.1), Application (Используемый в каком-то конкретном приложении), Context-specific (т.е. зависящий от контекста)* или Private (т.е. определенный в какой-то спецификации ASN.1));

Бит 6 определяет, является ли данные простыми (как-то INTEGER), или могут содержать в себе другие различные наборы данных (как-то SET). При этом в первом случае говорят о примитивном кодировании, а во втором — о конструктивном.

Биты 5-1 определяют тэг данных (их тип).

В случае если класс данных не определен в ASN.1, то тэг может быть больше 30. В таком случае используют несколько октетов для представления идентификатора. При этом биты 5-1 первого октета имеют значение 11111(2), а следующие октеты, кодируются следующим образом:

Бит 8 во всех октетах, кроме последнего равен 1. В последнем октете длины бит 8 равен 0;

Биты с 1 по 7 этих октетов содержат биты тэга в его двоичном представлении.

Октеты длины закодированных данных:

В случае, если длина блока закодированных данных заранее известна, октеты длины кодируются следующим образом:

Если эта длина не превышает 31 байта, то она просто записывается в соответствующий октет длины. Такая форма представления октетов длины называется примитивной (primitive).

Если длина блока закодированных данных больше 31 байта, то:

  • в биты второго и последующих октетов записывается значение длины блока закодированной информации в ее (длины) двоичном представлении
  • в первый октет записывается количество дополнительных блоков длины, считая со второго (не более 30); бит 8 первого октета устанавливается в 1.

Такая форма представления октетов длины называется длинной (long)

Если же длина блока закодированных данных на момент кодирования длины неизвестна, то в октет длины записывается значение 0×80h, что указывает на кодирование с неопределенной длиной. В этом случае в конце блока закодированных данных должно стоять значение 0×0000h (2 октета), явно указывающее на его завершение.

Кодирование структур различных типов:

Кодирование различных типов данных детально и доступно описано в стандарте X.690 и затруднений при использовании вызывать не должно. Куда больший интерес вызывают особенности при кодировании различных типов данных.

В зависимости от структуры и преследуемых при кодировании целей, кодирование одних и тех же данных может существенно различаться. Так, кодирование значения TRUE типа BOOLEAN может иметь как вид: 01 01 01, так и вид: 01 01 0F;

Результат кодирования типа SET может быть различным в зависимости от того, в каком порядке мы кодируем «вложенные» типы данных: если set ::= SET { int, float}; int ::= INTEGER; float ::= REAL, то для set{-128, 0.15625} результат кодирования может быть таким: 31 08 02 01 80 09 03 80 FB 05, и таким: 31 08 09 03 80 FB 05 02 01 80.

В зависимости от того, примитивное или конструктивное кодирование используется, его результат может также различаться. Так для значения " Test User 1″ типа STRING при примитивном кодировании результат будет иметь вид: 13 0B 54 65 73 74 20 55 73 65 72 20 31, а при конструктивном: 33 0F 13 05 54 65 73 74 20 13 06 55 73 65 72 20 31.

Другие правила кодирования стандарта X.690:

Как видно из предыдущих примеров, результат кодирования по правилам BER может существенно различаться. Для того, чтобы результаты кодирования одних и тех же типов данных в разных системах были одинаковыми, были разработаны правила кодирования DER и CER.

Distinguished Encoding Rules:

Особые правила кодирования или DER совпадают с BER с учетом выполнения следующих ограничений:

1) для кодирования данных с известной длиной количество октетов длины должно быть наименьшим;

2) Кодирование простых типов данных (в том числе STRING, OCTET STRING и BIT ARRAY) всегда примитивное;

3) для типа SET кодирование вложенных типов должно происходить в порядке следования их тегов (согласно ASN.1).

Canonical Encoding Rules:

Канонические правила кодирования или CER совпадают с BER с учетом выполнения следующих ограничений:

1) для составных типов данных должно применяться кодирование с неизвестной длиной;

для примитивного кодирования количество октетов длины должно быть наименьшим;

2) для типа SET кодирование вложенных типов должно происходить в порядке следования их тегов (согласно ASN.1).

Сравнение BER, DER и CER:

В чем же преимущество различных правил кодирования?

BER предлагает пользователю различные пути для кодирования одних и тех же данных, причем предполагается, что система, которая поддерживает стандарты ASN.1, может корректно их декодировать вне зависимости от представления, в то время как DER и CER поддерживают только конкретный вариант кодирования для каждого типа. Это отличие проявляется в быстродействии кодирования данных: согласно исследованиям, если при кодировании используется строго определенный формат данных, то системе требуется для кодирования и декодирования намного меньше операций. Проще говоря, DER и CER обеспечивают много большее быстродействие, чем BER.

Основное же отличие DER от CER заключается в том, что в DER используется кодирование данных с известной длиной, а в CER в некоторых случаях (например, при кодировании данных типа STRING длиной более 1000 символов) используется кодирование с неизвестной заранее длиной. Это отличие выражается в количестве блоков, необходимых для кодирования длины зашифрованных данных. Так, для определения длины блока закодированных данных при кодировании с неизвестной длиной требуется всего 3 октета, в то время как для больших сообщений при DER кодировании их количество может достигать 32 октетов. То есть целесообразно использовать DER при кодировании небольших по размеру данных и CER — для больших.


ФорумФорум
Форум ОКБ САПР
Вопросы специалистовВопросы специалистов
Вопросы, которые нам присылают, и наши ответы на них