Типы ASN.1: INTEGER, BIT STRING, OCTET STRING, NULL, OID

INTEGER в ASN.1 представляется в jsrsasign как один из базовых примитивов DER-кодирования и используется для хранения целочисленных значений произвольной длины. В библиотеке Jsrsasign работа с INTEGER реализована через класс KJUR.asn1.DERInteger, который формирует корректное DER-представление числа с учётом знака и минимальной длины байтового представления.

Внутренне ASN.1 INTEGER кодируется в двоичном виде в формате big-endian, где старший бит первого байта определяет знак числа. Это означает, что при кодировании положительных чисел, у которых старший бит может быть установлен в 1, добавляется дополнительный байт 0x00 для предотвращения интерпретации значения как отрицательного.

Пример создания INTEGER в jsrsasign:

const intObj = new KJUR.asn1.DERInteger({ int: 12345 });
const hex = intObj.getEncodedHex();

Также возможно передавать отрицательные значения:

const intNeg = new KJUR.asn1.DERInteger({ int: -42 });

При работе с криптографическими структурами INTEGER часто используется для представления версий, порядковых номеров, длины параметров и компонентов ключей. В частности, в структурах сертификатов X.509 целые числа применяются для серийных номеров.


BIT STRING представляет собой тип ASN.1, предназначенный для хранения последовательности битов, где длина может быть не кратна байту. В jsrsasign данный тип реализуется через KJUR.asn1.DERBitString. В отличие от OCTET STRING, BIT STRING хранит дополнительный первый байт, указывающий количество неиспользуемых битов в последнем октете.

Структура BIT STRING в DER включает:

  • байт количества unused bits
  • последовательность байтов данных

Пример создания BIT STRING:

const bitStr = new KJUR.asn1.DERBitString({
  hex: "a0ff12"
});

const encoded = bitStr.getEncodedHex();

Также можно задавать значение через бинарную строку:

const bitStr2 = new KJUR.asn1.DERBitString({
  bin: "11001010"
});

BIT STRING широко используется в криптографии, например в X.509 сертификатах для хранения публичного ключа, где важна точная битовая структура без выравнивания до байта.


OCTET STRING используется для хранения произвольных бинарных данных, представленных как последовательность байтов. В jsrsasign он реализован через KJUR.asn1.DEROctetString.

В отличие от BIT STRING, OCTET STRING не содержит метаданных о битовой длине, так как всегда оперирует байтами.

Пример создания OCTET STRING:

const oct = new KJUR.asn1.DEROctetString({
  hex: "deadbeef"
});

const encoded = oct.getEncodedHex();

Также поддерживается строковое представление:

const oct2 = new KJUR.asn1.DEROctetString({
  str: "Hello"
});

В криптографических структурах OCTET STRING часто используется для хранения:

  • хешей
  • зашифрованных данных
  • параметров алгоритмов
  • сериализованных структур

Особенность OCTET STRING в ASN.1 заключается в том, что он может содержать вложенные ASN.1 структуры, закодированные как байтовая последовательность.


NULL в ASN.1 обозначает отсутствие значения и реализуется в jsrsasign через KJUR.asn1.DERNull. Этот тип не содержит полезной нагрузки и всегда кодируется фиксированным образом.

DER-представление NULL всегда одинаково:

  • тег: 0x05
  • длина: 0x00

Пример создания:

const nullObj = new KJUR.asn1.DERNull();
const encoded = nullObj.getEncodedHex();

NULL используется в случаях, когда параметр алгоритма или поле структуры должно быть явно задано как пустое значение. Например, в алгоритмах подписи RSA часто указывается NULL для параметров, которые не используются.

В X.509 сертификатах NULL встречается в поле параметров алгоритма подписи, где оно обозначает отсутствие дополнительных параметров.


OID (Object Identifier) представляет собой иерархический идентификатор, используемый для уникального обозначения алгоритмов, атрибутов и структур данных. В jsrsasign OID реализуется через KJUR.asn1.DERObjectIdentifier.

OID состоит из последовательности чисел, разделённых точками, например 1.2.840.113549.

Пример создания OID:

const oid = new KJUR.asn1.DERObjectIdentifier({
  oid: "1.2.840.113549.1.1.11"
});

const encoded = oid.getEncodedHex();

Этот OID соответствует алгоритму sha256WithRSAEncryption.

Особенность кодирования OID заключается в том, что первые два числа кодируются в одном байте по формуле:

first_byte = 40 * value1 + value2

Остальные элементы кодируются в формате base-128 с использованием continuation bit (0x80).

OID широко используется в ASN.1 структурах для:

  • идентификации криптографических алгоритмов
  • указания типов атрибутов в сертификатах
  • описания политик и расширений

В jsrsasign OID часто используется совместно с последовательностями DERSequence, формируя сложные структуры, например AlgorithmIdentifier:

const alg = new KJUR.asn1.DERSequence({
  array: [
    new KJUR.asn1.DERObjectIdentifier({ oid: "1.2.840.113549.1.1.1" }),
    new KJUR.asn1.DERNull()
  ]
});

Такая комбинация определяет RSA без параметров.


Каждый из рассмотренных типов является базовым строительным блоком ASN.1-структур в jsrsasign. INTEGER обеспечивает числовую основу, BIT STRING — точное битовое представление, OCTET STRING — универсальный контейнер байтовых данных, NULL — явное отсутствие значения, OID — глобальную систему идентификации элементов криптографической экосистемы.