Как создать пару закрытых / открытых ключей с помощью криптографии Node.js. - PullRequest
33 голосов
/ 15 декабря 2011

Мне нужно сгенерировать два ключа (частный и открытый), чтобы зашифровать текст с помощью открытого ключа и позволить пользователю с помощью личного ключа расшифровать текст.

Возможно ли это с помощью модуля Crypto?

Ответы [ 7 ]

20 голосов
/ 02 января 2014

Используйте криптомодуль из npm для генерации KeyPair.

var crypto = require('crypto');

var prime_length = 60;
var diffHell = crypto.createDiffieHellman(prime_length);

diffHell.generateKeys('base64');
console.log("Public Key : " ,diffHell.getPublicKey('base64'));
console.log("Private Key : " ,diffHell.getPrivateKey('base64'));

console.log("Public Key : " ,diffHell.getPublicKey('hex'));
console.log("Private Key : " ,diffHell.getPrivateKey('hex'));

Выше приведен пример фрагмента.Узнать больше кассовой документации http://nodejs.org/api/crypto.html

20 голосов
/ 12 октября 2018

nodejs v10.12 теперь поддерживает это изначально с crypto.generateKeyPair

const { generateKeyPair } = require('crypto');
generateKeyPair('rsa', {
  modulusLength: 4096,
  publicKeyEncoding: {
    type: 'spki',
    format: 'pem'
  },
  privateKeyEncoding: {
    type: 'pkcs8',
    format: 'pem',
    cipher: 'aes-256-cbc',
    passphrase: 'top secret'
  }
}, (err, publicKey, privateKey) => {
  // Handle errors and use the generated key pair.
});
15 голосов
/ 21 января 2014

Следующий код работает, но я не профессиональный криптограф, поэтому некоторые комментарии здесь будут полезны.

Я использовал модуль RSA ursa вместо шифрования.

Я обеспокоен тем, что если подобные данные были зашифрованы напрямую, без пропуска AES или подобного, то это может быть тривиально, если это сломать. Комментарии пожалуйста ...

var ursa = require('ursa');
var fs = require('fs');

// create a pair of keys (a private key contains both keys...)
var keys = ursa.generatePrivateKey();
console.log('keys:', keys);

// reconstitute the private key from a base64 encoding
var privPem = keys.toPrivatePem('base64');
console.log('privPem:', privPem);

var priv = ursa.createPrivateKey(privPem, '', 'base64');

// make a public key, to be used for encryption
var pubPem = keys.toPublicPem('base64');
console.log('pubPem:', pubPem);

var pub = ursa.createPublicKey(pubPem, 'base64');

// encrypt, with the public key, then decrypt with the private
var data = new Buffer('hello world');
console.log('data:', data);

var enc = pub.encrypt(data);
console.log('enc:', enc);

var unenc = priv.decrypt(enc);
console.log('unenc:', unenc);

После некоторого дальнейшего исследования http://en.wikipedia.org/w/index.php?title=RSA_%28cryptosystem%29&section=12#Attacks_against_plain_RSA похоже, что Урса уже делает отступы.

8 голосов
/ 12 января 2012

Если вы знаете, как получить то, что вы хотите от OpenSSL, я думаю, что вполне разумно запустить OpenSSL, используя Node's child_process.

var cp = require('child_process')
  , assert = require('assert')
  ;

var privateKey, publicKey;
publicKey = '';
cp.exec('openssl genrsa 2048', function(err, stdout, stderr) {
  assert.ok(!err);
  privateKey = stdout;
  console.log(privateKey);
  makepub = cp.spawn('openssl', ['rsa', '-pubout']);
  makepub.on('exit', function(code) {
    assert.equal(code, 0); 
    console.log(publicKey);
  });
  makepub.stdout.on('data', function(data) {
    publicKey += data;
  });
  makepub.stdout.setEncoding('ascii');
  makepub.stdin.write(privateKey);
  makepub.stdin.end();  
});
0 голосов
/ 02 января 2014

маршрут child_process - ужасное и не масштабируемое решение imo.Держитесь подальше.

Я решил использовать вместо пару ключей .

0 голосов
/ 01 февраля 2013

Вы можете использовать этот модуль rsa-json .Он просто порождает процесс openssl, поэтому он довольно сильно зависит от ОС (он не работает по умолчанию в Windows).

0 голосов
/ 15 декабря 2011

Я не использовал его, но это может быть полезно:

http://ox.no/posts/diffie-hellman-support-in-node-js

По этому вопросу не хватает документации (нет примеров, которые я мог бы найти).

...