如何生成大的随机数C.

时间:2011-10-27 18:53:16

标签: c random rsa

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

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

有什么能帮助我做到这一点吗?

6 个答案:

答案 0 :(得分:12)

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

#include <inttypes.h>

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 <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <inttypes.h>   

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;

A

答案 1 :(得分:9)

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

#include <stdint.h>
...
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);

答案 2 :(得分:7)

您正在寻找加密力量的PRNG,例如openssl/randhttp://www.openssl.org/docs/crypto/rand.html

答案 3 :(得分:3)

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

所以你可以随机抽取大量随机数。

答案 4 :(得分:3)

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

答案 5 :(得分:-1)

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