Сгенерируйте общий секретный ключ из пар асимметричных ключей Curve25519 (или X25519) в node.js с помощью модуля шифрования
Я пытаюсь создать общий секретный ключ между парами асимметричных ключей Curve25519 (или X25519), используя алгоритмы обмена ключами, подобные обмену ключами Диффи Хеллмана. Обмен ключами Диффи Хеллмана может быть выполнен в node.js с использованием модуля шифрования в следующем коде:
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 в ключи Диффи Хеллмана, используя следующий код:
...
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
Есть ли способ сгенерировать общий секрет? Заранее спасибо.
1 ответ
К сожалению, документация для этого вспомогательного 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'));
Отсутствует аутентификация и, следовательно, небезопасно без добавления этой части.