使用椭圆JS库从公钥生成共享密钥



我正试图使用Elliptic JS库生成一个可以在两个人之间使用的共享密钥(来自他们的示例(。

问题是,该示例每次都会生成一个新的密钥对——我希望一个人使用自己的私钥,另一个人使用公钥。

以下是我目前所拥有的:

var EC = require('elliptic').ec;
var ec = new EC('curve25519');
var key1 = ec.keyFromPrivate('BLAHBLAHBLAH1');
var publicKey1 = key1.getPublic();
///// HOW DO I START WITH KEY2 BEING THE PUBLIC KEY, NOT KEYFROMPRIVATE? /////
var key2 = ec.keyFromPrivate('BLAHBLAHBLAH2');
var publicKey2 = key2.getPublic();
var shared1 = key1.derive(publicKey2);
var shared2 = key2.derive(publicKey1);
console.log(shared1.toString(16));
console.log(shared2.toString(16));

任何想法都会非常有帮助!

所以也许最好对此进行一点解释。

使用椭圆曲线加密,私钥只是一个数字(一个大数字(。

公钥实际上是曲线上的一个(实际上像x,y(。

您必须首先生成私钥才能获得相应的公钥坐标,正如您所知,ECC中的活板门功能是基于而不是能够从公钥点推导私钥。

公钥是通过私钥与曲线上一个称为生成器点的特殊点的标量相乘而获得的。

所以。。。也就是说,从你知道的公钥开始的唯一方法是(在之前的某个时刻(生成并存储私钥,使用标准方法计算相应的公钥(仅供参考,实际上是一个标量将私钥数乘以曲线上已知的生成器(特殊的公知x,y点(的过程,然后存储公钥以备将来使用。

最后一件事,你在这里所做的(你可能已经知道了(是ECDH(椭圆曲线Diffie-Hellman(,使用Diffie-Hell man协议生成共享秘密。

在该协议中,通常每次都使用短暂(临时(密钥对。这样,每个会话都有一个新的会话密钥,这意味着前向保密性不取决于一个私钥。

此外,请记住,派生的ECDH密钥还没有准备好用作对称密钥。它应该通过HKDF(密钥推导函数(传递,作为随机秘密!=适用于加密用途的统一秘密。

任何问题请在下面提问,很好地解释了为什么在ECDH中使用来自@Maarten的临时密钥很重要。

如果不清楚,请告诉我。

最新更新