Кривые Кобица представляют собой особый класс эллиптических кривых, определённых над конечными полями, обладающих дополнительной структурой, позволяющей ускорить операции скалярного умножения. Их основное преимущество заключается в использовании эндоморфизмов Фробениуса, что снижает вычислительную сложность криптографических операций.
Кривая secp256k1 относится к семейству кривых Кобица и широко применяется в криптографических системах, включая блокчейн-технологии. Она определена над простым полем ( _p ), где:
[ p = 2^{256} - 2^{32} - 977]
Уравнение кривой имеет вид:
[ y^2 = x^3 + 7]
Отсутствие линейного и квадратичного членов ((ax + b), где (a = 0)) делает эту кривую вычислительно удобной.
Основные параметры кривой:
Простое поле: (p = 2^{256} - 2^{32} - 977)
Коэффициенты:
Базовая точка (генератор) (G)
Порядок группы: [ n = 115792089237316195423570985008687907852837564279074904382605163141518161494337]
Кофактор: (h = 1)
Кофактор, равный единице, означает отсутствие подгрупп малых порядков, что положительно влияет на безопасность.
Библиотека jsrsasign предоставляет инструменты для работы с криптографией на основе эллиптических кривых, включая secp256k1.
Подключение библиотеки:
<script src="jsrsasign-all-min.js"></script>
Или через npm:
npm install jsrsasign
В jsrsasign кривая secp256k1 доступна через стандартное имя:
var ec = new KJUR.crypto.ECDSA({ curve: "secp256k1" });
Внутри библиотеки параметры кривой уже предопределены, включая генератор и порядок группы.
Создание приватного и публичного ключа:
var keypair = ec.generateKeyPairHex();
var privateKeyHex = keypair.ecprvhex;
var publicKeyHex = keypair.ecpubhex;
Публичный ключ может быть представлен в двух форматах:
04)02 или
03)Пример сжатия:
var compressed = KJUR.crypto.ECDSA.getCompressedPublicKeyHex(publicKeyHex);
Алгоритм ECDSA на secp256k1:
var message = "example message";
var hash = KJUR.crypto.Util.sha256(message);
var signature = ec.signHex(hash, privateKeyHex);
Процесс включает:
var isValid = ec.verifyHex(hash, signature, publicKeyHex);
Проверка выполняет:
Ключевая особенность secp256k1 как кривой Кобица — наличие эндоморфизма, позволяющего ускорить скалярное умножение:
[ (x, y) = (x, y)]
где () — специальный элемент поля.
Это позволяет разложить скаляр (k) на два меньших:
[ k = k_1 + k_2 ]
и вычислить:
[ kG = k_1 G + k_2 (G)]
В jsrsasign эта оптимизация не экспонируется напрямую, но используется в некоторых реализациях на низком уровне (в частности, в специализированных криптобиблиотеках).
Импорт приватного ключа:
var ec = new KJUR.crypto.ECDSA({ curve: "secp256k1" });
ec.setPrivateKeyHex(privateKeyHex);
Импорт публичного ключа:
ec.setPublicKeyHex(publicKeyHex);
Приватный ключ:
var pem = KEYUTIL.getPEM({
type: "EC",
curve: "secp256k1",
prv: privateKeyHex
}, "PKCS8PRV");
Публичный ключ:
var pemPub = KEYUTIL.getPEM({
type: "EC",
curve: "secp256k1",
pub: publicKeyHex
});
ECDSA требует фиксированной длины входа. В jsrsasign используется SHA-256:
var hashHex = KJUR.crypto.Util.sha256("data");
Важно: длина хеша не должна превышать битовую длину порядка (n).
Преимущества:
Особенности:
Операции на кривой:
Формулы:
Для сложения:
[ = ]
Для удвоения:
[ = ]
var ec = new KJUR.crypto.ECDSA({ curve: "secp256k1" });
// Генерация ключей
var kp = ec.generateKeyPairHex();
// Хеш сообщения
var msg = "hello";
var hash = KJUR.crypto.Util.sha256(msg);
// Подпись
var sig = ec.signHex(hash, kp.ecprvhex);
// Проверка
var valid = ec.verifyHex(hash, sig, kp.ecpubhex);
console.log(valid); // true
Подпись ECDSA представляется как ASN.1 DER структура:
var parsed = KJUR.crypto.ECDSA.parseSigHex(sig);
Возвращает:
Важный аспект безопасности — выбор случайного числа (k):
Возможна детерминированная генерация (RFC 6979), но в jsrsasign она не включена по умолчанию.
Перед использованием:
Кривая secp256k1 используется в Bitcoin:
jsrsasign может использоваться для генерации и подписи, но не предоставляет полный стек для работы с Bitcoin.
Такая последовательность лежит в основе большинства криптографических протоколов, использующих эллиптические кривые.