X.690 – один из стандартов ASN.1, разработанных совместно организациями ISO, IEC и ITU-T для удобства представления данных при их передаче в телекоммуникационных сетях. Правила кодирования, описанные в X.690, служат для представления структур данных, описанных по правилам ASN.1, в виде последовательностей байт. Такие последовательности удобнее передавать по линиям связи или сохранять в файлы, чем делать те же операции с самими структурами[1].
Стандарт X.690 описывает следующие правила кодирования структур данных, созданных в соответствии с ASN.1:
В 1984 году организация ITU-T создала серию стандартов X.400, в числе которых был и стандарт X.409, который, ввиду активного использования, в 1988 году ITU-T совместно с ISO и IEC выделили в два отдельных стандарта: X.208, описывающий ASN.1, и X.209, в котором описывались правила BER. В 1994 году ASN.1 был переработан и серия стандартов X.208 перешла в серию X.680, а стандарту X.209 на смену пришёл стандарт X.690[2].
Базовые правила кодирования или BER – набор правил, объясняющий как представить любую структуру данных, описанную согласно ASN.1, в виде последовательности восьмибитных октетов[3].
Для того, чтобы различные типы данных можно было описывать схожим образом, в X.690 была определена общая структура блока закодированной информации, состоящая из следующих 3 частей:
Формат идентификатора строго фиксирован[4].
| 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
|---|---|---|---|---|---|---|---|
| Класс | Тип | Тег | |||||
Биты 8 и 7 определяют класс данных
| Класс | бит 8 | бит 7 | Описание класса |
|---|---|---|---|
| Универсальный | 0 | 0 | типы, которые определены только в X.690 и имеют одинаковый смысл во всех приложениях |
| Прикладной | 0 | 1 | типы, смысл которых меняется в зависимости от приложения [примечание 1] |
| Контекстно-зависимый | 1 | 0 | типы, смысл которых зависит от данного составного типа[примечание 2] |
| Частный | 1 | 1 | типы, смысл которых зависит от конкретной организации |
Бит 6 определяет, являются ли данные простыми (как-то INTEGER), или могут содержать в себе другие различные наборы данных (как-то SET). При этом при кодировании в первом случае говорят о примитивном кодировании, а во втором - о конструктивном;
| Тип данных | бит 6 |
|---|---|
| Простой | 0 |
| Составной | 1 |
Биты 5 - 1 определяют тег данных.
| Тип данных | Тег (десятичный) | Тег (шестнадцатеричный) |
|---|---|---|
| EOC (End-of-Content) | 0 | 0 |
| BOOLEAN | 1 | 1 |
| INTEGER | 2 | 2 |
| BIT STRING | 3 | 3 |
| OCTET STRING | 4 | 4 |
| NULL | 5 | 5 |
| OBJECT IDENTIFIER | 6 | 6 |
| Object Descriptor | 7 | 7 |
| EXTERNAL | 8 | 8 |
| REAL | 9 | 9 |
| ENUMERATED | 10 | A |
| EMBEDDED PDV | 11 | B |
| UTF8String | 12 | C |
| RELATIVE-OID | 13 | D |
| (reserved) | 14 | E |
| (reserved) | 15 | F |
| SEQUENCE и SEQUENCE OF | 16 | 10 |
| SET и SET OF | 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 | 1A |
| GeneralString | 27 | 1B |
| UniversalString | 28 | 1C |
| CHARACTER STRING | 29 | 1D |
| BMPString | 30 | 1E |
| (длинная форма) | 31 | 1F |
В случае если класс данных не определен в ASN.1, то тег может быть больше 30. В таком случае используют несколько октетов для представления идентификатора. При этом биты 5-1 первого октета имеют значение 111112, а следующие октеты, кодируются следующим образом:
В случае, если длина блока закодированных данных заранее известна, октеты длины кодируются следующим образом:
Если эта длина не превышает 127 октетов (байт), то она просто записывается в соответствующий октет длины. Такая форма представления октетов длины называется короткой (short form).
Пример: длина блока данных L:
L = 34 будет закодирована в виде 0010 0010
Если длина блока закодированных данных больше 127 байт, то:
Такая форма представления октетов длины называется длинной (long form)
Пример: длина блока данных L:
L = 2614 (0000 1010 0011 0110 в двоичном формате)
будет закодирована в виде:
82 0A 36 (10000010 00001010 00110110 в двоичном формате)
Если же длина блока закодированных данных на момент кодирования длины неизвестна, то в октет длины записывается значение 0х80, что указывает на кодирование с неопределенной длиной (indefinite form). В этом случае в конце блока закодированных данных должны стоять октеты 00 00, явно указывающие на его завершение. Кодирование с неопределённой длиной разрешено только для конструктивных типов данных; два нулевых октета в конце соответствуют ASN.1-типу данных с тегом 0 (End-of-contents) и длиной 0.
Кодирование различных типов данных детально описано в тексте стандарта (англ.).
В зависимости от структуры и преследуемых при кодировании целей, кодирование одних и тех же данных может существенно различаться[5][6].
Так, BER-кодирование значения TRUE типа BOOLEAN может иметь как вид:
01 01 01
так и вид:
01 01 0F
Результат кодирования типа SET может быть различным в зависимости от того, в каком порядке мы кодируем "вложенные" типы данных:
если
set::= SET { int, float}
int::= INTEGER
float::= REAL
то для
set{-128, 0.15625}
результат кодирования по правилам BER может быть таким:
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
Для однозначного кодирования данных используются правила кодирования DER и CER.
Особые правила кодирования или DER совпадают с BER с учётом выполнения следующих ограничений:
Канонические правила кодирования или CER совпадают с BER с учётом выполнения следующих ограничений:
BER предлагает пользователю различные пути для кодирования одних и тех же данных, причём предполагается, что система, которая поддерживает стандарты ASN.1, может корректно их декодировать вне зависимости от представления, в то время как DER и CER поддерживают только конкретный вариант кодирования для каждого типа[6]. Это отличие проявляется в быстродействии кодирования данных: согласно исследованиям, если при кодировании используется строго определенный формат данных, то системе требуется для этого намного меньше операций. Проще говоря, DER и CER обеспечивают много большее быстродействие, чем BER[7].
Основное же отличие DER от CER заключается в том, что в DER используется кодирование данных с известной длиной, а в CER в некоторых случаях (например, при кодировании данных типа STRING длиной более 1000 символов) используется кодирование с неизвестной заранее длиной. Это отличие выражается в количестве блоков, необходимых для кодирования длины зашифрованных данных. Так, для определения длины блока закодированных данных при кодировании с неизвестной длиной требуется всего 3 октета, в то время как для больших сообщений при DER кодировании их количество может достигать 32 октетов. То есть целесообразно использовать DER при кодировании небольших по размеру данных, а CER - для больших[8].
Переход от стандартов X.208 и X.209 к X.680 - X.683 и X.690 был обусловлен необходимостью исправления ошибок, выявленных в процессе использования протоколов, работающих с ASN.1[9]. В связи с этим, при переходе от одних стандартов к другим была обеспечена их полная совместимость. В частности, при получении одним пользователем от другого структуры, закодированной по правилам BER, зачастую невозможно с определенностью сказать, какой из стандартов тот использовал при кодировании[10].
BER, DER и CER активно применяют в различных протоколах передачи данных и в криптографических протоколах, как-то:
Несмотря на простоту в кодировании данных[14], многие считают BER, DER и CER неэффективными по сравнению с другими правилами кодирования, так как, во-первых, размер результата кодирования данных при помощи BER зачастую получается больше, чем при использовании его альтернатив, а во-вторых, само кодирование занимает несколько больше времени[7].
Такими схемами кодирования данных, разработанными для улучшения BER[6], являются Packed Encoding Rules (PER), XML Encoding Rules (XER) и ASN.1 SOAP, описанные соответственно в ITU-T X.691, X.693 и в X.892.
Данная страница на сайте WikiSort.ru содержит текст со страницы сайта "Википедия".
Если Вы хотите её отредактировать, то можете сделать это на странице редактирования в Википедии.
Если сделанные Вами правки не будут кем-нибудь удалены, то через несколько дней они появятся на сайте WikiSort.ru .