如何生成大的随机数C.

我正在寻找一种在C …(100000000 – 999999999)中生成大约2 ^ 64的大随机数的方法,以用于公钥加密算法(如p和q)。

我不想生成小于2 ^ 64的数字(即小于100000000)。

有什么可以帮我做到这一点吗?

random()返回一个长度,在64位系统上应该是64位。 如果您使用的是32位系统,则可以执行以下操作:

#include  uint64_t num; /* add code to seed random number generator */ num = rand(); num = (num << 32) | rand(); // enforce limits of value between 100000000 and 999999999 num = (num % (999999999 - 100000000)) + 100000000; 

或者在NIX系统上,您可以将/ dev / random读入缓冲区:

 #include  #include  #include  #include  int fd; uint64_t num; if ((fd = open("/dev/random", O_RDONLY) == -1) { /* handle error */ }; read(fd, &num, 8); close(fd); // enforce limits of value between 100000000 and 999999999 num = (num % (999999999 - 100000000)) + 100000000; 

一个

你可以组合两个4字节的随机整数来产生一个8字节的整数:

 #include  ... uint64_t random = (((uint64_t) rand() << 0) & 0x00000000FFFFFFFFull) | (((uint64_t) rand() << 32) & 0xFFFFFFFF00000000ull); 

由于rand在几乎所有现代平台上都返回intsizeof(int) >= 4 ,因此该代码应该可以工作。 我添加了<< 0以使意图更明确。

使用0x00000000FFFFFFFF0xFFFFFFFF00000000屏蔽是为了防止sizeof(int) > 4两个数字中的位重叠。

编辑

由于@Banthar评论说RAND_MAX不一定是2 ^ 32 ,而且我认为它保证至少为2 ^ 16 ,你可以将四个2字节数组合起来以确保:

 uint64_t random = (((uint64_t) rand() << 0) & 0x000000000000FFFFull) | (((uint64_t) rand() << 16) & 0x00000000FFFF0000ull) | (((uint64_t) rand() << 32) & 0x0000FFFF00000000ull) | (((uint64_t) rand() << 48) & 0xFFFF000000000000ull); 

您正在寻找加密强度的PRNG,例如openssl/rand : http : //www.openssl.org/docs/crypto/rand.html

我知道我可能会被OliCharlesworth抨击,但是使用rand()来进行比例和偏移。 它位于stdlib.h中为了覆盖整个范围,您应该将其添加到另一个较小的rand()以填充映射中的间隙。

您可以用较小的数字(例如AB )制作大量的L 例如,类似于L = (2^ n)*A + B ,其中^表示取幂, n是某个常数整数(例如32)。 然后为2次幂运算编码1< (按位左移)。

因此,您可以生成大量随机数较小的随机数。

或者,您可以使用具有INDEPENDENT种子的两个随机数生成器,并按照建议将它们的输出数字放在一起。 这取决于您是否需要64位数的RNG,其周期在2 ^ 64范围内。 只是不要使用取决于时间的默认调用,因为您将为每个生成器获得相同的种子。 正确的方式,我只是不知道……