2011-12-15 18 views
21

Devo generare due chiavi (private e pubbliche) per crittografare un testo con il pubblico e lasciare che l'utente con la chiave privata decodifichi il testo.Come creare una coppia di chiavi private/pubbliche utilizzando la crittografia Node.js?

E 'possibile con il modulo Crypto?

Grazie!

+0

Non sono sicuro di come si possano fornire agli utenti le proprie chiavi private in modo sicuro. Sarei meglio se generassero le loro coppie di chiavi localmente e ti dessero le loro chiavi pubbliche. – Bruno

+1

@Bruno sì, nessun problema al riguardo ... il mio obiettivo è capire come creare una coppia di chiavi (privata, pubblica) con Node.js, è possibile? – Dail

risposta

5

Se sai come ottenere ciò che vuoi da OpenSSL, penso che sia perfettamente ragionevole eseguire OpenSSL usando il Node 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(); 
}); 
+3

Molto OS dipendente a mio parere. –

+0

Potrebbe non funzionare su BeOS – kgilpin

+5

sicuramente non funzionerà sul mio amstrad inesistente. – airtonix

0

È possibile utilizzare this rsa-json module. Crea appena un processo openssl, quindi è abbastanza dipendente dal sistema operativo (non funziona di default su Windows).

1

route_processo child è una soluzione terribile e non scalabile. Stai lontano.

Ho scelto di andare con keypair invece.

Acclamazioni

+1

'keypair' è molto più lento di OpenSSL ed è anche sincrono mentre la rotta OpenSSL è asincrona. Il percorso child_process è _more_ scalabile. –

12

Utilizzare il modulo di crittografia da NPM per generare coppia di chiavi.

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

Sopra è un esempio di snippet. Per saperne di più documentazione di checkout http://nodejs.org/api/crypto.html

+1

Questa risposta non riguardava la crittografia e la decrittografia. – fadedbee

+8

La domanda non ha richiesto la crittografia e la decrittografia. Richiedeva solo la generazione di coppie di chiavi. E la crittografia e la decrittografia sono spiegate molto bene nella documentazione. – Aks

+4

Mi piace, ma come ottenere una coppia di chiavi formattate PEM con cripto? –

14

Il seguente codice funziona, ma io non sono un crittografo professionista, quindi alcuni commenti qui sarebbero utili.

Ho usato il modulo RSA di ursa, invece di crypto.

Sono preoccupato del fatto che se dati simili fossero crittografati direttamente, senza un passaggio di AES o simili, potrebbe essere banale interromperlo. Commento Siete ...

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

Dopo alcune ulteriori indagini http://en.wikipedia.org/w/index.php?title=RSA_%28cryptosystem%29&section=12#Attacks_against_plain_RSA sembra Ursa già fa imbottitura.

+3

Chris: Il tuo commento nel codice dice crittografare con privato e decifrare con pubblico, ma il codice fa il contrario: crittografia con pubblico e decrittografia con privato. Quando provo a crittografare con private, pub.decrypt (enc) mi dice che la funzione di decrypt su pub non è definita! Qualche idea. Thx – HarleyDave

+0

La biblioteca di ursa sembra essere un po 'abbandonata. – Pablo

Problemi correlati