BER и CER: отличия от DER

ASN.1 (Abstract Syntax Notation One) определяет абстрактное описание данных, используемых в криптографии, сертификатах X.509, подписях и протоколах безопасности. Однако сам ASN.1 не задаёт способ физического представления данных — для этого используются правила кодирования (Encoding Rules), среди которых ключевыми являются BER, CER и DER.

В контексте JavaScript-библиотеки jsrsasign понимание различий между этими правилами критично, поскольку работа с сертификатами, ключами и подписями напрямую связана с корректным парсингом ASN.1 структур.


BER (Basic Encoding Rules)

BER является базовым и наиболее гибким способом кодирования ASN.1 структур. Он допускает несколько вариантов представления одних и тех же данных.

Основные характеристики BER

  • поддерживает как короткую, так и длинную форму длины поля
  • допускает неопределённую длину (indefinite length encoding)
  • может кодировать один и тот же объект разными способами
  • более сложен для строгого сравнения данных

Пример ключевой особенности BER — неопределённая длина:

SEQUENCE {
  OCTET STRING (indefinite length)
  ...
  END OF CONTENT
}

Такая гибкость делает BER удобным для потоковой передачи данных, но создаёт проблемы при криптографической валидации.


DER (Distinguished Encoding Rules)

DER — это строгий поднабор BER. Его цель — устранить неоднозначность представления данных.

Основные свойства DER

  • всегда используется определённая длина
  • отсутствует неопределённая длина
  • единственный допустимый способ кодирования для каждого ASN.1 объекта
  • обеспечивает детерминированный бинарный результат

Ключевая особенность DER — однозначность:

одна и та же структура всегда кодируется одинаково, независимо от реализации.

Значение DER в криптографии

DER используется в:

  • X.509 сертификатах
  • цифровых подписях (RSA, ECDSA)
  • PKCS#8, PKCS#7 структурах

Причина проста: криптографические подписи требуют бит-в-бит идентичного представления данных.


CER (Canonical Encoding Rules)

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

Основные свойства CER

  • всегда каноническое кодирование (как и DER)
  • использует только определённую длину
  • допускает фрагментацию больших элементов
  • применяется для типов с неограниченной длиной (например, большие OCTET STRING)

CER часто используется там, где DER становится неудобным из-за ограничений по размеру элементов.


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

Гибкость и строгость

  • BER — максимально гибкий, допускает неоднозначность
  • CER — строгий, но ориентирован на потоковые большие данные
  • DER — строгий и детерминированный

Использование длины

  • BER: короткая, длинная и неопределённая длина
  • CER: только определённая длина + сегментация
  • DER: только определённая длина без исключений

Предсказуемость результата

  • BER: низкая
  • CER: высокая
  • DER: максимальная

ASN.1 структура и влияние кодирования

Один и тот же ASN.1 объект может иметь разные бинарные представления при использовании BER, но только один корректный вариант при DER и CER.

Пример структуры:

SEQUENCE {
  INTEGER 10
  OCTET STRING "test"
}

В BER возможны разные формы кодирования длины и структуры, но DER фиксирует единственно допустимое представление.


Jsrsasign и обработка ASN.1 кодировок

Библиотека jsrsasign предоставляет инструменты для работы с ASN.1 структурами, включая декодирование и анализ сертификатов.

Основной модуль:

KJUR.asn1.ASN1Util

и низкоуровневые структуры:

ASN1Object
ASN1Integer
ASN1Sequence

Работа с DER в jsrsasign

Большинство операций в jsrsasign предполагают DER-кодирование по умолчанию, поскольку:

  • сертификаты X.509 всегда DER-кодированы
  • подписи требуют детерминированного представления
  • OpenSSL-совместимость основана на DER

Пример декодирования сертификата:

const certPEM = "-----BEGIN CERTIFICATE-----...";

const cert = new X509();
cert.readCertPEM(certPEM);

const subject = cert.getSubject();
const issuer = cert.getIssuer();

Внутри библиотека переводит PEM → DER → ASN.1 дерево.


BER в контексте jsrsasign

BER редко используется напрямую в jsrsasign, но может встречаться при:

  • анализе нестандартных ASN.1 структур
  • взаимодействии с потоковыми протоколами
  • работе с legacy системами

Особенность: jsrsasign может корректно прочитать BER-кодированные данные, но дальнейшая криптографическая обработка часто требует приведения к DER.


CER и его поддержка

CER практически не используется напрямую в jsrsasign API, однако концептуально важен при:

  • работе с очень большими ASN.1 объектами
  • взаимодействии с системами, где сертификаты или структуры превышают стандартные размеры

На практике CER чаще встречается в теоретической криптографии и низкоуровневых ASN.1 реализациях, чем в JavaScript-экосистеме.


Почему DER доминирует в криптографии

DER стал стандартом де-факто из-за необходимости:

  • однозначного хеширования данных перед подписью
  • предотвращения атак через альтернативное кодирование
  • обеспечения совместимости между реализациями

Если бы использовался BER, одна и та же структура могла бы иметь разные бинарные представления, что делало бы цифровые подписи ненадёжными.


Практическая интерпретация различий

При проверке подписи

  • входные данные должны быть строго DER
  • любое отклонение приводит к неверной подписи

При парсинге данных

  • BER может быть принят, но требует нормализации
  • CER встречается редко, но требует поддержки сегментации

При сериализации

  • jsrsasign всегда стремится к DER-совместимому выводу

ASN.1 и внутренняя модель jsrsasign

Внутри библиотеки ASN.1 представляется деревом объектов:

  • SEQUENCE → массив узлов
  • INTEGER → числовой объект
  • OCTET STRING → бинарный буфер

Каждый узел может быть сериализован в DER-форму:

const seq = new KJUR.asn1.DERSequence({
  array: [
    new KJUR.asn1.DERInteger({int: 10}),
    new KJUR.asn1.DERUTF8String({str: "test"})
  ]
});

const hex = seq.getEncodedHex();

Результат всегда будет DER-совместимым.


Ключевое различие в одном выражении

  • BER — «как можно представить»
  • CER — «как можно представить канонически для больших данных»
  • DER — «единственный правильный способ представить»