Bra*_*don 3 javascript cryptography elliptic-curve cryptojs
我正在尝试使用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));
Run Code Online (Sandbox Code Playgroud)
任何想法都会非常有帮助!
所以也许最好稍微解释一下。
对于椭圆曲线加密,私钥只是一个数字(一个大数字)。
公钥实际上是曲线上的一个点(就像实际上的 x, y)。
必须先生成私钥才能获得对应的公钥坐标,众所周知,ECC中的陷门功能是建立在无法从公钥点推导出私钥的基础上的。
公钥是通过私钥与曲线上称为生成点的特殊点进行标量相乘而获得的。
所以......也就是说,从您知道的公钥开始的唯一方法是(在之前的某个时刻)生成并存储私钥,使用标准方法计算相应的公钥(其中仅供参考,实际上是一个标量将私钥数字乘以曲线上的已知生成器(特殊的公开已知的 x,y 点),然后存储公钥以供将来使用的过程。
最后一件事,您在这里所做的(您可能已经知道)是 ECDH(椭圆曲线 Diffie Hellman),使用 Diffie Hellman 协议生成共享密钥。
在该协议中,通常每次都使用临时(临时)密钥对。这样,每个会话都有一个新的会话密钥,这意味着前向保密不依赖于一个私钥。
另外请记住,派生的 ECDH 密钥还不能用作对称密钥。它应该通过 HKDF(密钥派生函数)传递,因为随机秘密!=适合加密使用的统一秘密。
如有任何问题,请在下面提出, @Maarten很好地解释了为什么在 ECDH 中使用临时密钥很重要。
如果不清楚,请告诉我。
| 归档时间: |
|
| 查看次数: |
1942 次 |
| 最近记录: |