2015-07-04 48 views
11

我想實現類似於使用橢圓曲線密碼學的two-man rule節點中的橢圓曲線門限密碼學

編輯:我基本上在尋找類似比特幣multisig的東西。

所以我需要結合兩個公鑰來得到一個組合密鑰,它需要兩個私鑰才能生成一個簽名。請參閱https://crypto.stackexchange.com/questions/25250/adding-two-public-keys

如何在節點中做到這一點?

+2

這樣的事情:https://github.com/wanderer/secp256k1-node但完全在沒有C的JS? –

+0

你想在瀏覽器或節點上做它嗎? – Breedly

+0

試圖在節點中完成它。 –

回答

7

由於橢圓曲線閾值密碼系統具有添加密鑰的特性,爲什麼不這樣做呢?

我已經嘗試這種使用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()函數。 此時,sumpsum保存您的組合密鑰,但在使用它們簽署消息之前,您需要創建一個對象(橢圓模塊的一部分)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對象並使用它們的構造函數創建新對象。

在此之後,只是正常進行,如通過模塊的自述文件中提供的樣品中:

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

利用這一點,在第一代之後,你可以要求所需的兩個(或多個)公鑰驗證消息簽名。 如果將公鑰視爲「密碼」,則可以根據任何消息檢查簽名以驗證這兩個公鑰是否是原始公鑰。

此外,這應該與多個鍵一起使用,但它總是需要所有他們才能成功。