В библиотеке jsrsasign координаты точек используются преимущественно при работе с эллиптическими кривыми (ECC). Точка на кривой определяется парой значений (x, y), которые представляют собой большие целые числа, принадлежащие конечному полю.
Внутренне координаты хранятся в виде объектов класса
BigInteger, что позволяет выполнять арифметические операции
с числами произвольной длины. Это критично для криптографии, где
стандартные типы JavaScript (например, Number) не
обеспечивают необходимую точность.
Координаты точек могут быть представлены в нескольких форматах:
1. Шестнадцатеричный формат (Hex) Наиболее распространённый способ хранения:
var xHex = "18b18ac0...";
var yHex = "12345678...";
2. BigInteger
var x = new BigInteger(xHex, 16);
var y = new BigInteger(yHex, 16);
3. ASN.1 / DER-кодировка Используется при сериализации ключей и подписей:
var pointHex = "04" + xHex + yHex;
Префикс 04 означает несжатую форму точки.
В jsrsasign работа с точками выполняется через класс
ECPointFp. Для создания точки требуется:
var ec = new KJUR.crypto.ECDSA({"curve": "secp256r1"});
var curve = ec.ecparams.curve;
var x = new BigInteger(xHex, 16);
var y = new BigInteger(yHex, 16);
var point = new ECPointFp(curve, curve.fromBigInteger(x), curve.fromBigInteger(y));
Особенности:
Корректность координат проверяется через подстановку в уравнение кривой:
[ y^2 x^3 + ax + b ]
В jsrsasign:
var isValid = curve.validate(point);
Если точка не принадлежит кривой:
Для уменьшения размера данных применяется сжатие точки:
Несжатый формат:
04 || X || Y
Сжатый формат:
02/03 || X
02 — если Y чётное03 — если Y нечётноеПример сжатия:
var compressed = point.getEncoded(true);
Восстановление:
var decompressedPoint = curve.decodePointHex(compressedHex);
При восстановлении координата Y вычисляется из X с использованием уравнения кривой.
Координаты используются при выполнении операций:
var result = point1.add(point2);
var doubled = point.twice();
var k = new BigInteger("12345", 10);
var multiplied = point.multiply(k);
Все операции выполняются в поле по модулю p.
Публичный ключ в ECC — это точка:
var ec = new KJUR.crypto.ECDSA({"curve": "secp256r1"});
var keypair = ec.generateKeyPairHex();
var pubKeyHex = keypair.ecpubhex;
Извлечение координат:
var x = pubKeyHex.substr(2, 64);
var y = pubKeyHex.substr(66, 64);
04)При создании подписи ECDSA используются промежуточные точки:
kGrvar sig = new KJUR.crypto.Signature({"alg": "SHA256withECDSA"});
sig.init(privateKey);
sig.updateString("data");
var signature = sig.sign();
Внутренне:
Преобразование между форматами:
Hex → BigInteger
var bi = new BigInteger(hex, 16);
BigInteger → Hex
var hex = bi.toString(16);
Hex → ByteArray
var bytes = KJUR.crypto.Util.hexToBytes(hex);
1. Неверная длина
2. Отсутствие ведущих нулей
// Неправильно
"1a2b"
// Правильно
"001a2b"
3. Несоответствие кривой
4. Нарушение формата точки
04, 02,
03)Использование Jacobian-координат
Во внутренних вычислениях библиотека может применять альтернативные системы координат для ускорения:
Это прозрачно для разработчика, но влияет на производительность.
validate()Особое внимание уделяется:
var ec = new KJUR.crypto.ECDSA({"curve": "secp256r1"});
var keypair = ec.generateKeyPairHex();
var pub = keypair.ecpubhex;
// Извлечение координат
var xHex = pub.substr(2, 64);
var yHex = pub.substr(66, 64);
// Создание точки
var curve = ec.ecparams.curve;
var x = new BigInteger(xHex, 16);
var y = new BigInteger(yHex, 16);
var point = new ECPointFp(curve, curve.fromBigInteger(x), curve.fromBigInteger(y));
// Проверка
if (curve.validate(point)) {
console.log("Точка корректна");
}
Координаты точек используются в:
Во всех случаях: