Поиск по сайту:

Как генерировать лучшие случайные числа в командной строке Bash


Генерация случайных чисел в bash кажется простой с помощью переменной $RANDOM, но действительно ли эта переменная является случайной? Узнайте, что может помешать вам генерировать высококачественные случайные числа и многое другое!

Случайные числа в терминале

Кажется простым сгенерировать случайное число в Bash:

Но действительно ли это число случайное?

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

Мы можем инициализировать генератор случайных чисел начальным значением, установив для переменной RANDOM желаемое начальное значение. Итак, возможно, мы можем предоставить случайное число в качестве начального числа для генератора случайных чисел?

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

Эта проблема называется проблемой генерации «случайной энтропии». Чем больше энтропии мы можем генерировать, тем лучше будут наши случайные числа. Эта конкретная проблема не ограничивается только Bash, она существует во всех основных компьютерных системах, которые пытаются генерировать случайные числа. Таким образом, случайность никогда не бывает действительно случайной. Некоторые другие случайные системы используют, например, движения мыши и нажатия клавиш, а также другие полуслучайные вводные данные в комбинации, чтобы увеличить сложность случайного пула энтропии.

Итак, как мы можем сгенерировать случайное число, «достаточно хорошее», чтобы его можно было назвать действительно случайным?

Для этого нам в качестве источника и семени потребовалось бы что-то действительно или близкое к истинному случайному. Мы могли бы подумать об использовании сегодняшней даты, но это не очень случайно, если подумать. Как насчет секунд с 00:00:00 UTC 1 января 1970 года (обычно называемого «эпохой» в кругах Linux)? Может быть, но все, что нужно, это где-то файл журнала, и можно восстановить эпоху.

Лучшим решением является использование младших значащих цифр таймера с наносекундной точностью:

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

В примере мы берем байты с 4 по 9 или 6 числа из времени эпохи, выраженного date +%N, и выводим в результате подоболочки, инициированной $ (. ..). Это означает, что наше минимальное начальное число равно 0, а максимальное начальное число равно 999999. Это всего лишь диапазон из 1 миллиона чисел.

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

Если мы выберем меньшее количество чисел, риск для этого будет больше. Если мы выберем больше, риск станет меньше, но и «случайное начальное число» тоже станет менее случайным. Это можно проиллюстрировать, включив секунды с начала эпохи:

Мы видим, как тикают секунды! Обратите внимание на начальные 6 > 7 > 8 и т. д.

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

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