2

Diffie-Hellman 鍵交換を実装しようとしています。メモリの制限により、JavaScript が小数形式で処理できない大きな数値を扱っています。

g^a mod p = A変数の長さが 512 ~ 1536 ビットの操作を実行したいと考えています。

メモリの制限により、そのような方程式を解く方法がわかりません。変数を小数に変換してから解くことができません。

16 進数で数学演算を実行するために使用される JavaScript ライブラリを見つけようとしましたが、見つけることができませんでした

注: SSL を使用するので、JavaScript コード インジェクションについて心配する必要はありません。

4

2 に答える 2

1

まず第一に、 を計算するときg^a mod p、最初に指数を計算してから を実行するのではありませんmod。代わりに、各ステップでモジュロを取るので、 より大きい数を扱う必要はありませんp^2

指数を計算するには、おそらく 2 乗アルゴリズムによるべき乗を使用する必要があります。2 乗のたびと乗算のたびにモジュロを取ることを忘れないでください。

参照: http://en.wikipedia.org/wiki/Exponentiation_by_squaring (そこの基本的な方法を見てください)。

しかし、実際には、優れた JavaScript bignum ライブラリであれば、これを行う必要があります。

また、質問する必要がある場合は、暗号化機能を自分で実装する能力がありません. 暗号は難しい。(例えば、私が上で説明した方法はサイドチャネル攻撃のタイミングを持っているので、おもちゃ以上のものには適していません)。他の誰かがすでに大変な作業を行っているライブラリを見つけて、それを正しく使用する方法を学びましょう。

于 2013-10-17T13:45:42.723 に答える
1

私はそれを行うことができました。

1) bigInt ライブラリをダウンロードします。私はこれを使用しました: http://www.leemon.com/crypto/BigInt.html

2) 大きな数値を生成するか、既存の数値を bigInt オブジェクトに変換するために使用します。

We need to calculate: g^a mod p = A

これは、次の JavaScript コードに変換できます。

var a = randBigInt(1536);                            // Generate (a)
var p = str2bigInt(my_prime_as_string, 16);          // convert p into a bigInt
var g = str2bigInt(my_primitive_root_as_string, 16); // convert q into a bigInt

var y   = powMod(g,Y, p);    // Calculate the common secret key.
于 2013-10-22T13:58:53.023 に答える