Как генерировать действительно случайные числа (НЕ псевдо) в Linux - PullRequest
4 голосов
/ 31 октября 2010

Каков (лучший) способ создания безопасных случайных чисел в Linux (код C / C ++), более случайный, чем общие результаты rand (), а не псевдо-как OpenSSL BN_rand?

В WindowsЯ нашел CryptGenRandom() как хороший вариант.Есть ли какой-нибудь эквивалент в Linux?

Заранее спасибо.

Ответы [ 7 ]

16 голосов
/ 31 октября 2010

вы можете прочитать из /dev/random, который заполнен пулом энтропии. На сайте Википедии есть полезная информация: http://en.wikipedia.org/wiki//dev/random

5 голосов
/ 31 октября 2010

«Случайные» числа, генерируемые компьютером без каких-либо внешних данных, являются псевдослучайными.Это означает, что они генерируются с математической формулой.Эти алгоритмы надежны и должны подойти практически для всех целей.

Чтобы получить «истинное» случайное число, вам нужно вмешательство извне.Есть несколько решений, реализованных в различных программах (я помню несколько из них, которые использовали движения мыши или атмосферный шум).

Как только что отметил Мартиджин, в Linux и OSX также есть / dev / random.Он использует шум, собранный драйверами устройств.

Существует также веб-сервис, который я только что нашел: http://www.random.org/clients/http/

2 голосов
/ 31 октября 2010

1-е CryptGenRandom не является «действительно» случайным устройством, поскольку они достаточно случайны, чтобы быть криптографически безопасными.

Похожий в Linux (и большинстве unixes) читает из /dev/urandom.

Если вы хотите получить реальные случайные числа, вы можете прочитать /dev/random, но вас могут заблокировать, ожидая, пока система соберет их, если пул энтропии слишком мал.

1 голос
/ 19 ноября 2010

Я написал это ранее сегодня.Компилируется как в C, так и в C ++ с использованием GNU-компилятора в Linux.

#include "rands.h"
#include <sys/types.h> /* for open(2) */
#include <sys/stat.h> /* for open(2) */
#include <fcntl.h> /* for open(2) */
#include <unistd.h> /* for read(2), close(2) */

#define DEVURANDOM "/dev/urandom"

typedef uint8_t TYPE;

TYPE getRandU8()
{
    TYPE rnum = 0;
    int fd = open(DEVURANDOM, O_RDONLY);
    if (fd != -1)
    {
        (void) read(fd, (void *)&rnum, sizeof(TYPE));
        (void) close(fd);
    }
    return rnum;
}

Вы можете изменить TYPE на int8_t, uint16_t, int16_t, uint32_t, int32_t, uint64_t и int64_t по мере необходимости (и изменить имяфункционировать соответственно).Вы также можете использовать (подписанный / неподписанный) char, short, int, long, long long и т. Д. Файл rands.h (в том же каталоге) содержит только прототипы функций для связи.

1 голос
/ 31 октября 2010

Взгляните на boost :: random_device .

Edit: Он находится в пространстве имен boost::random, начиная с Boost 1.47: boost ::случайный :: random_device

0 голосов
/ 17 мая 2012

Вы можете использовать квантовые генераторы случайных чисел, такие как Quantis: http://www.idquantique.com/true-random-number-generator/products-overview.html

Использует квантово-механическую вероятность прохождения одиночного фотона или отражения от полупрозрачного зеркала и генерирования случайных битов до 4 Мбит /истинные случайные биты.

0 голосов
/ 01 ноября 2010

/ dev / urandom генерирует случайные числа на основе действий, которые вы выполняете (движение мыши, ввод текста и т. Д.!)

...