Формат ASN.1
ASN.1 (Abstract Syntax Notation One, Абстрактная синтаксическая нотация версии один) — это стандартизированный язык описания структур данных и правил их сериализации (кодирования) для передачи по сетям связи или хранения. Он предназначен для обеспечения аппаратной и программной независимости представления информации, позволяя описывать сложные типы данных (целые числа, строки, последовательности, множества, выбор из альтернатив) вне зависимости от конкретной вычислительной платформы или языка программирования. ASN.1 является международным стандартом: ITU-T X.680 (описание нотации) и X.690 (правила кодирования).
История
Разработка ASN.1 началась в 1980-х годах в рамках деятельности Международного союза электросвязи (ITU-T) и Международной организации по стандартизации (ISO). Основной целью было создание универсального формата для обмена данными в гетерогенных компьютерных сетях, где машины могли иметь разную разрядность, порядок байтов (endianness) и способы представления чисел. Первая версия стандарта была опубликована в 1984 году как часть рекомендаций X.409 для систем электронной почты X.400. Впоследствии нотация была выделена в отдельный стандарт X.208 (1988 год), а затем переработана в современную версию X.680 (1994 год).
ASN.1 получил широкое распространение в телекоммуникационных протоколах (GSM, UMTS, LTE), в системах управления сетями (SNMP), в криптографических приложениях (сертификаты X.509, подписи PKCS#7, криптографические сообщения CMS) и в протоколах аутентификации (Kerberos, LDAP). В 1990-х годах, с развитием интернета, появились альтернативные форматы (XML, JSON, Protocol Buffers), однако ASN.1 остаётся востребованным в областях, требующих высокой компактности, строгой типизации и определённых правил кодирования, особенно в телекоммуникациях и криптографии.
Основные понятия
Типы данных
ASN.1 определяет набор встроенных (примитивных) типов, а также позволяет создавать пользовательские (конструируемые) типы. Классификация включает:
- Примитивные типы:
INTEGER(целое число произвольной точности),BOOLEAN(логическое значение),REAL(вещественное число),OCTET STRING(последовательность байтов),BIT STRING(последовательность битов),OBJECT IDENTIFIER(идентификатор объекта — уникальный числовой код, например, для алгоритмов шифрования),UTF8String,IA5String,PrintableString(строки в разных кодировках),UTCTime,GeneralizedTime(временные метки). - Конструируемые типы:
SEQUENCE(упорядоченная последовательность элементов разных типов, аналог структуры в C),SET(неупорядоченное множество элементов разных типов),SEQUENCE OF(список однотипных элементов),SET OF(множество однотипных элементов),CHOICE(выбор одного из нескольких вариантов),ENUMERATED(перечисление именованных целочисленных констант). - Типы-обёртки:
IMPLICIT(изменение тега без дополнительной маркировки),EXPLICIT(добавление внешнего тега).
Модули и импорты
Спецификации ASN.1 организуются в модули — именованные блоки, содержащие определения типов и значений. Модули могут импортировать типы из других модулей, что позволяет создавать иерархические и переиспользуемые описания. Пример заголовка модуля:
`` MyModule DEFINITIONS AUTOMATIC TAGS ::= BEGIN -- определения типов END ``
Тегирование
Каждый тип данных в ASN.1 имеет уникальный тег (метку), который используется при кодировании для идентификации типа. Теги бывают:
- Универсальные (universal) — зарезервированы для встроенных типов (например, тег 2 для
INTEGER, тег 16 дляSEQUENCE). - Контекстно-зависимые (context-specific) — определяются в рамках конкретного
CHOICEилиSEQUENCE. - Частные (private) — для специфических нужд организаций.
- Прикладные (application-wide) — для протокольных типов.
При использовании AUTOMATIC TAGS компилятор автоматически назначает контекстно-зависимые теги для всех полей SEQUENCE и SET, что упрощает написание спецификаций.
Правила кодирования (Encoding Rules)
ASN.1 не определяет способ представления данных в байтах — это делают отдельные стандарты, называемые правилами кодирования. Наиболее распространённые:
BER (Basic Encoding Rules — базовые правила кодирования)
Стандарт ITU-T X.690. Каждое значение кодируется по схеме TLV (Tag — Length — Value):
- Tag — один или несколько байтов, идентифицирующих тип.
- Length — один или несколько байтов, указывающих длину значения (в байтах). Может быть фиксированной или неопределённой (для конструируемых типов).
- Value — собственно данные.
BER является самодокументируемым форматом: декодер может разобрать сообщение, зная только правила кодирования, без предварительного знания схемы ASN.1. Однако BER имеет избыточность (например, для целого числа 0 может потребоваться 3 байта: тег, длина, значение).
DER (Distinguished Encoding Rules — отличительные правила кодирования)
Подмножество BER, которое налагает дополнительные ограничения для обеспечения единственности кодирования:
- Длина всегда фиксированная (неопределённая длина запрещена).
- Для
BOOLEANиспользуется только один байт значения (0xFF дляTRUE, 0x00 дляFALSE). - Для
BIT STRINGиOCTET STRINGиспользуется минимально возможная длина. - Порядок элементов в
SETдолжен быть отсортирован по тегам.
DER широко применяется в криптографии, где требуется однозначное представление данных для вычисления цифровых подписей (например, в сертификатах X.509).
CER (Canonical Encoding Rules — канонические правила кодирования)
Аналогичен DER, но допускает неопределённую длину для конструируемых типов. Используется реже, в основном для потоковой передачи.
PER (Packed Encoding Rules — упакованные правила кодирования)
Стандарт ITU-T X.691. Ориентирован на максимальную компактность. PER не использует теги и явную длину — вместо этого кодирование основывается на знании схемы (на стороне отправителя и получателя). Размер сообщения может быть в 2–10 раз меньше, чем при BER. PER бывает:
- ALIGNED PER — значения выравниваются на границы байтов.
- UNALIGNED PER — биты упаковываются без выравнивания, что даёт ещё большую экономию, но усложняет декодирование.
PER используется в протоколах с ограниченной пропускной способностью (GSM, UMTS, LTE, ZigBee).
XER (XML Encoding Rules — правила кодирования в XML)
Стандарт ITU-T X.693. Представляет данные ASN.1 в виде XML-документа. Позволяет использовать текстовые инструменты (XSLT, XPath) для обработки. Применяется для совместимости с веб-сервисами и системами, где XML является основным форматом.
OER (Octet Encoding Rules — октетные правила кодирования)
Стандарт ITU-T X.696. Промежуточный вариант между BER и PER: использует фиксированную длину полей, но без тегов. Обеспечивает быстрое кодирование/декодирование и умеренную компактность.
Применение
Телекоммуникации
- GSM/UMTS/LTE/5G: все сообщения протоколов управления (RRC, NAS, MM) описываются на ASN.1 и кодируются PER. Это позволяет уместить сигнальные сообщения в минимальное количество бит.
- SNMP (Simple Network Management Protocol): данные управляющей информации (MIB) описываются с помощью ASN.1, а передаются в BER-кодировании.
- LDAP (Lightweight Directory Access Protocol): запросы и ответы кодируются с помощью BER.
Криптография и безопасность
- Сертификаты X.509: структура сертификата (версия, серийный номер, издатель, владелец, открытый ключ, подпись) описывается на ASN.1 и кодируется DER. Это обеспечивает однозначность при проверке подписи.
- PKCS#7 / CMS (Cryptographic Message Syntax): формат зашифрованных и подписанных сообщений (например, в S/MIME).
- Kerberos: билеты и аутентификационные сообщения используют ASN.1 (DER).
- Электронная подпись (ГОСТ Р 34.10-2012): в российских стандартах криптографической защиты информации ASN.1 применяется для описания ключей и подписей.
Управление сетями
- CMIP (Common Management Information Protocol): протокол управления сетями OSI, использующий ASN.1.
- CORBA (Common Object Request Broker Architecture): интерфейсы и типы данных описываются с помощью IDL, который может быть отображён на ASN.1.
Авиация и транспорт
- AIDC (ATS Interfacility Data Communications): протокол обмена данными между диспетчерскими центрами в гражданской авиации использует ASN.1 (PER).
- IETF (Internet Engineering Task Force): многие протоколы (например, EAP, RADIUS, Diameter) используют ASN.1 для описания атрибутов.
Инструменты и компиляторы
Для работы с ASN.1 используются компиляторы, которые на основе текстовой спецификации генерируют код на языках программирования (C, C++, Java, Python, Go, Rust) для кодирования/декодирования данных. Наиболее известные:
- ASN1C (Objective Systems) — коммерческий компилятор с поддержкой BER/DER/PER/XER.
- asn1c (Lev Walkin) — открытый компилятор для C, поддерживающий BER/DER/PER/XER.
- pyasn1 (Python) — библиотека для работы с ASN.1, поддерживающая BER/DER.
- JACOB (Java ASN.1 Compiler) — компилятор для Java.
- asn1tools (Rust) — библиотека для кодирования/декодирования.
Критика и ограничения
- Сложность: ASN.1 имеет избыточную нотацию с множеством опций (теги, имплицитные/эксплицитные типы, автоматические теги), что затрудняет изучение и отладку.
- Избыточность BER: при использовании BER размер сообщения может быть в 2–3 раза больше, чем у бинарных форматов с фиксированной схемой (например, Protocol Buffers).
- Отсутствие поддержки в веб-среде: ASN.1 не является нативным форматом для браузеров или JavaScript, что ограничивает его применение в веб-приложениях (хотя существуют полифиллы, например, asn1.js).
- Конкуренция с альтернативами: в современных системах часто используются JSON (для текстового обмена) и Protocol Buffers / FlatBuffers (для бинарного обмена), которые проще в освоении и имеют более широкую экосистему.
Интересные факты
- ASN.1 является единственным стандартом, который одновременно поддерживает и текстовое (XER), и бинарное (BER/PER) представление одних и тех же данных.
- Идентификаторы объектов (OID) в ASN.1 используются для однозначной идентификации алгоритмов, протоколов и организаций. Например, OID 1.2.840.113549.1.1.1 соответствует алгоритму RSA.
- В России ASN.1 применяется в стандартах электронной подписи (ГОСТ Р 34.10-2012, ГОСТ Р 34.11-2012) и в протоколах защищённого обмена (например, в системе «КриптоПро»).
Источники
- ITU-T Recommendation X.680 (2021) — Information technology — Abstract Syntax Notation One (ASN.1): Specification of basic notation.
- ITU-T Recommendation X.690 (2021) — Information technology — ASN.1 encoding rules: Specification of Basic Encoding Rules (BER), Canonical Encoding Rules (CER) and Distinguished Encoding Rules (DER).
- ITU-T Recommendation X.691 (2021) — Information technology — ASN.1 encoding rules: Specification of Packed Encoding Rules (PER).
- ITU-T Recommendation X.693 (2021) — Information technology — ASN.1 encoding rules: XML Encoding Rules (XER).
- ITU-T Recommendation X.696 (2021) — Information technology — ASN.1 encoding rules: Specification of Octet Encoding Rules (OER).
- ISO/IEC 8824-1:2021 — Information technology — Abstract Syntax Notation One (ASN.1) — Part 1: Specification of basic notation.
- ISO/IEC 8825-1:2021 — Information technology — ASN.1 encoding rules — Part 1: Specification of Basic Encoding Rules (BER), Canonical Encoding Rules (CER) and Distinguished Encoding Rules (DER).
- Dubuisson, O. (2000). ASN.1 — Communication Between Heterogeneous Systems. Morgan Kaufmann.
- Lev Walkin. ASN.1 Compiler (asn1c) — документация и исходные коды.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →