使用 Elliptic JS 库从 Public 密钥生成共享密钥

Generate Shared Key From Public Key Using Elliptic JS Library

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

问题是该示例每次都会生成一个新的密钥对 - 我想让一个人使用他们自己的私钥,而其他人使用 public 密钥。

这是我目前的情况:

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

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

所以也许最好解释一下。

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

public 键实际上是曲线上的一个 (实际上就像 x, y)。

必须先生成私钥才能得到对应的public密钥坐标,大家可能知道,ECC中的陷门函数是基于 能够从 public 关键点推导出私钥。

public密钥是通过私钥与曲线上称为生成点的特殊点的标量相乘获得的。

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

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

在该协议中,通常每次都使用临时(临时)密钥对。这样每个会话都有一个新的会话密钥,这意味着前向保密不是基于一个单独的私钥。

另外请记住,派生的 ECDH 机密尚未准备好用作对称密钥。它应该通过 HKDF(密钥派生函数)传递,作为随机秘密!=适合密码使用的统一秘密。

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

如果不清楚,请告诉我。