2012-06-22 14 views
11

私の知る限り、RSAキーは通常(強力な)ランダムジェネレータに基づいて生成されます。パスワードに基づいて、javascriptでRSAキーペアを生成

代わりに、パスワードに基づいて作成したいと考えています。たとえば、SHA512(SHA512(パスワード+塩)+パスワード+唐辛子)

のためにこれはJavaScriptで、クライアント側を実行する必要が

そのハッシュに

というか、。

誰でもこれを行う方法を知っていますか?与えられた入力に基づいて、決定論的にRSAキーペアを作成する簡単なJavaScriptライブラリはありますか?

(実は、私はRSAに言及していますが、任意の安全な非対称暗号化が十分であろう、私はちょうど官民の暗号化を必要とする)


追加:私はいくつかの安全な通信ソリューションを構築していますので、私は、これを必要とします接続に依存する必要はなく、サーバーを安全にすることさえ必要としません。

ランダムキーを使用してすべてのコンテンツをAESで暗号化しています。これらのキーはRSAで暗号化されています。アイデアは、アリスがボブの公開鍵で(つまりボブの公開鍵をオンラインで保存する必要がある)自分のコンテンツ(または実際には自分のコンテンツのAES鍵)をRSAで暗号化できるという考えです。

その後、Bobがパスワードを再入力すると、ブラウザはRSAプライベート&公開鍵を確定的に計算し、Aliceからコンテンツをダウンロードし、秘密鍵を使用してローカルで復号化することができます。

+0

JavaScriptを使用してRSAキーを作成しますか?私はそれを自分で試して覚えているそれはすべての私の記憶を食べて、計算するために永遠に取った。私はJavaに切り替えました。 – Amberlamps

+0

RSA以外の非対称暗号化方式でも問題ありません。しかし、鍵のクライアント側を生成し、それを送信する前に秘密鍵でデータを暗号化する必要があります。公開鍵はサーバー側に格納されます。ECCのアプローチがもっと速いのかどうか分かりませんか? –

+1

@SheldonPinkmanの暗号化は、プライベートではなく、公開鍵を使用して行われます。間違いなくあなたのアイデアには欠陥があります。 –

答えて

2

RSA鍵は、ほとんどの対称アルゴリズムと同様に単なるランダムビットではなく、大きな素数から導かれた指数およびモジュラスです。したがって、私はあなたがパスワードからそれらを生成することができる合理的な方法はありません。 this wikipedia articleを参照してください。

これらのキーペアは何に使用していますか?なぜ彼らはパスワードから派生しなければならないのですか?パスワードを使用して何かを暗号化する場合は、SHA256(パスワード)を使用してAES256キーを取得できます。 (これを行う場合はkey strengtheningを必ず読んでください)。

+0

パスワードでランダム化機能を初期化し、このようにパスワードに "依存する"キーを得ることができます。しかし、通常これを行うための実用的な理由はありません(私はそれが合理的である場合、私はある事を知っています:)。 –

+1

さて、RNGの欠如が良い理由だと思います。しかし、私はこの全体のスキームに深刻な設計上の欠陥があると感じています。 –

+2

@Petey:私はRSA鍵がランダムなビットではないことを知っていますが、ランダムなジェネレータ(既存のRSA鍵ジェネレータで発生する場合はどこでも)をパスワードから派生したものに置き換えることができます。これは、単にパスワードのハッシュでシードされるランダムジェネレータであってもよい。そうすれば、同じパスワードを使用すると、まったく同じRSAキーになります。 –

9

Crypticoは、RNGのシードとしてパスワードを入力するときに役立ちます。

+0

素晴らしいです、完璧に見えます! –

+0

リンクが機能していません。 – Akam

+0

@akam link updated、ありがとうございます。 –

2

私はpunctuationbutにコメントが、JavaScriptのために彼が言ったこと+ Eugene_Mayevski_'EldoS

純粋に追加することはできません。nodejsためhttps://www.npmjs.com/package/cryptico

https://www.npmjs.com/package/cryptico次のものが必要です。

npm install cryptico 

そして、この行を追加してください:

var cryptico = require("cryptico"); 

オブジェクトを作成する:

function cryptoObj(passPhrase) 
{ 
    this.bits = 1024; //2048; 
    this.passPhrase = passPhrase; 
    this.rsaKey = cryptico.generateRSAKey(this.passPhrase,this.bits); 
    this.rsaPublicKey = cryptico.publicKeyString(this.rsaKey); 

    this.encrypt = function(message){ 
    var result = cryptico.encrypt(message,this.rsaPublicKey); 
    return result.cipher; 
    }; 

    this.decrypt = function(message){ 
    var result = cryptico.decrypt(message, this.rsaKey); 
    return result.plaintext; 
    }; 
} 

console.log('---------------------------------------------------------'); 
var localEncryptor = new cryptoObj("XXyour secret txt or number hereXX"); 

var encryptedMessage = localEncryptor.encrypt('new message or json code here'); 
var decryptedMessage = localEncryptor.decrypt(encryptedMessage); 

console.log(''); 
console.log('>>> Encrypted Message: '+encryptedMessage); 
console.log(''); 
console.log('>>> Decrypted Message: '+decryptedMessage); 
+0

私はvar cryptico = require( "cryptico")を使用します。 (SystemJS)XHRエラー(404 Not Found)がロードされ、http:// localhost:5555/node_modules/crypto.jsというエラーが発生しました。 – Khushi

関連する問題