Генерация случайных чисел — это процесс, при котором, часто с помощью генератора случайных чисел ( ГСЧ ), генерируется последовательность чисел или символов , которую нельзя предсказать лучше, чем случайным образом. Это означает, что конкретная последовательность результатов будет содержать некоторые закономерности, которые можно обнаружить задним числом, но невозможно предвидеть. Истинные генераторы случайных чисел могут быть аппаратными генераторами случайных чисел (ГСЧ), в которых каждое поколение является функцией текущего значения атрибута физической среды, которое постоянно меняется таким образом, что практически невозможно смоделировать. Это будет отличаться от так называемых «генераций случайных чисел», выполняемых генераторами псевдослучайных чисел (ГПСЧ), которые генерируют числа, которые только выглядят случайными, но на самом деле предопределены — эти генерации можно воспроизвести, просто зная состояние ГПСЧ. [1]
Различные применения случайности привели к разработке различных методов генерации случайных данных. Некоторые из них существовали с древних времен, включая такие известные примеры, как бросание игральных костей , подбрасывание монеты , перетасовка игральных карт , использование стеблей тысячелистника (для гадания ) в И-Цзин , а также бесчисленное множество других методов. Из-за механической природы этих методов генерация больших количеств достаточно случайных чисел (важных в статистике) требовала много работы и времени. Таким образом, результаты иногда собирались и распространялись в виде таблиц случайных чисел .
Существует несколько вычислительных методов генерации псевдослучайных чисел. Все они не достигают цели истинной случайности, хотя они могут с разным успехом соответствовать некоторым статистическим тестам на случайность , предназначенным для измерения того, насколько непредсказуемы их результаты (то есть, в какой степени различимы их закономерности). Это, как правило, делает их непригодными для таких приложений, как криптография . Однако также существуют тщательно разработанные криптографически безопасные генераторы псевдослучайных чисел (CSPRNGS) со специальными функциями, специально разработанными для использования в криптографии.
Генераторы случайных чисел применяются в азартных играх , статистической выборке , компьютерном моделировании , криптографии , полностью рандомизированном проектировании и других областях, где желательно получение непредсказуемого результата. Как правило, в приложениях, где непредсказуемость является важнейшей характеристикой, например, в приложениях безопасности, аппаратные генераторы обычно предпочтительнее псевдослучайных алгоритмов, где это возможно.
Генераторы псевдослучайных чисел очень полезны при разработке симуляций методом Монте-Карло , поскольку отладка облегчается возможностью повторного запуска той же последовательности случайных чисел, начиная с того же случайного начального числа . Они также используются в криптографии — при условии, что начальное число является секретным. Отправитель и получатель могут автоматически генерировать один и тот же набор чисел для использования в качестве ключей.
Генерация псевдослучайных чисел является важной и распространенной задачей в компьютерном программировании. В то время как криптография и некоторые числовые алгоритмы требуют очень высокой степени кажущейся случайности, многим другим операциям требуется лишь скромное количество непредсказуемости. Некоторые простые примеры могут представлять пользователю «случайную цитату дня» или определять, каким образом управляемый компьютером противник может двигаться в компьютерной игре. Более слабые формы случайности используются в хэш-алгоритмах и при создании амортизированных алгоритмов поиска и сортировки .
Некоторые приложения, которые на первый взгляд кажутся подходящими для рандомизации , на самом деле не так просты. Например, система, которая «случайно» выбирает музыкальные треки для фоновой музыкальной системы, должна только казаться случайной и даже иметь способы управления выбором музыки: по-настоящему случайная система не будет иметь ограничений на то, чтобы один и тот же элемент появлялся два или три раза подряд.
Существует два основных метода, используемых для генерации случайных чисел. Первый метод измеряет некоторое физическое явление, которое, как ожидается, будет случайным, а затем компенсирует возможные смещения в процессе измерения. Примерами источников являются измерение атмосферного шума , теплового шума и других внешних электромагнитных и квантовых явлений. Например, космическое фоновое излучение или радиоактивный распад, измеренные в течение коротких временных шкал, представляют собой источники естественной энтропии (как меру непредсказуемости или неожиданности процесса генерации чисел).
Скорость, с которой энтропия может быть получена из естественных источников, зависит от измеряемых физических явлений. Таким образом, источники естественной «истинной» энтропии называются блокирующими — они ограничены по скорости, пока не будет собрано достаточно энтропии для удовлетворения спроса. В некоторых Unix-подобных системах, включая большинство дистрибутивов Linux , файл псевдоустройства /dev/random будет блокироваться до тех пор, пока из среды не будет собрано достаточно энтропии. [2] Из-за такого блокирующего поведения большие объемы чтения из /dev/random , такие как заполнение жесткого диска случайными битами, часто могут быть медленными в системах, которые используют этот тип источника энтропии.
Второй метод использует вычислительные алгоритмы , которые могут производить длинные последовательности, по-видимому, случайных результатов, которые на самом деле полностью определяются более коротким начальным значением, известным как начальное значение или ключ . В результате вся, по-видимому, случайная последовательность может быть воспроизведена, если известно начальное значение. Этот тип генератора случайных чисел часто называют генератором псевдослучайных чисел . Этот тип генератора обычно не полагается на источники естественной энтропии, хотя он может периодически засеиваться естественными источниками. Этот тип генератора является неблокирующим, поэтому они не ограничены по скорости внешним событием, что делает возможными большие объемные чтения.
Некоторые системы используют гибридный подход, предоставляя случайность, собранную из естественных источников, когда она доступна, и возвращаясь к периодически пересеваемым программным криптографически безопасным генераторам псевдослучайных чисел (CSPRNG). Откат происходит, когда желаемая скорость считывания случайности превышает способность подхода к естественному сбору поспевать за спросом. Этот подход позволяет избежать ограниченного по скорости блокирующего поведения генераторов случайных чисел, основанных на более медленных и чисто экологических методах.
Хотя генератор псевдослучайных чисел, основанный исключительно на детерминированной логике, никогда не может считаться «истинным» источником случайных чисел в чистом смысле этого слова, на практике их обычно достаточно даже для требовательных приложений, критичных к безопасности. Тщательно спроектированные и реализованные генераторы псевдослучайных чисел могут быть сертифицированы для критически важных для безопасности криптографических целей, как в случае с алгоритмом yarrow и fortuna . Первый является основой источника энтропии /dev/random в FreeBSD , AIX , macOS , NetBSD и других. OpenBSD использует алгоритм псевдослучайных чисел, известный как arc4random . [ dubious – обсудить ] [3]
Самые ранние методы генерации случайных чисел, такие как бросание игральных костей, подбрасывание монеты и рулетка, используются и сегодня, в основном в играх и азартных играх, поскольку они, как правило, слишком медленны для большинства приложений в статистике и криптографии.
Аппаратный генератор случайных чисел может быть основан на по существу случайном атомном или субатомном физическом явлении, непредсказуемость которого можно проследить до законов квантовой механики . [4] [5] Источники энтропии включают радиоактивный распад , тепловой шум , дробовой шум , лавинный шум в диодах Зенера , дрейф часов , синхронизацию фактических движений головки чтения-записи жесткого диска и радиошум . Однако физические явления и инструменты, используемые для их измерения, обычно характеризуются асимметрией и систематическими смещениями , которые делают их результаты неравномерно случайными. Экстрактор случайности , такой как криптографическая хэш-функция , может использоваться для приближения к равномерному распределению битов из неравномерно случайного источника, хотя и с более низкой скоростью передачи битов.
Появление широкополосных источников фотонной энтропии, таких как оптический хаос и усиленный шум спонтанного излучения , значительно способствует развитию физического генератора случайных чисел. Среди них оптический хаос [6] [7] имеет высокий потенциал для физического создания высокоскоростных случайных чисел благодаря своей высокой пропускной способности и большой амплитуде. Прототип высокоскоростного физического генератора случайных битов в реальном времени на основе хаотического лазера был построен в 2013 году. [8]
Были разработаны различные изобретательные способы сбора этой энтропийной информации. Один из методов заключается в запуске хэш-функции против кадра видеопотока из непредсказуемого источника. Лаваранд использовал этот метод с изображениями ряда лавовых ламп . HotBits измерял радиоактивный распад с помощью трубок Гейгера-Мюллера , [9] в то время как Random.org использует изменения амплитуды атмосферного шума, записанные с помощью обычного радио.
Другим распространенным источником энтропии является поведение пользователей системы. Хотя люди не считаются хорошими генераторами случайности по запросу, они довольно хорошо генерируют случайное поведение в контексте игры в смешанные стратегические игры. [10] Некоторое программное обеспечение, связанное с безопасностью, требует от пользователя выполнения длительной серии движений мыши или ввода с клавиатуры для создания достаточной энтропии, необходимой для генерации случайных ключей или инициализации генераторов псевдослучайных чисел. [11]
Большинство случайных чисел, генерируемых компьютером, используют PRNG, которые являются алгоритмами, которые могут автоматически создавать длинные серии чисел с хорошими случайными свойствами, но в конечном итоге последовательность повторяется (или использование памяти растет без ограничений). Эти случайные числа хороши во многих ситуациях, но не так случайны, как числа, генерируемые из электромагнитного атмосферного шума, используемого в качестве источника энтропии. [12] Ряд значений, генерируемых такими алгоритмами, обычно определяется фиксированным числом, называемым начальным числом . Одним из наиболее распространенных PRNG является линейный конгруэнтный генератор , который использует рекуррентность
для генерации чисел, где a , b и m — большие целые числа, и — следующее в X как ряд псевдослучайных чисел. Максимальное количество чисел, которое может выдать формула, — это модуль , m . Рекуррентное соотношение может быть распространено на матрицы, чтобы иметь гораздо более длинные периоды и лучшие статистические свойства . [13] Чтобы избежать определенных неслучайных свойств одного линейного конгруэнтного генератора, несколько таких генераторов случайных чисел с немного разными значениями коэффициента множителя, a , могут использоваться параллельно с «главным» генератором случайных чисел, который выбирает из нескольких различных генераторов.
Простой метод «ручка-бумага» для генерации случайных чисел — так называемый метод среднего квадрата, предложенный Джоном фон Нейманом . Несмотря на простоту реализации, его выход имеет низкое качество. Он имеет очень короткий период и серьезные недостатки, такие как выходная последовательность, почти всегда сходящаяся к нулю. Недавнее нововведение — объединение среднего квадрата с последовательностью Вейля . Этот метод дает высококачественный выход в течение длительного периода. [14]
Большинство языков программирования включают функции или библиотечные процедуры, которые предоставляют генераторы случайных чисел. Они часто предназначены для предоставления случайного байта или слова, или числа с плавающей точкой, равномерно распределенного между 0 и 1.
Качество, т.е. случайность, таких библиотечных функций широко варьируется от полностью предсказуемого вывода до криптографически безопасного. Генератор случайных чисел по умолчанию во многих языках, включая Python, Ruby, R, IDL и PHP, основан на алгоритме Mersenne Twister и недостаточен для целей криптографии, как это явно указано в документации языка. Такие библиотечные функции часто имеют плохие статистические свойства, и некоторые будут повторять шаблоны всего после десятков тысяч попыток. Они часто инициализируются с использованием часов реального времени компьютера в качестве начального значения, поскольку такие часы являются 64-битными и измеряют в наносекундах, что намного превышает точность человека . Эти функции могут обеспечивать достаточную случайность для определенных задач (например, видеоигр), но не подходят там, где требуется высококачественная случайность, например, в криптографических приложениях или статистике. [15]
Гораздо более качественные источники случайных чисел доступны в большинстве операционных систем; например , /dev/random в различных вариантах BSD, Linux, Mac OS X, IRIX и Solaris или CryptGenRandom для Microsoft Windows. Большинство языков программирования, включая упомянутые выше, предоставляют средства для доступа к этим более качественным источникам.
Генерация случайных чисел также может выполняться людьми в форме сбора различных входных данных от конечных пользователей и использования их в качестве источника рандомизации. Однако большинство исследований показывают, что у людей есть некоторая степень неслучайности при попытке создать случайную последовательность, например, цифр или букв. Они могут слишком часто менять варианты по сравнению с хорошим генератором случайных чисел; [16] таким образом, этот подход не получил широкого распространения. Однако именно по той причине, что люди плохо справляются с этой задачей, генерация случайных чисел человеком может использоваться в качестве инструмента для получения информации о функциях мозга, которые в противном случае недоступны. [17]
Даже при наличии источника правдоподобных случайных чисел (возможно, от аппаратного генератора на основе квантовой механики) получение чисел, которые полностью непредвзяты, требует внимания. Кроме того, поведение этих генераторов часто меняется в зависимости от температуры, напряжения питания, возраста устройства или других внешних помех.
Сгенерированные случайные числа иногда подвергаются статистическим тестам перед использованием, чтобы убедиться, что базовый источник все еще работает, а затем подвергаются постобработке для улучшения их статистических свойств. Примером может служить аппаратный генератор случайных чисел TRNG9803 [18] , который использует измерение энтропии в качестве аппаратного теста, а затем постобрабатывает случайную последовательность с помощью потокового шифра сдвигового регистра. Обычно сложно использовать статистические тесты для проверки сгенерированных случайных чисел. Ван и Никол [19] предложили метод статистического тестирования на основе расстояния, который используется для выявления слабых мест нескольких случайных генераторов. Ли и Ван [20] предложили метод тестирования случайных чисел на основе источников лазерной хаотической энтропии с использованием свойств броуновского движения.
Статистические тесты также используются для того, чтобы убедиться в том, что конечный результат постобработки генератора случайных чисел действительно беспристрастен, при этом разрабатываются многочисленные наборы тестов на случайность .
Большинство генераторов случайных чисел изначально работают с целыми числами или отдельными битами, поэтому требуется дополнительный шаг для достижения «канонического» равномерного распределения между 0 и 1. Реализация не так тривиальна, как деление целого числа на его максимально возможное значение. А именно: [21] [22]
Основной алгоритм, используемый OpenJDK , Rust и NumPy , описан в предложении для STL C++ . Он не использует дополнительную точность и страдает от смещения только в последнем бите из-за округления до четного. [23] Другие числовые проблемы оправданы при сдвиге этого «канонического» равномерного распределения в другой диапазон. [24] Предлагаемый метод для языка программирования Swift утверждает, что использует полную точность везде. [25]
Равномерно распределенные целые числа обычно используются в таких алгоритмах, как перемешивание Фишера–Йетса . Опять же, наивная реализация может вызвать смещение по модулю в результате, поэтому необходимо использовать более сложные алгоритмы. Метод, который почти никогда не выполняет деление, был описан в 2018 году Дэниелом Лемиром [26] , а текущим состоянием дел является вдохновленный арифметическим кодированием «оптимальный алгоритм» 2021 года Стивена Кэнона из Apple Inc. [27]
Большинство ГСЧ от 0 до 1 включают 0, но исключают 1, в то время как другие включают или исключают оба.
При наличии источника однородных случайных чисел существует несколько методов создания нового случайного источника, соответствующего функции плотности вероятности . Один метод, называемый методом инверсии , включает интегрирование до области, большей или равной случайному числу (которое должно быть сгенерировано между 0 и 1 для правильного распределения). Второй метод, называемый методом принятия-отклонения , включает выбор значений x и y и проверку того, больше ли функция x значения y. Если это так, то значение x принимается. В противном случае значение x отклоняется, и алгоритм повторяет попытку. [28] [29]
В качестве примера для выборки с отклонением , чтобы сгенерировать пару статистически независимых стандартных нормально распределенных случайных чисел ( x , y ), можно сначала сгенерировать полярные координаты ( r , θ ), где r2 ~ χ2 2 и θ ~ UNIFORM(0,2π) (см. преобразование Бокса–Мюллера ) .
Выходы нескольких независимых ГСЧ можно объединить (например, с помощью побитовой операции XOR ), чтобы получить объединенный ГСЧ, по крайней мере такой же хороший, как и лучший используемый ГСЧ. Это называется программным отбеливанием .
Вычислительные и аппаратные генераторы случайных чисел иногда объединяются, чтобы отразить преимущества обоих видов. Вычислительные генераторы случайных чисел обычно могут генерировать псевдослучайные числа гораздо быстрее, чем физические генераторы, в то время как физические генераторы могут генерировать «истинную случайность».
Некоторые вычисления, использующие генератор случайных чисел, можно обобщить как вычисление общего или среднего значения, например, вычисление интегралов методом Монте-Карло . Для таких задач может быть возможно найти более точное решение с помощью так называемых последовательностей с низким расхождением , также называемых квазислучайными числами. Такие последовательности имеют определенный шаблон, который заполняет пробелы равномерно, говоря качественно; истинно случайная последовательность может оставлять, и обычно оставляет, большие пробелы.
Следующие сайты предоставляют образцы случайных чисел:
Поскольку значительная часть криптографии зависит от криптографически безопасного генератора случайных чисел для генерации ключей и криптографических одноразовых кодов , если генератор случайных чисел можно сделать предсказуемым, злоумышленник может использовать его в качестве бэкдора для взлома шифрования.
Сообщается, что АНБ вставило бэкдор в сертифицированный NIST криптографически безопасный генератор псевдослучайных чисел Dual EC DRBG . Если, например, SSL-соединение создается с использованием этого генератора случайных чисел, то, по словам Мэтью Грина, это позволит АНБ определить состояние генератора случайных чисел и, таким образом, в конечном итоге, иметь возможность читать все данные, отправленные по SSL-соединению. [30] Несмотря на то, что было очевидно, что Dual_EC_DRBG был очень плохим и, возможно, запрограммированным генератором псевдослучайных чисел задолго до того, как бэкдор АНБ был подтвержден в 2013 году, он широко использовался на практике до 2013 года, например, известной компанией по безопасности RSA Security . [31] Впоследствии появились обвинения в том, что RSA Security сознательно вставила бэкдор АНБ в свои продукты, возможно, как часть программы Bullrun . RSA отрицает сознательное встраивание бэкдора в свои продукты. [32]
Также была высказана теория, что аппаратные ГСЧ могут быть тайно модифицированы, чтобы иметь меньшую энтропию, чем заявлено, что сделает шифрование с использованием аппаратного ГСЧ уязвимым для атак. Один из таких методов, который был опубликован, работает путем изменения маски легирования чипа, что не поддается обнаружению с помощью оптического обратного проектирования. [33] Например, для генерации случайных чисел в Linux считается неприемлемым использовать аппаратный ГСЧ RDRAND от Intel без смешивания выходных данных RDRAND с другими источниками энтропии для противодействия любым бэкдорам в аппаратном ГСЧ, особенно после разоблачения программы АНБ Bullrun. [34] [35]
В 2010 году лотерейный розыгрыш в США был сфальсифицирован директором по информационной безопасности Ассоциации лотерей разных штатов (MUSL), который тайно установил вредоносное ПО на защищенный компьютер ГСЧ MUSL во время планового обслуживания. [36] В ходе взломов мужчина выиграл в общей сложности 16 500 000 долларов за несколько лет.