6.5.4. Устройства генерирования случайных чисел
6.5.4. Устройства генерирования случайных чисел
Специальные устройства /dev/random и /dev/urandom предоставляют доступ к средствам генерирования случайных чисел, встроенным в ядро Linux.
Большинство аналогичных программных функций, например функция rand() стандартной библиотеки языка С, в действительности генерируют псевдослучайные числя. Такие числа имеют некоторые свойства случайных последовательностей, но их можно воспроизвести: достаточно задать то же самое инициализирующее значение, чтобы получить одинаковую последовательность чисел. Такое поведение неизбежно, ведь внутренняя работа компьютера жестко определена и предсказуема. Но в ряде приложений это крайне нежелательно. Например, можно взломать криптографический шифр, если воспроизвести последовательность случайных чисел, лежащих в его основе.
Чтобы получить настоящие случайные числа, необходим внешний "источник хаоса". Ядро Linux знает о таком источнике: это вы сами! Замеряя задержки между действиями пользователя, в частности нажатиями клавиш и перемещениями мыши, ядро способно генерировать непредсказуемый поток действительно случайных чисел. Получить доступ к этому потопу можно путем чтения из устройств /dev/random и /dev/urandom.
Разница между устройствами проявляется, когда запас случайных чисел в ядре Linux заканчивается. Если попытаться прочесть большое количество байтов из устройства /dev/random и при этом не выполнять никаких пользовательских действий (не нажимать клавиши, не перемещать мышь и т.п.), система заблокирует операцию чтения. Только когда пользователь проявит какую-то активность, система сгенерирует дополнительные случайные числа и передаст их программе.
Попытайтесь, к примеру, отобразить содержимое файла /dev/random с помощью команды od.[20] В каждой строке выходных данных содержится 16 случайных байтов.
% od -t x1 /dev/random
0000000 2с 9с 7а db 2е 79 3d 65 36 c2 e3 1b 52 75 1е 1а
0000020 d3 6d 1e a7 91 05 2d 4d c3 a6 de 54 29 f4 46 04
0000040 b3 b0 8d 94 21 57 f3 90 61 dd 26 ac 94 c3 b9 3a
0000060 05 a3 02 cb 22 0a be c9 45 dd a6 59 40 22 53 d4
Число строк в выводе команды будет разным (их может оказаться очень мало). Главное то, что, в конце концов, вывод прекратится, поскольку операционная систем исчерпает запас случайных чисел. Попробуйте теперь переместить мышь или нажать что-нибудь на клавиатуре, и вы увидите, что появляются новые случайные числа.
В противоположность этому операция чтения из устройства /dev/urandom никогда не блокируется. Если в системе кончаются случайные числа, Linux использует криптографический алгоритм, чтобы сгенерировать псевдослучайные числа из последней цепочки случайных байтов.
Следующая команда будет выполняться до тех пор. пока пользователь не нажмет <Ctrl+C>:
% od -t x1 /dev/urandom
0000000 62 71 d6 3e af dd de 62 c0 42 78 bd 29 9c 69 49
0000020 26 3b 95 be b9 6c 15 16 38 fd 7e 34 f0 ba ее c3
0000040 95 31 e5 2c 8d 8a dd f4 c4 3b 9b 44 2f 20 d1 54
...
Поучить доступ в программе к генератору случайных чисел несложно. В листинге 6.1 показана функция, которая генерирует случайное число, читая байты из файла /dev/random. Помните, что операция чтения из этого файла окажется заблокированной в случае нехватки случайных чисел. Если важна скорость работы функции и можно смириться с тем, что некоторые числа окажутся псевдослучайными, воспользуйтесь файлом /dev/urandom.
Листинг 6.1. (random_number.c) Генерирование случайного числа с помощью файла /dev/random
#include <assert.h>
#include <sys/stat.h>
#include <sys/types.h
#include <fcntl.h>
#include <unistd.h>
/* Функция возвращает случайное число в диапазоне от MIN до МАХ
включительно. Случайная последовательность байтов читается из
файла /dev/random. */
int random_number(int min, int max) {
/* Дескриптор файла /dev/random сохраняется в статической
переменной, чтобы не приходилось повторно открывать файл
при каждом следующем вызове функции. */
static int dev_random_fd = -1;
char* next_random_byte;
int bytes_to_read;
unsigned random_value;
/* Убеждаемся, что аргумент MAX больше, чем MIN. */
assert(max > min);
/* Если функция вызывается впервые, открываем файл /dev/random
и сохраняем его дескриптор. */
if (dev_random_fd == -1) {
dev_random_fd = open("/dev/random", O_RDONLY);
assert(dev_random_fd != -1);
}
/* Читаем столько байтов, сколько необходимо для заполнения
целочисленной переменной. */
next_random_byte = (char*)&random_value;
bytes_to_read = sizeof(random_value);
/* Цикл выполняется до тех пор, пока не будет прочитано
требуемое количество байтов. Поскольку файл /dev/random
заполняется в результате пользовательских действий,
при длительном отсутствии активности операция чтения
может быть заблокирована или возвращать
лишь один байт за раз. */
do {
int bytes_read;
bytes_read =
read(dev_random_fd, next_random_byte, bytes_to_read);
bytes_to_read -= bytes_read;
next_random_byte += bytes_read;
} while (bytes_to_read > 0);
/* Вычисляем случайное число в правильном диапазоне. */
return min + (random_value % (max - min + 1));
}
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Приложение Б Генератор случайных чисел ядра
Приложение Б Генератор случайных чисел ядра В ядре Linux реализован генератор случайных чисел, который теоретически может генерировать истинно случайные числа. Генератор случайных чисел собирает в пул энтропии шумы внешней среды, которые поступают из драйверов
(3.36) Диспетчер устройств показывает не все устройства :(. Как увидеть все установленные устройства (включая даже не подключенные в данный момент)?
(3.36) Диспетчер устройств показывает не все устройства :(. Как увидеть все установленные устройства (включая даже не подключенные в данный момент)? Установите в Диспетчере устройств опцию View/Show hidden devices, затем откройте окно консоли и выполните в нем следующие команды:set
Устройства с широкой полосой пропускания и устройства, обеспечивающие связь на большой дальности
Устройства с широкой полосой пропускания и устройства, обеспечивающие связь на большой дальности Термин "устройства с широкой полосой пропускания" имеет несколько значений. Во-первых, этот термин обозначает устройства, позволяющие одновременно передавать различные
5.28. Генерирование случайных чисел
5.28. Генерирование случайных чисел Если вас устраивают псевдослучайные числа, вам повезло. Именно они предоставляются в большинстве языков, включая и Ruby.Метод rand из модуля Kernel возвращает псевдослучайное число x с плавающей точкой, отвечающее условиям x >= 0.0 и x < 1.0.
Программа для генерирования карт WebMoney
Программа для генерирования карт WebMoney Похожий способ «развода» доверчивых обывателей на деньги состоит в том, что вам предлагается купить так называемый WebMoney-генератор – программу, которая автоматически генерирует коды карт WebMoney. Стоимость такой «программы» у
11.6. Генерация случайных чисел
11.6. Генерация случайных чисел ПроблемаТребуется сгенерировать несколько случайных чисел в формате с плавающей точкой в интервале значений [0.0, 1.0) при равномерном их распределении.РешениеСтандарт C++ предусматривает наличие C-функции библиотеки этапа исполнения rand,
Генерация случайных чисел
Генерация случайных чисел Прежде всего, давайте опишем, что мы понимаем под случайным числом (random number). Без четкого определения термина мы будем неуверенно себя чувствовать при разработке и реализации генератора случайных чисел.Будет ли число 2 случайным числом? Просто
Выводы по алгоритмам генерации случайных чисел
Выводы по алгоритмам генерации случайных чисел В предыдущем разделе были рассмотрены несколько достаточно простых генераторов случайных чисел. Наилучшие последовательности чисел позволяют получить два последних генератора, но, к сожалению, они выдвигают жесткие
Другие распределения случайных чисел
Другие распределения случайных чисел Если случайные числа используются для моделирования некоторого процесса, то вы можете обнаружить, что все рассмотренные выше генераторы случайных чисел не позволяют решить поставленную задачу. Это вызвано равномерным
12.5.6. Алгоритмы генерирования и модификации
12.5.6. Алгоритмы генерирования и модификации Шесть алгоритмов генерирования и модификации либо создают и заполняют новую последовательность, либо изменяют значения в существующей.fill(), fill_n(), for_each(), generate(),generate_n(),
Пример 9-23. Генерация случайных чисел
Пример 9-23. Генерация случайных чисел #!/bin/bash# $RANDOM возвращает различные случайные числа при каждом обращении к ней.# Диапазон изменения: 0 - 32767 (16-битовое целое со знаком).MAXCOUNT=10count=1echoecho "$MAXCOUNT случайных чисел:"echo "-----------------"while [ "$count" -le $MAXCOUNT ] # Генерация 10 ($MAXCOUNT) случайных
О случайных числах и сеансовых ключах
О случайных числах и сеансовых ключах Для генерации одноразовых симметричных сеансовых ключей PGP использует криптографически стойкий генератор псевдослучайных чисел (ГПСЧ)[11]. Если файл ПСЧ отсутствует, он автоматически создаётся и заполняется абсолютно произвольными
НОВОСТИ: Цепь случайных совпадений?
НОВОСТИ: Цепь случайных совпадений? Автор: Киви БердРазразившийся в Греции скандал вокруг перехвата сотовой связи ключевых политических фигур страны по своим масштабам, пожалуй, не знает себе равных не только в Европе, но и во всем мире. Вкратце суть произошедшего
У11.9 Генерация случайных чисел
У11.9 Генерация случайных чисел Напишите класс, реализующий алгоритм получения псевдослучайных чисел, основанный на последовательности: ni = f(ni - 1), где функция f задана, а начальное значение n0 определяется клиентом класса. Функция не должна иметь побочных эффектов.
Вскрытие устройства: атаки на корпус устройства и его механическую часть
Вскрытие устройства: атаки на корпус устройства и его механическую часть Наиболее общей целью анализа корпуса устройства и его механической части является получение исчерпывающей информации об устройстве и возможности исследования его внутренней части. Агрессивный