节点中的椭圆曲线门限密码体制

我想在javascript中使用椭圆曲线密码学来实现类似于两人规则的东西。

编辑:我基本上在寻找比特币multisig的东西。

所以我需要结合两个公钥来得到一个组合密钥,它需要两个私钥生成一个签名。 请参阅https://crypto.stackexchange.com/questions/25250/adding-two-public-keys 。

我怎样才能做到这一点在节点?

由于椭圆曲线阈值密码系统具有添encryption钥的特性,为什么不这样做呢?

我已经尝试过使用node.js的elliptic模块 ,只需使用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保存你的组合键,但在使用它们签署消息之前,你需要创build一个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); 

正如你所看到的,要创build一个新的密钥对,我只需要创build新的密钥对,然后使用_importPrivate()_importPublic()函数加载组合的密钥。

我知道这有点不好意思,但是很有效。

更好的解决scheme是从模块中导出KeyPair对象,并用它们的构造函数创build新的对象。

之后,就像正常情况下进行,就像模块自述文件中提供的示例一样:

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

使用这种方法,在第一代之后,您可以要求validation消息签名所需的两个(或更多)公钥。 如果将公钥视为“密码”,则可以根据任何消息检查签名,以validation这两个公钥是否是原始公钥。

此外,这应该与多个键一起工作,但总是要求所有这些键成功。