BigInteger в jsbn представляет собой реализацию длинной арифметики на
основе массивов 28–32-битных “слов”, что позволяет выполнять операции
над числами произвольной длины, выходящей за пределы стандартного
Number в JavaScript. В контексте jsrsasign эта реализация
используется для всех криптографических вычислений, включая RSA, DSA,
ECDSA (в части вспомогательных операций), а также для работы с большими
модулями и экспонентами.
В jsbn число хранится в виде массива, где каждый элемент — это фрагмент числа в базе 2^26 или 2^28 (в зависимости от конфигурации). Такая схема позволяет эффективно выполнять операции переноса разрядов.
Ключевые особенности представления:
Создание экземпляра BigInteger:
var n1 = new BigInteger("12345678901234567890", 10);
var n2 = new BigInteger("deadbeef", 16);
var n3 = new BigInteger([1, 2, 3]); // внутренний формат
Поддерживаемые системы счисления:
BigInteger в jsbn реализует классические операции длинной арифметики.
var a = new BigInteger("999999999999999999");
var b = new BigInteger("123456789");
var sum = a.add(b);
var diff = a.subtract(b);
Алгоритм основан на поразрядном сложении с переносом. В случае вычитания выполняется borrow-логика.
var prod = a.multiply(b);
Используется классический алгоритм O(n²), оптимизированный для малых значений. В некоторых сборках jsrsasign возможны ускоренные варианты для определённых размеров чисел.
var div = a.divide(b);
var mod = a.mod(b);
Алгоритм деления основан на нормализованном long division с оценкой частного по старшим разрядам.
Часто используется комбинированная операция:
var result = a.divRem(b);
Модульные операции — ключевой компонент криптографии RSA.
var mod = new BigInteger("1000000007");
var result = a.mod(mod);
Одна из наиболее важных операций:
var base = new BigInteger("12345");
var exp = new BigInteger("6789");
var mod = new BigInteger("10007");
var res = base.modPow(exp, mod);
Это основа RSA-шифрования и подписи.
Алгоритм:
var g = a.gcd(b);
Расширенная версия:
var eg = a.egcd(b);
Результат содержит:
Используется для вычисления мультипликативных обратных элементов:
var inv = a.modInverse(m);
Хотя BigInteger не является битовым типом, jsbn поддерживает базовые операции:
a.shiftLeft(5);
a.shiftRight(3);
Также доступны:
bitLength() — длина в битахtestBit(n) — проверка битаsetBit(n) — установка битаclearBit(n) — сброс битаЭти операции критически важны для криптографических проверок и генерации ключей.
a.toString(10);
a.toString(16);
var bytes = a.toByteArray();
Массив байтов используется в DER/ASN.1 структурах, сертификатах и подписях.
var a = new BigInteger(bytes);
BigInteger поддерживает знаковую арифметику:
var neg = a.negate();
var abs = a.abs();
В криптографическом контексте отрицательные значения используются редко, но важны при промежуточных вычислениях.
a.compareTo(b); // -1, 0, 1
a.equals(b);
a.signum();
Сравнение выполняется по длине массива и затем поразрядно.
BigInteger является основой RSA-операций в jsrsasign:
n = p * qd ≡ e⁻¹ mod φ(n)c = m^e mod nm = c^d mod nПример схемы:
var m = new BigInteger("42");
var c = m.modPow(e, n);
var decrypted = c.modPow(d, n);
В jsbn присутствуют оптимизации:
var rnd = new BigInteger(256, new SecureRandom());
Используется для:
var p = new BigInteger("...");
p.isProbablePrime(10);
Генерация простых чисел:
var prime = new BigInteger(1024, 1, random);
Параметры управляют:
В jsrsasign BigInteger интегрирован в:
Типичный поток данных:
Ограничения:
Number вместо BigInteger для
криптографииBigInteger выступает фундаментальным уровнем абстракции, на котором строится:
Без этой реализации невозможна корректная работа RSA-алгоритмов в чистом JavaScript окружении.