2015-07-04 8 views
11

Ich möchte etwas wie die two-man rule mit elliptischen Kurven Kryptografie in Javascript implementieren.Elliptische Kurve Schwellenwert Kryptografie in Knoten

Edit: Ich bin im Wesentlichen auf der Suche nach etwas wie Bitcoin Multisig.

Also muss ich zwei öffentliche Schlüssel kombinieren, um einen kombinierten Schlüssel zu erhalten, der beide privaten Schlüssel benötigt, um eine Signatur zu erzeugen. Siehe https://crypto.stackexchange.com/questions/25250/adding-two-public-keys.

Wie kann ich dies in Knoten tun?

+2

So etwas wie folgt: https://github.com/wanderer/secp256k1-node aber komplett in JS ohne C? –

+0

Versuchen Sie, es im Browser oder mit Knoten zu tun? – Breedly

+0

Der Versuch, es in Knoten zu tun. –

Antwort

7

Da Kryptosysteme mit elliptischer Kurve die Eigenschaft haben, Schlüssel hinzuzufügen, warum nicht einfach?

Ich habe dies versucht, mit der elliptic module für node.js, installieren Sie es einfach mit npm und dann versuchen, die folgende

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()); 

Da die öffentlichen Schlüssel sind Point Objekte und private Schlüssel sind BigNumber Objekte, können Sie einfach Rufen Sie die Funktion add() bei beiden an. An diesem Punkt, sum und psum halten Sie Ihre kombinierten Schlüssel, aber bevor Sie sie zum Signieren einer Nachricht verwenden, müssen Sie ein KeyPair-Objekt (Teil des elliptischen Moduls) erstellen.

// 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); 

Wie Sie können, finden Sie eine neue Schlüsselpaar erstellen ich neue zufällige diejenigen machen einfach und verwenden Sie dann die _importPrivate() und _importPublic() Funktionen der kombinierten Schlüssel zu laden.

Es ist ein bisschen hacky, ich weiß, aber es funktioniert.

Eine bessere Lösung wäre, das KeyPair-Objekt einfach aus dem Modul zu exportieren und neue mit ihrem Konstruktor zu erstellen.

Danach, genauso normal weitergehen, wie in dem von der Modul readme bereitgestellt Beispiel:

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)); 

dieser Verwendung, nach der ersten Generation, können Sie für die zwei (oder mehr) öffentlichen Schlüssel fragen erforderlich um eine Nachrichtensignatur zu überprüfen. Wenn Sie die öffentlichen Schlüssel als "Kennwörter" behandeln, können Sie eine Signatur anhand einer beliebigen Nachricht überprüfen, um sicherzustellen, dass es sich bei den beiden öffentlichen Schlüsseln um die ursprünglichen handelt.

Auch dies sollte mit mehreren Schlüsseln funktionieren, aber es wird immer alle von ihnen, um erfolgreich zu sein.