【问题标题】:Generate Shared Key From Public Key Using Elliptic JS Library使用 Elliptic JS 库从公钥生成共享密钥
【发布时间】:2019-10-22 08:01:03
【问题描述】:

我正在尝试使用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));

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

【问题讨论】:

  • 您不能只是在通话中切换按键。但是为什么需要这样做,您已经正确执行了操作,不是吗?

标签: javascript cryptography cryptojs elliptic-curve


【解决方案1】:

所以也许最好稍微解释一下。

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

公钥实际上是曲线上的一个点(实际上就像 x、y)。

您必须首先生成一个私钥才能获得对应的公钥坐标,如您所知,ECC中的陷门功能是基于能够从公钥点推导出私钥。

公钥是通过私钥与曲线上称为生成点的特殊点进行标量乘法获得的。

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

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

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

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

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

如果不清楚,请告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-28
    • 2022-07-26
    • 2023-03-22
    • 1970-01-01
    • 2011-04-22
    • 2020-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多