我正在尝试使用 Elliptic JS库生成可在两人之间使用的共享 key (来自他们的示例)。
问题是这个例子每次都会生成一个新的 key 对——我想让一个人使用他们自己的私钥,而另一个人使用公钥。
这是我目前所拥有的:
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 Hellman 协议(protocol)生成共享 key 。
在该协议(protocol)中,通常每次都使用临时(临时) key 对。这样每个 session 都有一个新的 session key ,这意味着前向保密不是基于一个单独的私钥。
另外请记住,派生的 ECDH secret 还不能用作对称 key 。它应该通过 HKDF( key 派生函数)传递,作为随机 secret !=适合密码学使用的统一 secret 。
如有任何问题,请在下方提问,很好地解释了为什么在 ECDH 中使用临时 key 很重要 here来自@Maarten。
如果不清楚,请告诉我。
关于javascript - 使用 Elliptic JS 库从公钥生成共享 key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58499606/