Класс KJUR.asn1.DERInteger

Класс KJUR.asn1.DERInteger является частью модуля ASN.1 в библиотеке Jsrsasign и предназначен для представления и кодирования целых чисел в формате DER (Distinguished Encoding Rules) согласно стандарту ASN.1. Этот тип данных используется в криптографических структурах, таких как X.509 сертификаты, RSA ключи, подписи и другие протоколы, где требуется строгое бинарное представление чисел.


Представление INTEGER в ASN.1 DER

В ASN.1 тип INTEGER кодируется в виде последовательности байтов с использованием дополнительного кода (two’s complement). Это означает:

  • Положительные числа могут требовать добавления ведущего байта 0x00, если старший бит установлен в 1, чтобы избежать интерпретации числа как отрицательного
  • Отрицательные числа кодируются в дополнительном коде
  • Используется минимальная длина представления (без лишних ведущих байтов)

Класс DERInteger инкапсулирует эти правила, автоматически выполняя корректное преобразование числа в бинарный DER-формат.


Основное назначение класса

KJUR.asn1.DERInteger используется для:

  • Кодирования целых чисел в ASN.1 структуре
  • Формирования криптографических объектов (RSA ключи, подписи)
  • Работы с X.509 сертификатами
  • Представления числовых параметров в PKI структурах

Конструктор и способы создания

Класс поддерживает создание объекта из различных типов входных данных:

  • JavaScript Number
  • строковое представление числа (десятичное или шестнадцатеричное)
  • объект BigInteger (внутренний тип Jsrsasign)

Типичные варианты использования:

var int1 = new KJUR.asn1.DERInteger({int: 123});
var int2 = new KJUR.asn1.DERInteger({int: "1024"});
var int3 = new KJUR.asn1.DERInteger({int: "0x01ff"});

При передаче строки библиотека самостоятельно определяет систему счисления.


Внутреннее представление и BigInteger

Внутри DERInteger почти всегда использует тип BigInteger из криптографического модуля Jsrsasign. Это необходимо по нескольким причинам:

  • JavaScript Number ограничен 53-битной точностью
  • ASN.1 INTEGER может быть произвольно большим (например, RSA модули)
  • Требуется точное побайтовое представление

Поэтому даже если входное значение задано как Number, оно конвертируется в BigInteger.


Кодирование в DER формат

Основная задача класса — преобразование числа в DER-байтовую последовательность:

Алгоритм кодирования:

  1. Преобразование числа в двоичное представление

  2. Удаление лишних ведущих байтов

  3. Проверка старшего бита:

    • если 1 у положительного числа → добавляется 0x00
    • если отрицательное → сохраняется two’s complement
  4. Формирование ASN.1 структуры:

    • Tag: 0x02
    • Length: длина байтов
    • Value: байтовое представление числа

Пример DER кодирования

var d1 = new KJUR.asn1.DERInteger({int: 127});
console.log(d1.getEncodedHex());

Результат:

02 01 7F

Если число становится больше 127:

var d2 = new KJUR.asn1.DERInteger({int: 128});
console.log(d2.getEncodedHex());

Результат:

02 02 00 80

Добавление 00 необходимо для сохранения знака числа.


Отрицательные числа

Отрицательные значения кодируются в формате two’s complement:

var d = new KJUR.asn1.DERInteger({int: -1});
console.log(d.getEncodedHex());

Результат:

02 01 FF

Особенности:

  • старший бит всегда 1
  • используется минимальная длина представления
  • отсутствует дополнительный padding

Основные методы

Хотя API может варьироваться в разных версиях Jsrsasign, обычно доступны следующие функциональные возможности:

getEncodedHex()

Возвращает DER-представление INTEGER в виде hex-строки.

var d = new KJUR.asn1.DERInteger({int: 256});
var hex = d.getEncodedHex();

getInteger()

Возвращает внутреннее числовое значение (обычно BigInteger или строковое представление).

var d = new KJUR.asn1.DERInteger({int: 1000});
var val = d.getInteger();

setInteger()

Позволяет изменить значение объекта после создания.

d.setInteger(5000);

Использование в ASN.1 структурах

DERInteger редко используется отдельно. Чаще он является частью более сложных структур:

RSA ключ

var asn1 = new KJUR.asn1.DERSequence({
  array: [
    new KJUR.asn1.DERInteger({int: 0}),      // version
    new KJUR.asn1.DERInteger({int: "n"}),    // modulus
    new KJUR.asn1.DERInteger({int: "e"}),    // public exponent
    new KJUR.asn1.DERInteger({int: "d"})     // private exponent
  ]
});

X.509 сертификат

INTEGER используется для:

  • serialNumber
  • version (через INTEGER 0,1,2)
  • RSA параметров

Особенности работы с большими числами

При работе с криптографическими ключами возникают значения длиной в сотни и тысячи бит. В этом случае:

  • использование JavaScript Number невозможно
  • применяется BigInteger
  • DERInteger автоматически адаптирует длину байтового массива

Минимизация байтового представления

Одной из ключевых задач является удаление избыточных байтов:

Пример:

00000101 → 05

Однако если старший бит результата равен 1:

10000001 → 00 81

Это строгое требование DER-формата, обеспечивающее однозначность кодирования.


Обработка строковых входных данных

При передаче строки:

  • "123" → десятичное число
  • "0x7B" → шестнадцатеричное
  • "FF" → интерпретируется как hex при наличии соответствующего префикса

Конвертация происходит автоматически перед созданием BigInteger.


Внутренняя структура объекта

Объект DERInteger наследует базовые возможности ASN.1 элемента:

  • tag = 0x02
  • valueHex содержит байтовую строку
  • length вычисляется автоматически
  • поддерживает вложение в DERSequence

Ошибки и ограничения

При работе с классом возможны типовые ограничения:

  • некорректная строка числа вызывает ошибку парсинга
  • переполнение Number приводит к потере точности (избегается через BigInteger)
  • недопустимые символы в hex-строке вызывают исключение

Практическое значение в криптографии

DERInteger является фундаментальным строительным блоком:

  • без него невозможно формировать RSA ключи
  • используется при подписи (DSA, ECDSA параметры)
  • участвует в сериализации криптографических структур

Любая ошибка в кодировании INTEGER приводит к несовместимости с OpenSSL, браузерами и криптографическими библиотеками.


Взаимодействие с другими ASN.1 типами

DERInteger часто комбинируется с:

  • DERBitString
  • DERSequence
  • DEROctetString
  • DERObjectIdentifier

В таких структурах он обеспечивает числовую основу протоколов.


Важные особенности реализации Jsrsasign

Реализация в Jsrsasign ориентирована на совместимость с:

  • RFC 5280 (X.509)
  • RFC 3447 (PKCS#1 RSA)
  • DER encoding rules ITU-T X.690

Поэтому поведение DERInteger строго детерминировано стандартами, а не произвольной логикой JavaScript.