Генератор случайных чисел для linux

Содержание
  1. 9.6. $RANDOM: генерация псевдослучайных целых чисел
  2. Генерация случайных чисел в Linux и Windows
  3. Re: Генерация случайных чисел в Linux и Windows
  4. Re: Генерация случайных чисел в Linux и Windows
  5. Re: Генерация случайных чисел в Linux и Windows
  6. Re: Генерация случайных чисел в Linux и Windows
  7. Случайные числа в Linux(RNG) или как «наполнить» /dev/random и /dev/urandom
  8. Как заполнить пул энтропии?
  9. Если нет аппаратной поддержки
  10. Havegd
  11. Тестирование
  12. rngd с /dev/urandom в качестве источника энтропии
  13. haveged
  14. Виртуальные машины
  15. Как сгенерировать случайное число в Bash?
  16. Сгенерировать случайное число в bash
  17. Использование случайного генератора:
  18. Генерация случайных чисел с использованием переменной $RANDOM:
  19. A. Генерация случайных чисел с терминала
  20. Б. Генерация случайных чисел с помощью скрипта
  21. Генерация случайных чисел с помощью команды shuf:
  22. A. Генерация случайных чисел с терминала
  23. Б. Генерация случайных чисел с помощью скрипта
  24. Генерация случайных чисел с помощью /dev/urandom:
  25. Заключение:

9.6. $RANDOM: генерация псевдослучайных целых чисел

$RANDOM — внутренняя функция Bash (не константа), которая возвращает псевдослучайные целые числа в диапазоне 0 — 32767. Функция $RANDOM не должна использоваться для генераци ключей шифрования.

Пример 9-23. Генерация случайных чисел

Пример 9-24. Выбор случайной карты из колоды

Jipe подсказал еще один способ генерации случайных чисел из заданного диапазона.

Насколько случайны числа, возвращаемые функцией $RANDOM? Лучший способ оценить «случайность» генерируемых чисел — это написать сценарий, который будет имитировать бросание игрального кубика достаточно большое число раз, а затем выведет количество выпадений каждой из граней.

Пример 9-25. Имитация бросания кубика с помощью RANDOM

Как видно из последнего примера, неплохо было бы производить переустановку начального числа генератора случайных чисел RANDOM перед тем, как начать работу с ним. Если используется одно и то же начальное число, то генератор RANDOM будет выдавать одну и ту же последовательность чисел. (Это совпадает с поведением функции random() в языке C.)

Пример 9-26. Переустановка RANDOM

Системный генератор /dev/urandom дает последовательность псевдослучайных чисел с более равномерным распределением, чем $RANDOM. Команда dd if=/dev/urandom of=targetfile bs=1 count=XX создает файл, содержащий последовательность псевдослучайных чисел. Однако, эти числа требуют дополнительной обработки, например с помощью команды od (этот прием используется в примере выше) или dd (см. Пример 12-42).

Есть и другие способы генерации псевдослучайных последовательностей в сценариях. Awk имеет для этого достаточно удобные средства.

Пример 9-27. Получение псевдослучайных чисел с помощью awk

Источник

Генерация случайных чисел в Linux и Windows

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

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

Собственно, кто-нибудь знает точно в чём причина такого поведения?

Re: Генерация случайных чисел в Linux и Windows

А вы там, часом /dev/random читаете? Тогда попробуйте /dev/urandom, если, конечно, важна именно скорость.

Re: Генерация случайных чисел в Linux и Windows

$ cat /dev/urandom |pipebench >/dev/null Summary: Piped 41.51 MB in 00h00m22.82s: 1.81 MB/second

мне не кажется что это медленно

/dev/random конечно медленнее, но оттуда имеет смысл брать только один из seed для генерации ключей и прочего. А на тривиальную генерацию хватает urandom

Re: Генерация случайных чисел в Linux и Windows

> Заметил, что в линуксе сей процесс происходит намного медленне, чем в винде

Что вообще подразумевается под «генератором случайных чисел ОСи»? «генератора случайных чисел независимо от языка программирования»? Какие конкретно генераторы сравнивались? И каким образом происходило сравнение? А-то заявление выглядит бредово. Код в студию.

Re: Генерация случайных чисел в Linux и Windows

Да я понимаю, что первое сообщение немного странное получилось. 🙂 Просто дело в том, что несколько раз приходилось писать небольшие программки, в которых производительность очень сильно зависила от генерации случайных чисел. В итоге получалось, что под виртуальной машиной с виндой они работали примерно в 2 раза быстрее, чем на основной системе с линуксом. Опытным путём установил, что всё дело в собственно генерации. Подобное наблюдалось со стандартным C’шным rand(), с Qt’шным потоко-безопасным qrand() и с D’шным собственным движком. Стало любопытно, в чём же дело. 🙂

Конкретный код пока, к сожалению, привести не могу, ибо там будет очень много мусора, не касающегося темы. Сейчас как раз пытаюсь создать минимально-воспроизводимый пример.

Источник

Случайные числа в Linux(RNG) или как «наполнить» /dev/random и /dev/urandom

Пожалуй всем пользователям Linux известны такие файлы псевдо-устройств как /dev/random и /dev/urandom. Эти устройства являются интерфейсом к генератору случайных чисел ядра(RNG, random number generator).

Случайные числа(они же — непредсказуемый набор битов) очень важны в криптографии. Они являются базовыми кирпичиками для криптографических протоколов. От качества (неповторимости, непредсказуемости) этих чисел зависит стойкость всевозможных TLS-сертификатов, SSH и GPG ключей, сессионных симметричных TLS-ключей и т.д. Так же случайные числа являются основой для генерации UUID’ов, PID’ов, TCP sequence numbers и многого другого.

RNG генерит случайные числа на основе данных из пула энтропии(entropy pool) в ядре Linux. Наполнением этого пула так же занимается RNG и делается это на основе случайных событий в системе таких как: тайминги клавиатуры и дисков, движения мыши, прерывания(interrupts), сетевой трафик.

Пул энтропии имеет фиксированный объем 4096 bits:

Размер пула нельзя изменить, это захардкожено в ядре.

Посмотреть текущий объем данных в пуле:

Доступный объем энтропии постоянно меняется, в зависимости от скорости пополнения и потребления соответственно.

Собственно через /dev/random и /dev/urandom приложения в user space получают эти самые случайные числаданные.

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

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

Настоятельно рекомендуется для любых долго-живущих ключей, например для TLS-сертификатов использовать /dev/random т.к. только он гарантирует качество случайных чисел. Но, большинство приложений таких как Apache, Nginx, sshd и о Боже ssh-keygen, openssl используют /dev/urandom. Тут в принципе понятно Apache, Nginx, sshd не хотят блокироваться при генерации сессионных ключей. Но то, что ssh-keygen и openssl используют по умолчанию /dev/urandom меня поразило. Причем для openssl можно задать устройство при генерации ключей(ниже пример) а вот для ssh-keygen я возможности переопределить поведение не нашел.

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

Прежде чем начать “майнить” энтропию, пара слов о ее корректном использовании из man /dev/random:

The amount of seed material required to generate a cryptographic key equals the effective key size of the key. For example, a 3072-bit RSA or Diffie-Hellman private key has an effective key size of 128 bits (it requires about 2^128 operations to break) so a key generator only needs 128 bits (16 bytes) of seed material from /dev/random.

Например openssl для генерации RSA ключа длиной 10240 bit использует всего 2048 исходного материала из /dev/random:

Как заполнить пул энтропии?

Лучшее решение это использование специальных аппаратных средств(TPM, Trusted Platform Module) или инструкций процессора типа RDRAND(есть в Intel IvyBridge и Haswell процессорах).

Проверить наличие подобных устройств на сервере поможет утилита rngd из пакета rng-tools

Если rngd обнаружит поддерживаемые средства то вам повезло и вы можете запустить сервис rngd. В моем случае их нет)

Собственно задача rngd читать энтропию из аппаратных средств и наполнять ей пул энтропии ядра. Делается это через специальный ioctl вызов(RNDADDENTROPY) интерфейса /dev/random.

Если нет аппаратной поддержки

В интернете можно встретить рекомендации, где предлагают указывать /dev/urandom как источник энтропии для rngd. То есть источником энтропии для ядра по сути будет само ядро). Это довольно сомнительная идея, и я бы не стал так делать и вам не советую. Но ради эксперимента я провел тесты и результаты(которые ниже) тоже довольно не плохие.

Havegd

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

На практике, это user space демон который как и rngd наполняет пул энтропии ядра через ioctl интерфейс /dev/random. при этом не нуждается в источнике энтропии как rngd.

Для centos пакет доступен из epel.

После установки нужно просто запустить сервис. С параметрами по умолчанию haveged будет стараться держать пул энтропии ядра на уровне не ниже 1024.

Тестирование

Без rngd и haveged, команда(ниже будет понятно, что она делает):

Не завершилась за сутки!

rngd с /dev/urandom в качестве источника энтропии

(то, что я вам не рекомендовал)

Тест(худший из 3-х результат):

Тут нужно смотреть на successes, failures, и на input channel speed.

При этом утилизация CPU процессом rngd: 57%

haveged

Тест(худший из 3-х результат):

При этом утилизация CPU процессом haveged:12%

Виртуальные машины

Не рекомендуется использовать haveged внутри ВМ, т.к. там вроде как счетчики CPU не такие точные(типа округляются) и это сказывается на качестве энтропии.
Тру путь это использовать virt-ioRNG(qemu-kvm) — паравиртуальное устройство которое будет брать энтропию из пула хоста. Но, это уже совсем другая история…)

Источник

Как сгенерировать случайное число в Bash?

Как сгенерировать случайное число в диапазоне в Bash?

Использование $RANDOM . Это часто полезно в сочетании с простой арифметикой оболочки. Например, чтобы сгенерировать случайное число от 1 до 10 (включительно):

Фактический генератор в variables.c функции brand() . Старые версии были простым линейным генератором. Версия 4.0 bash использует генератор с цитатой к статье 1985 года, что, вероятно, означает, что это достойный источник псевдослучайных чисел. Я бы не использовал его для симуляции (и уж точно не для криптографии), но, вероятно, он подходит для базовых задач сценариев.

Если вы делаете что-то, что требует серьезных случайных чисел, которые вы можете использовать /dev/random или /dev/urandom если они доступны:

$RANDOM является внутренней функцией Bash (не константой), которая возвращает псевдослучайное целое число в диапазоне от 0 до 32767. Она не должна использоваться для генерации ключа шифрования.

Вы также можете использовать shuf (доступно в coreutils).

Попробуйте это из вашей оболочки:

Здесь -t d указывает, что формат вывода должен быть десятичным со знаком; -N 1 говорит прочитать один байт от /dev/urandom .

вы также можете получить случайное число из awk

Есть $ RANDOM. Я не знаю точно, как это работает. Но это работает. Для тестирования вы можете сделать:

Мне нравится этот трюк:

Случайное число от 0 до 9 включительно.

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

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

Вы можете получить случайные числа из файла с дд

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

звонить od дорого, если вам нужно много случайных чисел. Вместо этого я вызываю его один раз и сохраняю 1024 случайных числа из / dev / urandom. Когда rand вызывается, последнее случайное число возвращается и масштабируется. Затем он удаляется из кэша. Когда кеш пуст, читаются еще 1024 случайных числа.

Возвращает случайное число в RET от 0 до 9 включительно.

ОБНОВЛЕНИЕ: Это не работает так хорошо для всех N. Это также тратит впустую случайные биты, если используется с маленьким N. Отметив, что (в этом случае) 32-битное случайное число имеет достаточно энтропии для 9 случайных чисел от 0 до 9 (10 * 9 = 1 000 000 000 — philcolbourn
источник

Чтение из специальных файлов символов / dev / random или / dev / urandom — это лучший способ.

Эти устройства возвращают действительно случайные числа при чтении и разработаны, чтобы помочь прикладному программному обеспечению выбрать безопасные ключи для шифрования. Такие случайные числа извлекаются из пула энтропии, который вносится различными случайными событиями.

Эти два файла являются интерфейсом для рандомизации ядра, в частности

который извлекает действительно случайные байты из аппаратного обеспечения, если такая функция реализована аппаратным обеспечением (обычно таковым является), или извлекает из пула энтропии (состоящего из временных интервалов между событиями, такими как прерывания мыши и клавиатуры и другие прерывания, которые зарегистрированы в SA_SAMPLE_RANDOM).

Это работает, но записывает ненужные выходные данные dd в stdout. Команда ниже дает только целое число, которое мне нужно. Я даже могу получить указанное количество случайных битов, сколько мне нужно, путем настройки битовой маски, данной арифметическому расширению:

Источник

Сгенерировать случайное число в bash

Главное меню » Linux » Сгенерировать случайное число в bash

Использование случайного генератора:

Случайное число или диапазон случайных чисел можно сгенерировать с помощью переменной $RANDOM. По умолчанию он генерирует случайное число от 0 до 32767. Но вы можете установить диапазон чисел для генерации случайных чисел, разделив значение $RANDOM на определенное значение. Различные варианты использования переменной $RANDOM для генерации случайных чисел показаны в следующей части статьи.

Генерация случайных чисел с использованием переменной $RANDOM:

Здесь показаны способы генерации случайного числа в терминале и выполнения файла сценария.

A. Генерация случайных чисел с терминала

Выполните следующую команду, чтобы сгенерировать случайное число в диапазоне от 0 до 32767.

Вы можете сгенерировать случайное число из определенного диапазона, разделив переменную $RANDOM на определенное значение и получив оставшееся значение. Выполните следующую команду, чтобы сгенерировать случайное число в диапазоне от 1 до 50. Здесь используются двойные первые скобки с символом $.

Выполните следующую команду, чтобы сгенерировать случайное число в диапазоне от 10 до 40. Здесь использовалась третья скобка с символом $.

Б. Генерация случайных чисел с помощью скрипта

Создайте файл bash с помощью следующего сценария, чтобы сгенерировать случайное число из определенного диапазона, где минимальное и максимальное значения диапазона будут взяты от пользователя. Сообщение об ошибке будет отображаться, если взятое максимальное значение меньше минимального значения. Если разница между максимальным и минимальным значением равна 1, отобразится другое сообщение об ошибке. Случайное число будет генерироваться при каждом выполнении этого скрипта, если в качестве входных данных будут приняты допустимые минимальное и максимальное значения.

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

Генерация случайных чисел с помощью команды shuf:

Использование команды `shuf` – еще один способ сгенерировать случайное число из определенного диапазона. В этой статьи были показаны способы генерации случайного числа из терминала и использования сценария.

A. Генерация случайных чисел с терминала

Выполните следующую команду, чтобы сгенерировать случайное число от 0 до 50 с помощью команды `shuf`.

Согласно следующему выводу, указанная выше команда была выполнена три раза, и были сгенерированы три случайных числа.

Б. Генерация случайных чисел с помощью скрипта

Создайте файл bash со следующим сценарием для создания списка случайных чисел на основе входного значения. Цикл for использовался для многократного выполнения команды`shuf`, чтобы сгенерировать список случайных чисел от 1 до 100 и распечатать числа.

Следующие выходные данные показывают, что 5 было принято в качестве входного значения и было сгенерировано 5 случайных чисел, которые не больше 100 и не меньше 1.

Генерация случайных чисел с помощью /dev/urandom:

/dev/urandom можно использовать с разными командами для генерации разных типов случайных значений. Его нельзя использовать для указания значений диапазона, таких как команда shuf и переменная $RANDOM. Но количество цифр случайного числа можно определить в команде с помощью /dev/urandom. Использование команды od с /dev/urandom показано в следующей части этого руководства. Эта команда может использоваться для указания количества байтов, где каждый байт может быть определен десятичным числом от 0 до 255.

Выполните следующую команду, чтобы сгенерировать случайное число от 0 до 255.

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

Заключение:

В этой статье на различных примерах были объяснены три различных способа генерации случайных чисел. Кодер может генерировать определенный диапазон случайных чисел с помощью переменной $RANDOM или команды shuf в bash. Кодировщик может использовать /dev/urandom с любой другой командой для генерации случайного числа байтов определенной длины или длины. Генерация случайных чисел – очень распространенное требование для программирования, и я надеюсь, что читатели смогут сгенерировать случайное число в соответствии со своими требованиями после прочтения этого руководства.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Источник

Читайте также:  Linux network block device
Оцените статью