0

openssl乱数ジェネレーターAPIを使用して乱数ジェネレーターを作成していました。乱数ジェネレーターにシードを提供しています。RAND_seed()シードはopenSSLのAPIを使用してopensslに提供され、シードを提供した後、 Rand_bytes()apiを呼び出して乱数を取得しています。

しかし問題は、シードが同じであれば、Rand_bytes は同じ乱数を与えるはずですが、私の場合、同じ乱数を取得していません。この動作の理由は何ですか? 解決策は何ですか?コードを以下に示します

#define _64BIT_SIZE 8

int GenerateRandom_64(unsigned char * apcRandom_64)
{
    unsigned char cRandBytes_64[_64BIT_SIZE] = {0},
                  cSeed_64[_64BIT_SIZE]      = 
                                   {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};
    RAND_seed(cSeed_64, _64BIT_SIZE); /* seed  is cSeed_64 */
    if(!RAND_bytes(apcRandom_64, _64BIT_SIZE))
        printf("nOt seeded the random bit generator properly\n");
    return 0;
}
4

1 に答える 1

0

RAND_seed()RAND_add()entropy 引数がシード バッファ内のバイト数と同じ値を取る呼び出しと同じです。RAND_add()シード データをエントロピー プールに混合します。があるシステムでは/dev/urandom、エントロピー プールはそこから事前にシードされます。

したがって、RAND_bytes()を提供しないマシンで実行していない限り、 は常に予測不可能なシーケンスを生成します/dev/urandom

詳細については、RAND_add()man ページを参照してください。

于 2013-10-29T11:15:15.210 に答える