2011-12-15 14 views
21

मुझे जनता के साथ एक पाठ एन्क्रिप्ट करने के लिए दो कुंजी (निजी और सार्वजनिक) उत्पन्न करना है और उपयोगकर्ता को निजी कुंजी के साथ टेक्स्ट को डिक्रिप्ट करना है।Node.js crypto का उपयोग कर एक जोड़ी निजी/सार्वजनिक कुंजी कैसे बनाएं?

क्या यह मॉड्यूल क्रिप्टो के साथ संभव है?

धन्यवाद!

+0

मुझे यकीन नहीं है कि आप उपयोगकर्ताओं को अपनी निजी कुंजी सुरक्षित रूप से कैसे दे रहे हैं। मैं बेहतर होगा अगर उन्होंने स्थानीय रूप से अपने कुंजी जोड़े उत्पन्न किए और आपको अपनी सार्वजनिक कुंजी दी। – Bruno

+1

@ ब्रूनो हां, इसके बारे में कोई समस्या नहीं है ... मेरा लक्ष्य यह समझना है कि कैसे नोड.जेएस के साथ कुंजी (निजी, सार्वजनिक) की एक जोड़ी बनाना है, क्या यह संभव है? – Dail

उत्तर

0

मैं इसे इस्तेमाल नहीं किया है, लेकिन यह उपयोगी हो सकता है:

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

प्रलेखन गंभीर रूप से (कोई उदाहरण है कि मैं मिल सकता है) इस पर कमी है।

5

यदि आप जानते हैं कि ओपनएसएसएल से आप क्या चाहते हैं, तो मुझे लगता है कि ओपनएसएसएल को नोड के 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

मेरी राय में बहुत ओएस निर्भर है। –

+0

यह बीओएस – kgilpin

+5

पर काम नहीं कर सकता है निश्चित रूप से मेरे अस्तित्व में मौजूद एम्स्ट्राड पर काम नहीं करेगा। – airtonix

0

आप this rsa-json module का उपयोग कर सकते हैं। यह सिर्फ एक openssl प्रक्रिया पैदा करता है, इसलिए यह ओएस पर काफी निर्भर है (यह विंडोज़ पर डिफ़ॉल्ट रूप से काम नहीं करता है)।

1

child_process मार्ग एक भयानक और गैर-स्केलेबल समाधान आईएमओ है। दूर रहो।

मैंने इसके बजाय keypair के साथ जाने का फैसला किया।

चीयर्स

+1

'कीपैयर' ओपनएसएसएल की तुलना में बहुत धीमी है और यह भी तुल्यकालिक है जबकि ओपनएसएसएल मार्ग असीमित है। Child_process मार्ग _more_ स्केलेबल है। –

12

कुंजी युग्म को उत्पन्न NPM से क्रिप्टो मॉड्यूल का उपयोग करें।

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

+1

इस उत्तर में एन्क्रिप्टिंग और डिक्रिप्टिंग शामिल नहीं है। – fadedbee

+8

प्रश्न एन्क्रिप्शन और डिक्रिप्शन के लिए नहीं पूछा था। यह केवल कुंजी जोड़ी पीढ़ी के लिए कहा। और प्रलेखन में एन्क्रिप्शन और डिक्रिप्शन बहुत अच्छी तरह से समझाया गया है। – Aks

+4

मुझे यह पसंद है, लेकिन क्रिप्टो के साथ पीईएम प्रारूपित कुंजी जोड़े कैसे प्राप्त करें? –

14

निम्नलिखित कोड काम करता है, लेकिन मैं एक पेशेवर क्रिप्टोग्राफर नहीं हूं, इसलिए यहां कुछ टिप्पणियां उपयोगी होंगी।

मैंने क्रिप्टो के बजाय ursa आरएसए मॉड्यूल का उपयोग किया है।

मुझे चिंता है कि यदि समान डेटा एईएस या इसी तरह के पास बिना सीधे एन्क्रिप्ट किया गया था, तो यह तोड़ना मुश्किल हो सकता है। कृपया टिप्पणियां ...

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 यह पहले से ही उर्सा की तरह लग रहा गद्दी करता है के बाद।

+3

क्रिस: कोड में आपकी टिप्पणी निजी के साथ एन्क्रिप्ट करता है और जनता के साथ डिक्रिप्ट करता है, लेकिन कोड विपरीत करता है: सार्वजनिक और निजी के साथ डिक्रिप्ट के साथ एन्क्रिप्ट करता है। जब मैं निजी के साथ एन्क्रिप्ट करने का प्रयास करता हूं, pub.decrypt (enc) मुझे बताता है कि पब पर डिक्रिप्ट फ़ंक्शन अपरिभाषित है! कोई विचार। Thx – HarleyDave

+0

ursa लाइब्रेरी थोड़ा त्याग दिया प्रतीत होता है। – Pablo

संबंधित मुद्दे