Что такое кодировка der
DER-шифрованный файл X.509
DER (Distinguished Encoding Rules) для ASN.1, как определено в рекомендации ITU-T Recommendation X.509, — более ограниченный стандарт кодирования, чем альтернативный BER (Basic Encoding Rules) для ASN.1, определенный в рекомендации ITU-T Recommendation X.209, на котором основан DER. И BER, и DER обеспечивают независимый от платформы метод кодирования объектов, таких как сертификаты и сообщения, для трансмиссии между устройствами и приложениями.
При кодировании сертификата большинство приложений используют стандарт DER, т. к. сертификат (сведения о запросе сертификата) должен быть закодирован с помощью DER и подписан.
Base64-шифрованный формат X.509
Этот метод кодирования создан для работы с протоколом S/MIME, который популярен при передаче двоичных файлов через Интернет. Base64 кодирует файлы в текстовый формат ASCII, при этом файлы повреждаются каждый раз при прохождении через шлюз, в то время как S/MIME обладает некоторыми криптографическими службами безопасности для элекронных приложений сообщений, включая целостность происходения и использование цифровых подписей, секретность и безопаспость данных при помощи кодирования, процесса проверки подлинности и невозможности отрицания авторства сообщений.
MIME (Multipurpose Internet Mail Extensions) спецификации (RFC 1341 and successors) определяет механизмы кодирования произвольных двоичных данных для передачи по электронной почте.
Стандарт 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 частей:
Рассмотрим подробнее эти части:
Формат идентификатора строго фиксирован:
Биты 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 байта, то:
Такая форма представления октетов длины называется длинной (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 — для больших.
Автор: Красавин А. А.
Дата публикации: 01.01.2013
Библиографическая ссылка: Красавин А. А. Стандарт X.690: BER, CER и DER // Комплексная защита информации. Электроника инфо. Материалы XVIII Международной конференции 21–24 мая 2013 года, Брест (Республика Беларусь). 2013. С. 132–133.
Что такое кодировка der
Формат для базовых правил кодирования определяет самоописывающий и саморазграничивающий формат для кодирования структур данных ASN.1. Каждый элемент данных кодируется как идентификатор типа, описание длины, фактические элементы данных и, при необходимости, маркер конца содержимого. Эти типы кодирования обычно называются кодированием типа длина-значение или TLV-кодированием. Этот формат позволяет получателю декодировать информацию ASN.1 из неполного потока, не требуя каких-либо предварительных знаний о размере, содержании или семантическом значении данных. [1]
Структура кодирования
Кодирование данных обычно состоит из четырех компонентов, которые появляются в следующем порядке:
Октеты идентификатора Тип | Длина октеты Длина | Содержание октетов Значение | Октеты конца содержимого |
Октеты конца содержимого являются необязательными и используются только в том случае, если используется форма неопределенной длины. Октет содержимого также может быть опущен, если нет содержимого для кодирования, как в случае типа NULL.
Октеты идентификатора
Данные (особенно элементы последовательностей, наборов и вариантов выбора) могут быть помечены уникальным номером тега (показанным в ASN.1 в квадратных скобках []), чтобы отличать эти данные от других элементов. Такие теги могут быть неявными (где они кодируются как тег TLV значения вместо использования базового типа в качестве тега TLV) или явными (когда тег используется в построенном TLV, который охватывает TLV базового типа). Стиль тегов по умолчанию является явным, если неявный не установлен на уровне модуля ASN.1. Такие теги имеют класс по умолчанию, зависящий от контекста, но его можно переопределить, используя имя класса перед тегом.
Кодировка значения выбора такая же, как кодировка значения выбранного типа. Кодировка может быть примитивной или построенной, в зависимости от выбранного типа. Тег, используемый в октетах идентификатора, является тегом выбранного типа, как указано в определении выбранного типа ASN.1.
Следующие теги являются родными для ASN.1:
Имя | Разрешенное строительство | Номер тега | |
---|---|---|---|
Десятичный | Шестнадцатеричный | ||
Конец содержания (EOC) | Примитивный | 0 | 0 |
BOOLEAN | Примитивный | 1 | 1 |
ЦЕЛОЕ | Примитивный | 2 | 2 |
BIT STRING | Оба | 3 | 3 |
ОКТЕТНАЯ СТРОКА | Оба | 4 | 4 |
НОЛЬ | Примитивный | 5 | 5 |
ИДЕНТИФИКАТОР ОБЪЕКТА | Примитивный | 6 | 6 |
Дескриптор объекта | Оба | 7 | 7 |
ВНЕШНИЙ | Построено | 8 | 8 |
НАСТОЯЩИЙ (плавающий) | Примитивный | 9 | 9 |
ПЕРЕЧИСЛЕННЫЕ | Примитивный | 10 | А |
ВСТРОЕННЫЙ PDV | Построено | 11 | B |
UTF8String | Оба | 12 | C |
ОТНОСИТЕЛЬНЫЙ-OID | Примитивный | 13 | D |
ВРЕМЯ | Примитивный | 14 | E |
Зарезервированный | 15 | F | |
ПОСЛЕДОВАТЕЛЬНОСТЬ И ПОСЛЕДОВАТЕЛЬНОСТЬ | Построено | 16 | 10 |
НАБОР и НАБОР | Построено | 17 | 11 |
NumericString | Оба | 18 | 12 |
PrintableString | Оба | 19 | 13 |
T61String | Оба | 20 | 14 |
VideotexString | Оба | 21 год | 15 |
IA5String | Оба | 22 | 16 |
UTCTime | Оба | 23 | 17 |
GeneralizedTime | Оба | 24 | 18 |
GraphicString | Оба | 25 | 19 |
VisibleString | Оба | 26 год | 1А |
GeneralString | Оба | 27 | 1B |
UniversalString | Оба | 28 год | 1С |
СТРОКА ХАРАКТЕРА | Построено | 29 | 1D |
BMPString | Оба | 30 | 1E |
ДАТА | Примитивный | 31 год | 1F |
ВРЕМЯ ДНЯ | Примитивный | 32 | 20 |
ДАТА-ВРЕМЯ | Примитивный | 33 | 21 год |
ПРОДОЛЖИТЕЛЬНОСТЬ | Примитивный | 34 | 22 |
OID-IRI | Примитивный | 35 год | 23 |
ОТНОСИТЕЛЬНЫЙ-OID-IRI | Примитивный | 36 | 24 |
Список назначений тегов универсального класса можно найти в Рек. МСЭ-T X.680, пункт 8, таблица 1. [2]
Кодирование
Октеты идентификатора кодируют тип элемента как тег ASN.1, состоящий из класса и числа, а также того, представляют ли октеты содержимого сконструированное или примитивное значение. Обратите внимание, что некоторые типы могут иметь значения либо с примитивными, либо с построенными кодировками. Он кодируется как 1 или несколько октетов.
Октет 1 | Октет 2 и далее | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
Класс тега | ПК | Номер тега (0–30) | N / A | ||||||||||||
31 год | Более | Номер тега |
В начальном октете бит 6 кодирует, является ли тип примитивным или составным, биты 7–8 кодируют класс типа, а биты 1–5 кодируют номер тега. Возможны следующие значения:
Класс | Значение | Описание |
---|---|---|
Универсальный | 0 | Тип является родным для ASN.1 |
Заявление | 1 | Тип действителен только для одного конкретного приложения. |
Зависит от контекста | 2 | Значение этого типа зависит от контекста (например, в последовательности, наборе или выборе) |
Частный | 3 | Определяется в частных спецификациях |
ПК | Значение | Описание |
---|---|---|
Примитивный (P) | 0 | Октеты содержимого непосредственно кодируют значение элемента. |
Построен (C) | 1 | Октеты содержимого содержат 0, 1 или более кодировок элементов. |
Длинная форма
Если номер тега слишком велик для 5-битного поля тега, его необходимо закодировать в следующих октетах.
Начальный октет кодирует класс и примитив / построенный, как и раньше, а биты 1–5 равны 1. Номер тега кодируется в следующих октетах, где бит 8 каждого равен 1, если октетов больше, а биты 1–7 кодируют номер тега. Комбинированные биты номера тега с прямым порядком байтов кодируют номер тега. Должно быть закодировано наименьшее количество следующих октетов; то есть биты 1–7 не должны быть 0 в первом последующем октете.
Октеты длины
Есть две формы октетов длины: определенная форма и неопределенная форма.
Форма | Биты | |||||||
---|---|---|---|---|---|---|---|---|
8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | |
Определенный, короткий | 0 | Длина (0–127) | ||||||
Неопределенный | 1 | 0 | ||||||
Определенный, длинный | 1 | Количество следующих октетов (1–126) | ||||||
Зарезервированный | 1 | 127 |
Определенная форма
Он кодирует количество октетов содержимого и всегда используется, если тип является примитивным или сконструированным и данные доступны немедленно. Есть краткая форма и полная форма, которые могут кодировать различные диапазоны длин. Числовые данные кодируются как целые числа без знака, причем младший бит всегда идет первым (справа).
Октет 1 | Октет 2 | Октет 3 | |||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 0 | 1 | 1 |
Длинная форма | 2 октета длины | 435 октетов содержимого |
Неопределенная форма
Это вообще не кодирует длину, но октеты содержимого заканчиваются октетами маркера. Это применимо к сконструированным типам и обычно используется, если контент не доступен сразу во время кодирования.
Он состоит из одного октета, в котором бит 8 равен 1, а биты 1–7 равны 0. Затем 2 октета конца содержимого должны завершать октеты содержимого.
Октеты содержания
Октеты содержимого кодируют значение данных элемента. [1]
Обратите внимание, что октетов содержимого может не быть (следовательно, длина элемента равна 0), если необходимо отметить только существование объекта ASN.1 или его пустоту. Например, это случай значения NULL ASN.1.
Наиболее существенными ограничениями кодирования DER являются:
Ключевое различие между форматом BER и форматами CER или DER заключается в гибкости, обеспечиваемой базовыми правилами кодирования. BER, как объяснено выше, является базовым набором правил кодирования, заданным ITU-T X.690 для передачи структур данных ASN.1. Это дает отправителям четкие правила кодирования структур данных, которые они хотят отправить, но также оставляет отправителям некоторые варианты кодирования. Как указано в стандарте X.690, «Альтернативные кодировки разрешены основными правилами кодирования в качестве опции отправителя. Получатели, заявляющие о соответствии основным правилам кодирования, должны поддерживать все альтернативы». [1]
Получатель должен быть готов принять все законные кодировки, чтобы законно заявить о соответствии BER. Напротив, и CER, и DER ограничивают доступные спецификации длины одним параметром. Таким образом, CER и DER являются ограниченными формами BER и служат для устранения неоднозначности стандарта BER.
Чтобы облегчить выбор между правилами кодирования, документ стандартов X.690 предоставляет следующие рекомендации:
Выделенные правила кодирования более подходят, чем канонические правила кодирования, если закодированное значение достаточно мало, чтобы поместиться в доступной памяти, и есть необходимость быстро пропустить некоторые вложенные значения. Канонические правила кодирования более подходят, чем выделенные правила кодирования, если необходимо кодировать значения, которые настолько велики, что они не могут легко поместиться в доступную память, или если необходимо кодировать и передавать часть значения перед всем значением. доступен. Базовые правила кодирования более подходят, чем канонические или выделенные правила кодирования, если кодирование содержит установленное значение или набор значений и нет необходимости в ограничениях, которые налагают канонические и выделенные правила кодирования.
Критика кодирования BER
Несмотря на кажущиеся проблемы, BER является популярным форматом для передачи данных, особенно в системах с различными собственными кодировками данных.
Эта статья основана на материалах, взятых из Free On-line Dictionary of Computing до 1 ноября 2008 г. и включенных в соответствии с условиями «перелицензирования» GFDL версии 1.3 или новее.