2011-12-15 18 views
21

Muszę wygenerować dwa klucze (prywatny i publiczny), aby zaszyfrować tekst z publicznym i pozwolić użytkownikowi z kluczem prywatnym odszyfrować tekst.Jak utworzyć parę kluczy prywatnych/publicznych za pomocą crypto Node.js?

Czy to możliwe z modułem Crypto?

Dziękujemy!

+0

Nie jestem pewien, w jaki sposób zamierzasz bezpiecznie udostępniać użytkownikom swoje prywatne klucze. Byłbym lepszy, gdyby generowali swoje pary kluczy lokalnie i dał ci klucze publiczne. – Bruno

+1

@Bruno tak, nie ma problemu ... moim celem jest zrozumienie, jak utworzyć parę kluczy (prywatnych, publicznych) za pomocą Node.js, czy to możliwe? – Dail

Odpowiedz

5

Jeśli wiesz, jak zdobyć to, co chcesz z OpenSSL, myślę, że całkowicie uzasadnione jest uruchamianie OpenSSL przy użyciu 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(); 
}); 
+3

Bardzo OS zależy od mojej opinii. –

+0

To może nie działać na BeOS – kgilpin

+5

zdecydowanie nie zadziała na mojej nieistniejącej amstradzie. – airtonix

0

Można użyć this rsa-json module. Po prostu uruchamia proces openssl, więc jest bardzo zależny od systemu operacyjnego (domyślnie nie działa w systemie Windows).

1

trasa child_process to straszne i nie skalowalne rozwiązanie imo. Nie zbliżaj się.

Zamiast tego wybrałem opcję keypair.

zdrowie

+1

'keypair' jest znacznie wolniejszy niż OpenSSL i jest również synchroniczny, podczas gdy trasa OpenSSL jest asynchroniczna. Trasa child_process jest _more_ skalowalna. –

12

pomocą modułu kryptograficznego z NPM do generowania pary kluczy.

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

Powyżej znajduje się przykładowy fragment. Aby dowiedzieć się więcej na temat dokumentacji kasowej: http://nodejs.org/api/crypto.html

+1

Ta odpowiedź nie obejmowała szyfrowania ani odszyfrowywania. – fadedbee

+8

Pytanie nie wymagało szyfrowania ani odszyfrowywania. Poprosił tylko o wygenerowanie pary kluczy. Szyfrowanie i odszyfrowywanie są bardzo dobrze wyjaśnione w dokumentacji. – Aks

+4

Podoba mi się to, ale jak zdobyć pary kluczy PEM z kryptografią? –

14

Poniższy kod działa, ale nie jestem zawodowym kryptografem, więc niektóre komentarze byłyby przydatne.

Użyłem modułu Ursa RSA, zamiast crypto.

Obawiam się, że jeśli podobne dane zostały bezpośrednio zaszyfrowane, bez przechodzenia przez AES lub podobne, może to być trywialne, aby je zepsuć. Komentarze proszę ...

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

Po pewnym dalszego dochodzenia http://en.wikipedia.org/w/index.php?title=RSA_%28cryptosystem%29&section=12#Attacks_against_plain_RSA wygląda jak Ursa już robi wyściółkę.

+3

Chris: Twój komentarz w kodzie mówi, że szyfrowanie jest prywatne i odszyfrowane publicznie, ale kod działa odwrotnie: szyfruje z publicznym i odszyfrowuje prywatnie. Kiedy próbuję szyfrować z prywatnym, pub.decrypt (enc) mówi mi, że funkcja odszyfrowywania w pubie jest niezdefiniowana! Jakieś pomysły. Thx – HarleyDave

+0

Biblioteka Ursa wydaje się być nieco opuszczona. – Pablo

Powiązane problemy