Comment créer une paire de clés privées / publiques en utilisant le noeud.js crypto?

je dois générer deux clés (privée et publique) pour chiffrer un texte avec le public et laisser l'utilisateur avec la clé privée déchiffrer le texte.

est-ce possible avec le module Crypto?

24
demandé sur Luke McGregor 2011-12-15 17:39:08

6 réponses

Utilisez le module crypto de npm pour générer un jeu de touches.

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'));

ci-Dessus est un exemple. Pour savoir plus de documentation de caissehttp://nodejs.org/api/crypto.html

15
répondu Aks 2014-01-02 05:59:14

le code suivant fonctionne, mais je ne suis pas un cryptographe professionnel, donc quelques commentaires ici seraient utiles.

j'ai utilisé le module ursa RSA, au lieu de crypto.

je crains que si des données similaires étaient cryptées directement, sans passer par AES ou similaire, alors il pourrait être trivial de briser ceci. Les commentaires s'il vous plaît...

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);

Après une enquête http://en.wikipedia.org/w/index.php?title=RSA_%28cryptosystem%29§ion=12#Attacks_against_plain_RSA on dirait que ursa fait déjà du rembourrage.

14
répondu fadedbee 2017-11-03 14:35:02

si vous savez comment obtenir ce que vous voulez D'OpenSSL, je pense qu'il est tout à fait raisonnable de lancer OpenSSL en utilisant des Noeuds 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();  
});
8
répondu kgilpin 2012-01-12 17:08:53

je n'ai pas utilisé, mais cela peut être utile:

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

la Documentation fait cruellement défaut sur ce point (aucun exemple que je puisse trouver).

0
répondu Steve Campbell 2011-12-15 17:21:56

Vous pouvez utiliser ce module rsa-json. Il ne produit qu'un processus openssl, donc il est assez dépendant du système D'exploitation (il ne fonctionne pas par défaut sous windows).

0
répondu Guido 2013-03-10 20:17:56

la route child_process est une solution terrible et non évolutive imo. Rester à l'écart.

j'ai choisi d'aller avec paire de clés à la place.

0
répondu redditmerc 2018-05-29 02:26:14