2011-12-15 4 views
21

パブリックでテキストを暗号化するために2つのキー(プライベートとパブリック)を生成し、そのプライベートキーを使用してテキストを復号化する必要があります。Node.js暗号を使用して秘密/公開鍵ペアを作成する方法は?

モジュールCryptoで可能ですか?

ありがとうございました!

+0

ユーザーに秘密鍵を安全に与える方法がわかりません。彼らがローカルで鍵ペアを生成して公開鍵を与えた方が良いでしょう。 – Bruno

+1

@Brunoはい、問題はありません...私の目標は、Node.jsで鍵(プライベート、パブリック)のペアを作成する方法を理解することです。これは可能ですか? – Dail

答えて

0

私はそれを使用していないが、これは有用である可能性がある:

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

ドキュメントが厳しく、この上で(私は見つけることができる何の例)が欠如していません。

5

あなたがOpenSSLから望むものを得る方法を知っていれば、ノードのchild_processを使ってOpenSSLを実行するのが完全に合理的だと思います。

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

私の意見ではOSは非常に依存しています。 –

+0

BeOSで動作しない可能性があります – kgilpin

+5

私の存在しないamstradでは動作しません。 – airtonix

0

this rsa-json moduleを使用できます。それは単にopensslプロセスを生成するので、OSにかなり依存しています(Windowsではデフォルトでは機能しません)。

1

child_processルートはひどくスケーラビリティの高いソリューションです。離れてください。

私は代わりにkeypairと一緒に行きました。

乾杯

+1

'keypair'はOpenSSLよりもはるかに遅く、また同期していますが、OpenSSLルートは非同期です。 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

私はこれが好きですが、PEM形式の鍵ペアを暗号で取得する方法はありますか? –

14

次のコードは機能しますが、私はプロの暗号化技術者ではないので、ここでのコメントが役に立ちます。

暗号の代わりにursa RSAモジュールを使用しました。

類似のデータがAESなどのパスを使わずに直接暗号化されている場合、これを破るのは簡単ではないと私は懸念しています。それはすでにURSAのように見えるパディングを行い、いくつかのさらなる調査http://en.wikipedia.org/w/index.php?title=RSA_%28cryptosystem%29&section=12#Attacks_against_plain_RSA後...

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

をして下さいコメント。

+3

Chris:コード内のあなたのコメントは、privateで暗号化し、publicで復号化しますが、コードは逆のことを行います:publicで暗号化し、privateで復号化します。プライベートで暗号化しようとすると、pub.decrypt(enc)はpubの解読関数が定義されていないことを伝えます。何かご意見は。 Thx – HarleyDave

+0

ursaライブラリは少し放棄されているようです。 – Pablo

関連する問題