0

我想为我的应用程序使用确定性随机位生成器。我正在将 openssl 用于随机数生成器 api。目前我正在使用 RAND_pseuso_bytes() api 来生成伪随机数。我正在通过 RAND_add() 提供种子。然后,如果我两次调用 Random 生成器函数,我会在这两次调用中得到两个不同的随机值。如果种子相同,那么它应该给我相同的值,我哪里出错了?

我写的代码是

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 回答