0

アプリケーションに決定論的ランダム ビット ジェネレーターを使用したいと考えています。私は乱数ジェネレーター API に openssl を使用しています。現在、疑似乱数を生成するために RAND_peuso_bytes() API を使用しています。そして、RAND_add() を通じてシードを与えています。次に、ランダム ジェネレーター関数を 2 回呼び出した場合、これら 2 回の呼び出しで 2 つの異なるランダム値を取得しています。シードが同じであれば、同じ値が得られるはずですが、どこが間違っていますか?

私が書いたコードは

int nSize = 8;    /* 64 bit random number is required */ 
int nEntropy = 5; /* 40 bit entropy required */
/* generate random nonce for making seed */
RAND_bytes(cSeed_64, nSize);
RAND_add(cSeed_64, nSize, nEntropy); /* random nonce is cSeed_64, seedin 64 bit with
                                      *  40 bit entropy */
/* calling random byte function to generate random number function 10 times with same seed*/
int j = 10;
while( j--)
{
    RAND_pseudo_bytes(cRandBytes_64, 8);
    printf("generated 64 bit random number \n");
    for(i = 0 ; i < nSize; i++)
        printf("%x ",cRandBytes_64[i]);
    printf("\n");
}
4

3 に答える 3

1

しかしRAND_psuedo_bytes()、同じシードで呼び出しているのではなく、連続して呼び出しを行っているため、異なる出力が生成されるはずです。これが「ジェネレーター」関数の要点です。内部状態に基づいて、呼び出しごとに異なる値を生成します。

乱数ジェネレーターを「シード」すると、内部状態が修正され、その後、その状態を進化させることで乱数が生成されます。シードごとに、繰り返し呼び出しから一意で再現可能な一連の番号が生成されますが、呼び出しごとに同じ番号が生成されることはありません。これは無意味です。

この線:

RAND_bytes(cSeed_64, nSize);

システム エントロピーに基づいてランダムな参照値を作成します。十分なエントロピーが利用できない場合は失敗する可能性があるため、ここでエラーを確認する必要があります。

この線

RAND_add(cSeed_64, nSize, nEntropy);

PRNG をシードしません。シードを既存の PRNG 状態に追加します。PRNG 状態を固定値に設定する場合は、 を使用する必要がありますRAND_seed()RAND_seed()指定された値で呼び出すと、RAND_pseudo_bytes()その後、指定された一連の乱数が生成されます。RAND_seed()同じ値で再度呼び出すと、同じシーケンスが繰り返されます。

于 2013-08-26T11:10:07.030 に答える
0

呼び出すたびにシードする必要があるかもしれません。そうしないと、呼び出すたびに乱数を返すことが期待されます。

于 2013-08-26T06:09:45.433 に答える
-1

あなたのコードで

RAND_bytes(cSeed_64, nSize);
RAND_add(cSeed_64, nSize, nEntropy);

を使用して乱数を生成していRAND_bytesます。この乱数をシードに追加しています。すでにランダムなものにランダム性を追加しているため、毎回乱数を生成する必要があります。したがって、シードはランダムであるため、毎回同じではありません。

シードを同じに保つにはRAND_seed、固定シードを使用して、予期される動作を取得してみてください。

于 2013-08-26T09:17:27.987 に答える