Подтвердить что ты не робот

Криптография порога эллиптической кривой в node

Я хотел бы реализовать что-то вроде правило двух человек, используя криптографию эллиптической кривой в javascript.

Изменить: я по существу ищу что-то вроде биткойновского мультисига.

Поэтому мне нужно собрать два открытых ключа, чтобы получить комбинированный ключ, который требует, чтобы оба закрытых ключа создавали подпись. См. https://crypto.stackexchange.com/info/25250/adding-two-public-keys.

Как это сделать в node?

4b9b3361

Ответ 1

Поскольку криптосистемы порога эллиптической кривой обладают свойством добавления ключей, почему бы не просто сделать это?

Я попытался это сделать с помощью elliptic module для node.js, просто установите его с помощью npm, а затем попробуйте следующее

var EC = require('elliptic').ec;
// we use the same preset of bitcoin, but should work with the other ones too
var ec = new EC('secp256k1');

// generate two (or more) starting keypairs
var key1 = ec.genKeyPair();
var key2 = ec.genKeyPair();

// sum the public... 
var sum = key1.getPublic().add(key2.getPublic());
// ...and private keys
var psum = key1.getPrivate().add(key2.getPrivate());

Поскольку открытыми ключами являются Point объекты, а закрытые ключи - это объекты BigNumber, вы можете просто вызвать функцию add() для обоих из них. На этом этапе sum и psum удерживайте ваши комбинированные клавиши, но прежде чем использовать их для подписания сообщения, вам нужно создать объект KeyPair (часть эллиптического модуля).

// generate two new random keypairs
var privateKeySum = ec.genKeyPair();
var publicKeySum = ec.genKeyPair();

// we don't care about their values
// so just import the sum of keys into them
privateKeySum._importPrivate(psum);
publicKeySum._importPublic(sum);

Как вы можете видеть, для создания новой пары ключей я просто делаю новые случайные, а затем использую функции _importPrivate() и _importPublic() для загрузки комбинированных ключей.

Немного взломанный, я знаю, но он работает.

Лучшим решением было бы просто экспортировать объект KeyPair из модуля и создать новые с помощью своего конструктора.

После этого просто продолжайте, как обычно, как в примере, предоставленном модулем readme:

var msg = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ];
// Sign the message with our new combined private key
var signature = privateKeySum.sign(msg);

// Export DER encoded signature in Array
var derSign = signature.toDER();

// Verify signature using the combined public key, should return true
console.log(publicKeySum.verify(msg, derSign));

Используя это, после первого поколения вы можете запросить два (или более) открытых ключа, необходимых для проверки сигнатуры сообщения. Если вы рассматриваете открытые ключи как "пароли", вы можете проверить подпись на любое сообщение, чтобы убедиться, что два открытых ключа являются исходными.

Кроме того, это должно работать с несколькими ключами, но для этого всегда требуется all.