2016-01-03 14 views
5

cryptographically secure浮動小数点をJavascriptで生成するにはどうすればよいですか?暗号で保護されたfloat

このプラグインはMath.randomのプラグインで、範囲は(0、1)ですが、暗号的に安全です。使用例

cryptoFloat.random(); 
0.8083966837153522 

Secure random numbers in javascript?は暗号化された安全なUint32Arrayを作成する方法を示しています。多分これは何とかフロートに変換することができますか?

+1

'window.crypto'をサポートするブラウザだけをサポートする必要がありますか? –

+1

@ T.J.Crowder:実際、私の使用例では、Firefoxで十分です。より一般的な、歓び。 –

+1

JavaScriptの浮動小数点数は、64ビットのIEEE-754の数字です(必要な場合は32ビットを得ることができます)。つまり、有効な2進数は53(有効)です。 。ほぼすべての暗号化目的には十分ではありません。 –

答えて

4

次のコードは非常に単純でfunctionally equivalent to the division methodなので、ここにはalternate method of altering the bitsがあります。 (このコードは、@ T.J。Crowderの非常に有益な答えからコピーされ、変更されています)。

// A buffer with just the right size to convert to Float64 
 
let buffer = new ArrayBuffer(8); 
 

 
// View it as an Int8Array and fill it with 8 random ints 
 
let ints = new Int8Array(buffer); 
 
window.crypto.getRandomValues(ints); 
 

 
// Set the sign (ints[7][7]) to 0 and the 
 
// exponent (ints[7][6]-[6][5]) to just the right size 
 
// (all ones except for the highest bit) 
 
ints[7] = 63; 
 
ints[6] |= 0xf0; 
 

 
// Now view it as a Float64Array, and read the one float from it 
 
let float = new DataView(buffer).getFloat64(0, true) - 1; 
 
document.body.innerHTML = "The number is " + float;

説明:

The format of a IEEE754 double 1符号ビット(ints[7][7])、11指数ビット(ints[7][6]ints[6][5]に)、残りは(値を保持する)仮数の通りです。計算するための式は1に係数を設定する

(-1)<sup>sign</sup> (1 + Σ<sub>i=1</sub><sup>52</sup> b<sub>52-i</sub> 2<sup>i</sup>) * 2<sup>e-1023</sup>

であり、指数が1023それは11ビットを有している、ことが必要で、従​​って最上位ビットは、これが0に設定する必要2048を与えます他のビットは1になります。

+0

Cool。異常なことは問題ではないと判断しましたか? –

+0

@ T.J.Crowder:これは最大ビット数を使用します。仮数部の各ビットが2で割ることを考えてみましょう:最初には1/2または0が追加され、2番目には1/4または0が追加され、3番目の1/8または0に追加されます。異常な数値の問題は、指数を含める場合にのみ発生します。 (そして、数値は明らかに対数的に離間している)。ありがとうございました。私はおそらくあなたの助けなしにそれを作っていないでしょう。 (以前はJS FloatArraysなどで働いていなかった) –

+1

歓迎してくれてうれしい。 subnormalsを再、今私はそれを数時間後に再び読んだ、私はそれが問題だとは思わない;あなたのメソッドは、数値が正確に表現できる数値の範囲に渡って値を均等に分配する必要があります。サブノーマルは、精度を損なうことで範囲を拡張します。私はあなたが無作為の視点から何かを失っているとは思わない。 –

関連する問題