确定性随机数发生器给出相同种子的不同随机数

时间:2013-08-26 06:06:40

标签: c++ c random openssl

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

我写的代码是

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");
}

3 个答案:

答案 0 :(得分: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(),则会重复相同的序列。

答案 1 :(得分:0)

您可能希望每次调用它时播种它,否则每次调用它时都会返回一个随机数。

答案 2 :(得分:-1)

在您的代码中

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

您正在使用RAND_bytes生成随机数。您正在将此随机数添加到种子中。因为,你正在随机添加随机性,它应该每次都生成随机数。因此,种子每次都不一样,因为它是随机的。

要保持种子相同,请尝试使用固定种子RAND_seed来获得预期的行为。