Я ищу способ генерации больших случайных чисел порядка 2 ^ 64 в C ... (100000000 - 999999999), для использования в алгоритме шифрования с открытым ключом (как p и q).
Я не хочу генерировать число меньше, чем 2 ^ 64 (т. Е. Меньше 100000000).
Есть ли что-нибудь, что могло бы помочь мне сделать это?
random () возвращает long, который на 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;
A
Вы могли бы объединить два 4-байтовых случайных целых числа для создания 8-байтового кода:
#include
...
uint64_t random =
(((uint64_t) rand() << 0) & 0x00000000FFFFFFFFull) |
(((uint64_t) rand() << 32) & 0xFFFFFFFF00000000ull);
Since rand
returns int
, and sizeof(int) >= 4
on almost any modern platform, this code should work. I've added the << 0
to make the intent more explicit.
The masking with 0x00000000FFFFFFFF
and 0xFFFFFFFF00000000
is to prevent overlapping of the bits in the two numbers in case sizeof(int) > 4
.
<Сильный> ИЗМЕНИТЬ
Поскольку @Banthar прокомментировал, что RAND_MAX
не обязательно 2 ^ 32
, и я думаю, что гарантировано будет не менее 2 ^ 16
, вы можете объедините четыре двухбайтовых номера, чтобы быть уверенным:
uint64_t random =
(((uint64_t) rand() << 0) & 0x000000000000FFFFull) |
(((uint64_t) rand() << 16) & 0x00000000FFFF0000ull) |
(((uint64_t) rand() << 32) & 0x0000FFFF00000000ull) |
(((uint64_t) rand() << 48) & 0xFFFF000000000000ull);
You're looking for a cryptographic-strength PRNG, like openssl/rand
: http://www.openssl.org/docs/crypto/rand.html
You can make a large number L
out of smaller numbers (e.g. A
& B
). For instance, with something like L = (2^ n)*A + B
where ^ denotes exponentiation and n
is some constant integer (e.g. 32). Then you code 1<
Таким образом, вы можете сделать большое случайное число меньших случайных чисел.
Я знаю, что, вероятно, я получу b____, добавленный OliCharlesworth, но использую rand () со шкалой и смещением. Это в stdlib.h Чтобы охватить весь диапазон, вы должны добавить это к другому меньшему rand (), чтобы заполнить пробелы в отображении.
Или вы можете использовать два генератора случайных чисел с семенами INDEPENDENT и объединить их выходные числа, как было предложено. Это зависит от того, хотите ли вы 64-битное число RNG с периодом в диапазоне 2 ^ 64. Просто не используйте вызов по умолчанию, который зависит от времени, потому что вы получите одинаковые семена для каждого генератора. Правильный путь, я просто не знаю ...