web-dev-qa-db-fra.com

Comment créer une paire de clés privées / publiques à l'aide de la cryptographie Node.js?

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

Est-ce possible avec le module Crypto?

34
Dail

nodejs v10.12 prend désormais cela en charge de manière native avec 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.
});
22
Nelson Owalo

Utilisez le module de chiffrement de npm pour générer 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'));

Ci-dessus, un exemple d'extrait. Pour en savoir plus sur la documentation de paiement http://nodejs.org/api/crypto.html

20
Aks

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

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

Je crains que si des données similaires étaient cryptées directement, sans passe AES ou similaire, il pourrait être trivial de casser cela. 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 plus approfondie http://en.wikipedia.org/w/index.php?title=RSA_%28cryptosystem%29&section=12#Attacks_against_plain_RSA on dirait que l'ursa fait déjà du remplissage.

15
fadedbee

Si vous savez comment obtenir ce que vous voulez d'OpenSSL, je pense qu'il est parfaitement raisonnable d'exécuter OpenSSL en utilisant 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
kgilpin

Vous pouvez utiliser ce module rsa-json . Il génère simplement un processus openssl, il dépend donc assez du système d'exploitation (il ne fonctionne pas par défaut sur Windows).

0
Guido

Je ne l'ai pas utilisé, mais cela peut être utile:

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

La documentation fait gravement défaut à ce sujet (aucun exemple que j'ai pu trouver).

0
Steve Campbell

la route child_process est une imo terrible et non évolutive. Reste loin.

J'ai choisi d'aller avec keypair à la place.

0
redditmerc