我想为我的应用程序使用确定性随机位生成器。我正在使用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");
}
答案 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
来获得预期的行为。