我想實現類似於使用橢圓曲線密碼學的two-man rule。節點中的橢圓曲線門限密碼學
編輯:我基本上在尋找類似比特幣multisig的東西。
所以我需要結合兩個公鑰來得到一個組合密鑰,它需要兩個私鑰才能生成一個簽名。請參閱https://crypto.stackexchange.com/questions/25250/adding-two-public-keys。
如何在節點中做到這一點?
我想實現類似於使用橢圓曲線密碼學的two-man rule。節點中的橢圓曲線門限密碼學
編輯:我基本上在尋找類似比特幣multisig的東西。
所以我需要結合兩個公鑰來得到一個組合密鑰,它需要兩個私鑰才能生成一個簽名。請參閱https://crypto.stackexchange.com/questions/25250/adding-two-public-keys。
如何在節點中做到這一點?
由於橢圓曲線閾值密碼系統具有添加密鑰的特性,爲什麼不這樣做呢?
我已經嘗試這種使用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對象並使用它們的構造函數創建新對象。
在此之後,只是正常進行,如通過模塊的自述文件中提供的樣品中:
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));
利用這一點,在第一代之後,你可以要求所需的兩個(或多個)公鑰驗證消息簽名。 如果將公鑰視爲「密碼」,則可以根據任何消息檢查簽名以驗證這兩個公鑰是否是原始公鑰。
此外,這應該與多個鍵一起使用,但它總是需要所有他們才能成功。
這樣的事情:https://github.com/wanderer/secp256k1-node但完全在沒有C的JS? –
你想在瀏覽器或節點上做它嗎? – Breedly
試圖在節點中完成它。 –