2015-08-21 3 views
3

Похоже, что использование простых C в unix-подобных системах, fread от /dev/urandom - это самый простой способ извлечения высококачественных случайных байтов. Мне нужно запустить симуляцию, которая требует около 10k 32-битных случайных чисел в секунду, и может работать несколько дней. Есть /dev/urandom хорошо использовать для этой цели? Каким образом качество случайных байтов здесь, когда пул энтропии исчерпан?Действительно ли `/ dev/urandom` подходит для целей моделирования?

edit_1

В то время как я в настоящее время работает 3 параллельных несгибаемых тестов для /dev/urandom в моем ноутбуке, я получил следующие интересные строки. Тест еще не завершен.

#=============================================================================# 
     test_name |ntup| tsamples |psamples| p-value |Assessment 
#=============================================================================# 
diehard_parking_lot| 0|  12000|  100|0.99573896| WEAK 
     diehard_sums| 0|  100|  100|0.00116464| WEAK 
      sts_serial| 7| 100000|  100|0.99996076| WEAK 
+2

Пожалуйста, не downvote без каких-либо объяснений, когда вы лично не нравится вопрос. – xiver77

+4

Пожалуйста, сушите проблему. Какое распределение вы хотите? Вы хотите повторять последовательности? Вам нужны криптографически безопасные случайные числа? '/ dev/urandom' может быть ОК для вашего приложения (это CSPRNG), если вы не хотите повторяемых последовательностей. –

+0

@MichaelFoukarakis Я сейчас под Linux, но хорошо знать, есть ли в какой-то другой системе некоторые проблемы. Это не должно быть криптографически безопасным, но я не хочу иметь такую ​​же случайную последовательность после цикла 4294967296, например. – xiver77

ответ

2

В основной реализации /dev/urandom является CSPRNG, выход пула, который имеет максимальный период less than 2^(26∗32) − 1, который затем подается в SHA-1, чтобы произвести выход для /dev/urandom , Таким образом, urandom может, очевидно, получить количество случайных чисел, которое вы хотите, однако оно не может предоставить вам воспроизводимые результаты - вам придется кэшировать последовательность, которую вы получаете.

Вам не нужно беспокоиться о том, что происходит, когда пул энтропии оценивается как истощенный, /dev/urandom выдаст все, что вы его запросите. «Теоретические атаки», о которых говорится в справочной странице urandom (4), - это nonexistent.(Далее «вопрос» огромное непонимание, что такое «оценка энтропии» есть)

Многие другие PRNGs с большими периодами существуют, которые воспроизводимы высева: Вихрь Мерсенна в C++, xorshift PRNGs и т.д. Вы должны быть в состоянии адаптировать любой PRNG для распределения, которое подходит для ваших целей.

0

Нет, вы не должны использовать /dev/urandom что интенсивно, по крайней мере, в соответствии с документацией [хотя, если вы читаете комментарии нить, вы увидите, аргумент о том, что документация вводит в заблуждение]:

Генератор случайных чисел ядра предназначен для получения небольшого количества высококачественного затравочного материала для посева криптографического генератора псевдослучайных чисел (CPRNG). Он предназначен для обеспечения безопасности, а не для скорости, и плохо подходит для создания большого количества случайных данных. Пользователи должны быть очень экономичными в количестве затравочного материала, который они читают из/dev/urandom (и/dev/random); ненужное чтение большого количества данных с этого устройства окажет негативное влияние на других пользователей устройства. (Источник: линукс man 4 random)

Ранние (предварительно 2,6) реализации Linux из /dev/urandom совместно пула энтропии между /dev/random и /dev/urandom, но в эти дни используются бассейны несколько независимых, и чтение из /dev/urandom не будет влиять на наличие /dev/random. Другие операционные системы используют разные стратегии. Например, во FreeBSD существует только одно случайное устройство, которое блокируется при запуске системы.

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

В любом случае, для моделирования monte carlo, где криптографическая случайность не требуется, вы должны быть в порядке с хорошим PRNG; для независимых испытаний вы должны выровнять PRNG с одного чтения /dev/urandom. (Посев из time(NULL) никогда не является хорошей идеей.)

+1

«это приведет к утечке энтропии вашей системы» - это подделка. Пожалуйста, не путайте людей. Такой проблемы нет. После посева 'urandom' все приложения могут читать эти устройства, не беспокоясь о чем-либо еще. –

+0

@MichaelFoukarakis. В защите rici заблуждение присутствует в официальной документации. И это не совсем заблуждение, это также защита от полной разбивки всех криптоалгоритмов. Но по-прежнему не стоит использовать '/ dev/random' для чего угодно, включая криптографические ключи. – Gilles

+0

@MichaelFoukarakis: Хорошо, справедливо. Я не смотрел на реализацию в течение длительного времени (даже десятилетия). Тем не менее, предупреждение о чрезмерном использовании остается частью документации Linux (теперь цитируется в ответе), поэтому я поддерживаю совет, если не завышенное объяснение. Спасибо, что натолкнуло меня на повторное исследование. (/ dev/random будет блокироваться, если будет использоваться, как проверено экспериментом на достаточно недавнем ядре linux.) – rici

1

Нет,/dev/random и/dev/urandom предназначены для криптографических приложений, где требуется высокая энтропия в обмен на скорость. Они работают очень медленно по сравнению с хорошим не-CS PRNG, и поэтому не дадут вам достаточного количества образцов для моделирования или интеграции в Монте-Карло.

Для этого используйте быстрый, но качественный PRNG, такой как XOR-shift + или Mersenne Twister. Вы можете засеять PRNG данными из/dev/urandom, если вам не нужна повторяемость.

+0

Скорость не проблема. Вопрос задает 40 КБ/с. На моем ноутбуке с 2013 года urandom выводит 4 МБ/с. –

0

Что касается «качества случайных байтов из [/dev/urandom], когда пул энтропии исчерпан», О'Нил (2014) указывает, что разработчики генераторов для криптографических целей «не имеют одинаковой озабоченности относительно статистических свойств (таких как однородность) по сравнению с генераторами случайных чисел общего назначения ».

Это может объяснить, почему вывод /dev/urandom не дает статистических тестов, хотя консенсус, по-видимому, заключается в том, что выход /dev/urandom хорош даже после истощения.

Если вы хотите совместить свойства /dev/urandom и стандартного генератора для целей моделирования, такого как Mersenne Twister, мое предложение было бы обойти оба потока данных. Подходы достаточно различны, что они не должны отменять друг друга.

Ref: http://www.pcg-random.org/paper.html

+0

Также следует отметить, что ядро ​​Linux объединяет байты из генератора случайных чисел аппаратного обеспечения в выход '/ dev/urandom' (и пул), если он присутствует. У более новых процессоров Intel есть один. Поэтому результаты испытаний могут сильно зависеть от тестовой машины. –

Смежные вопросы