Класс KJUR.asn1.DERInteger является частью модуля ASN.1
в библиотеке Jsrsasign и предназначен для представления и кодирования
целых чисел в формате DER (Distinguished Encoding Rules) согласно
стандарту ASN.1. Этот тип данных используется в криптографических
структурах, таких как X.509 сертификаты, RSA ключи, подписи и другие
протоколы, где требуется строгое бинарное представление чисел.
В ASN.1 тип INTEGER кодируется в виде последовательности байтов с использованием дополнительного кода (two’s complement). Это означает:
0x00, если старший бит установлен в 1, чтобы избежать
интерпретации числа как отрицательногоКласс DERInteger инкапсулирует эти правила,
автоматически выполняя корректное преобразование числа в бинарный
DER-формат.
KJUR.asn1.DERInteger используется для:
Класс поддерживает создание объекта из различных типов входных данных:
Типичные варианты использования:
var int1 = new KJUR.asn1.DERInteger({int: 123});
var int2 = new KJUR.asn1.DERInteger({int: "1024"});
var int3 = new KJUR.asn1.DERInteger({int: "0x01ff"});
При передаче строки библиотека самостоятельно определяет систему счисления.
Внутри DERInteger почти всегда использует тип BigInteger
из криптографического модуля Jsrsasign. Это необходимо по нескольким
причинам:
Поэтому даже если входное значение задано как Number,
оно конвертируется в BigInteger.
Основная задача класса — преобразование числа в DER-байтовую последовательность:
Преобразование числа в двоичное представление
Удаление лишних ведущих байтов
Проверка старшего бита:
1 у положительного числа → добавляется
0x00Формирование ASN.1 структуры:
0x02var 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Хотя API может варьироваться в разных версиях Jsrsasign, обычно доступны следующие функциональные возможности:
Возвращает DER-представление INTEGER в виде hex-строки.
var d = new KJUR.asn1.DERInteger({int: 256});
var hex = d.getEncodedHex();
Возвращает внутреннее числовое значение (обычно BigInteger или строковое представление).
var d = new KJUR.asn1.DERInteger({int: 1000});
var val = d.getInteger();
Позволяет изменить значение объекта после создания.
d.setInteger(5000);
DERInteger редко используется отдельно. Чаще он является
частью более сложных структур:
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
]
});
INTEGER используется для:
При работе с криптографическими ключами возникают значения длиной в сотни и тысячи бит. В этом случае:
Одной из ключевых задач является удаление избыточных байтов:
Пример:
00000101 → 05
Однако если старший бит результата равен 1:
10000001 → 00 81
Это строгое требование DER-формата, обеспечивающее однозначность кодирования.
При передаче строки:
"123" → десятичное число"0x7B" → шестнадцатеричное"FF" → интерпретируется как hex при наличии
соответствующего префиксаКонвертация происходит автоматически перед созданием BigInteger.
Объект DERInteger наследует базовые возможности ASN.1
элемента:
0x02При работе с классом возможны типовые ограничения:
DERInteger является фундаментальным строительным
блоком:
Любая ошибка в кодировании INTEGER приводит к несовместимости с OpenSSL, браузерами и криптографическими библиотеками.
DERInteger часто комбинируется с:
DERBitStringDERSequenceDEROctetStringDERObjectIdentifierВ таких структурах он обеспечивает числовую основу протоколов.
Реализация в Jsrsasign ориентирована на совместимость с:
Поэтому поведение DERInteger строго детерминировано
стандартами, а не произвольной логикой JavaScript.