在node.js中使用crypto模块从Curve25519(或X25519)非对称密钥对中生成共享秘钥。

问题描述 投票:1回答:1

我正试图在以下几个人之间创建一个共享秘钥 曲线25519(或X25519)非对称密钥。 对使用密钥交换算法,就像 Diffie Hellman 钥匙交换. Diffie Hellman 可以在node.js中使用crypto模块进行密钥交换,具体方法如下 编码:

const crypto = require('crypto');

// Generate Alice's keys...
const alice = crypto.createDiffieHellman(2048);
const aliceKey = alice.generateKeys(); // Returns public key

// Generate Bob's keys...
const bob = crypto.createDiffieHellman(alice.getPrime(), alice.getGenerator());
const bobKey = bob.generateKeys(); // Returns public key

// Exchange and generate the secret...
const aliceSecret = alice.computeSecret(bobKey);
const bobSecret = bob.computeSecret(aliceKey);

// Should be equal
console.log(aliceSecret === bobSecret)

X25519 非对称钥匙 可以使用以下方法生成 编码:

const crypto = require('crypto');
const { publicKey, privateKey } = crypto.generateKeyPairSync('x25519', {
  publicKeyEncoding: {
    type: 'spki',
    format: 'pem'
  },
  privateKeyEncoding: {
    type: 'pkcs8',
    format: 'pem',
  }
});

钥匙的生成没有任何问题,但我不知道如何生成一个共享的秘钥.我试着将X25519钥匙转换为 Diffie Hellman 使用下面的代码进行密钥交换。

...
const dhKey= crypto.createDiffieHellman(2048);
// privateKey => Generated in the above code
dhKey.setPrivateKey(privateKey)
// publicKey => Generated in the above code
dhKey.setPublicKey(publicKey)
...

当使用上面的代码时,当生成两个dhKey并进行密钥交换时,它给出了以下错误。

Error: Supplied key is too large

有什么方法可以生成共享密匙吗? 先谢谢你。

node.js encryption cryptography diffie-hellman curve-25519
1个回答
2
投票

不幸的是,这个子API的文档有点薄。我拼凑了一个例子,但如果没有更好的文档,我不确定它是否有用。

const crypto = require('crypto');

const aliceKeyPair = crypto.generateKeyPairSync('x25519');

const alicePubExport = aliceKeyPair.publicKey.export(
    {type: 'spki', format: 'pem'}
    );

const bobKeyPair = crypto.generateKeyPairSync('x25519');

const bobPubExport = bobKeyPair.publicKey.export(
    {type: 'spki', format: 'pem'}
    );

const bobKeyAgree = crypto.diffieHellman({
    publicKey : crypto.createPublicKey(alicePubExport),
    privateKey: bobKeyPair.privateKey
});

const aliceKeyAgree = crypto.diffieHellman({
    publicKey : crypto.createPublicKey(bobPubExport),
    privateKey: aliceKeyPair.privateKey
});

console.log(bobKeyAgree.toString('hex'));
console.log(aliceKeyAgree.toString('hex'));

这缺少了身份验证,因此如果不加入这一块,就不安全。

© www.soinside.com 2019 - 2024. All rights reserved.