de-vraag
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
 gfppaste
gfppaste
Вопрос

Как сгенерировать большие случайные числа C

Я ищу способ генерации больших случайных чисел порядка 2 ^ 64 в C ... (100000000 - 999999999), для использования в алгоритме шифрования с открытым ключом (как p и q).

Я не хочу генерировать число меньше, чем 2 ^ 64 (т. Е. Меньше 100000000).

Есть ли что-нибудь, что могло бы помочь мне сделать это?

9 2011-10-27T18:53:16+00:00 6
Peter Mortensen
Peter Mortensen
Редактировал вопрос 8-го марта 2015 в 10:08
Программирование
rsa
random
c
David M. Syzdek
27-го октября 2011 в 7:07
2011-10-27T19:07:17+00:00
Дополнительно
Источник
Редактировать
#56791718

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

12
0
Blagovest Buyukliev
27-го октября 2011 в 7:00
2011-10-27T19:00:51+00:00
Дополнительно
Источник
Редактировать
#56791716

Вы могли бы объединить два 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);
9
0
wkl
27-го октября 2011 в 6:57
2011-10-27T18:57:37+00:00
Дополнительно
Источник
Редактировать
#56791714

You're looking for a cryptographic-strength PRNG, like openssl/rand: http://www.openssl.org/docs/crypto/rand.html

7
0
Basile Starynkevitch
27-го октября 2011 в 6:57
2011-10-27T18:57:44+00:00
Дополнительно
Источник
Редактировать
#56791715

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< (bitwise left-shift) for the power-of 2 operation.

Таким образом, вы можете сделать большое случайное число меньших случайных чисел.

3
0
MartyTPS
27-го октября 2011 в 7:01
2011-10-27T19:01:11+00:00
Дополнительно
Источник
Редактировать
#56791717

Я знаю, что, вероятно, я получу b____, добавленный OliCharlesworth, но использую rand () со шкалой и смещением. Это в stdlib.h Чтобы охватить весь диапазон, вы должны добавить это к другому меньшему rand (), чтобы заполнить пробелы в отображении.

3
0
jwoods486
10-го августа 2015 в 9:34
2015-08-10T21:34:37+00:00
Дополнительно
Источник
Редактировать
#56791719

Или вы можете использовать два генератора случайных чисел с семенами INDEPENDENT и объединить их выходные числа, как было предложено. Это зависит от того, хотите ли вы 64-битное число RNG с периодом в диапазоне 2 ^ 64. Просто не используйте вызов по умолчанию, который зависит от времени, потому что вы получите одинаковые семена для каждого генератора. Правильный путь, я просто не знаю ...

1
0
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Roxana Elizabeth CASTILLO Avalos
Зарегистрирован 5 дней назад
2
Hideo Nakagawa
Зарегистрирован 5 дней назад
3
Sergiy Tytarenko
Зарегистрирован 1 неделю назад
4
shoxrux azadov
Зарегистрирован 1 неделю назад
5
Koreets Koreytsev
Зарегистрирован 1 неделю назад
© de-vraag 2022
Источник
stackoverflow.com
под лицензией cc by-sa 3.0 с атрибуцией