javascript - 使用 Elliptic JS 库从公钥生成共享 key

标签 javascript cryptography cryptojs elliptic-curve

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

相关文章:

javascript - jquery 的 stopPropagation 没有按预期工作

javascript - 如何从特定的字符串中获取特定的哈希值?

c++ - 是否有任何 C/C++ 哈希库(即 python hashlib 之类)

node.js - Stripe 验证 webhook 签名 HMAC sha254 HAPI.js

javascript - 如何统一从多个组单选按钮获取的文本?

javascript - 如何实现跨浏览器的 console.log 功能

javascript - Swiper.js 自动播放的自定义停止和播放按钮(React/Next)

c - 通过传递数组作为输入数据来实现 AES-128 CBC

mysql - 解密mysql中用CryptoJS加密的AES

javascript - 字节数组可以用作 CryptoJS.RC4.encrypt 的 key 吗?