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

Эта статья находится на начальном уровне проработки, в одной из её версий выборочно используется текст из источника, распространяемого под свободной лицензией
Материал из энциклопедии Руниверсалис
(перенаправлено с «ГСЧ»)

Генератор псевдослучайных чисел (ГПСЧ, англ. pseudorandom number generator, PRNG) — алгоритм, порождающий последовательность чисел, элементы которой почти независимы друг от друга и подчиняются заданному распределению (обычно дискретному равномерному).

Современная информатика широко использует псевдослучайные числа в самых разных приложениях — от метода Монте-Карло и имитационного моделирования до криптографии. При этом от качества используемых ГПСЧ напрямую зависит качество получаемых результатов. Это обстоятельство подчёркивает известный афоризм математика ORNL Роберта Кавью[англ.]: «генерация случайных чисел слишком важна, чтобы оставлять её на волю случая».

Источники случайных чисел

Источники настоящих случайных чисел найти крайне трудно. Физические шумы[1], такие, как детекторы событий ионизирующей радиации, дробовой шум в резисторе или космическое излучение[2], могут быть такими источниками. Однако применяются такие устройства в приложениях сетевой безопасности редко. Сложности также вызывают грубые атаки на подобные устройства.

У физических источников случайных чисел существует ряд недостатков:

  • Время и трудозатраты при установке и настройке по сравнению с программными ГПСЧ;
  • Дороговизна;
  • Генерация случайных чисел происходит медленнее, чем при программной реализации ГПСЧ;
  • Невозможность воспроизведения ранее сгенерированной последовательности случайных чисел.[3]

В то же время случайные числа, получаемые из физического источника, могут использоваться в качестве порождающего элемента (англ. seed) для программных ГПСЧ. Такие комбинированные генераторы применяются в криптографии, лотереях, игровых автоматах.[3]

Качественные требования, предъявляемые к ГПСЧ

  • Достаточно длинный период, гарантирующий отсутствие зацикливания последовательности в пределах решаемой задачи. Длина периода должна быть математически доказана;
  • Эффективность — быстрота работы алгоритма и малые затраты памяти;
  • Воспроизводимость — возможность заново воспроизвести ранее сгенерированную последовательность чисел любое количество раз;
  • Портируемость — одинаковое функционирование на различном оборудовании и операционных системах;
  • Быстрота получения [math]\displaystyle{ X_{n+i} }[/math] элемента последовательности чисел, при задании [math]\displaystyle{ X_{n} }[/math]элемента, для [math]\displaystyle{ i }[/math] любой величины; это позволяет разделять последовательность на несколько потоков (последовательностей чисел).[3]

Ранние подходы к формированию ПСЧ

Джон фон Нейман считал неприемлемым использование физических генераторов случайных чисел в вычислительной технике, так как при возникновении необходимости проверки вычислений повтор предыдущих действий требовал бы воспроизведение случайного числа, в то время как генерация нового случайного числа недопустима. Предварительная запись и хранение сгенерированных случайных чисел предполагало бы возможность их считывания. Механизм считывания данных являлся одним из самых слабых звеньев вычислительных машин 1940-х годов. Джон фон Нейман привёл следующий метод «середины квадрата» (англ. middle-square method)[4] получения десятизначных псевдослучайных чисел:

Десятизначное число возводится в квадрат, затем из середины квадрата числа берётся десятизначное число, которое снова возводится в квадрат, и так далее.

Например, для 4-значных чисел, начиная с 1234, получаем [math]\displaystyle{ 1234^2 = 1522756 }[/math], где берём средние 4 цифры [math]\displaystyle{ 01\overline{5227}56 }[/math] (дописав ноль в начале, если это необходимо). Затем возводим полученное число в квадрат [math]\displaystyle{ 5227^2 = 27\overline{3215}29 }[/math], и так далее. Недостатком данного метода является ограниченность множества ПСЧ из-за того, что последовательность зацикливается — [math]\displaystyle{ 5000^2 = 25\overline{0000}00, 0^2 = 0, \dots }[/math].

В 1951 году Д. Г. Лемер предложил линейный конгруэнтный метод,[5] суть которого заключается в задании последовательности целых чисел рекурсивной формулой [math]\displaystyle{ X_{n+1} = (a X_n + c)~\bmod~m, }[/math] где [math]\displaystyle{ a, \ m, \ c }[/math] — целые и удовлетворяют следующим условиям: [math]\displaystyle{ 0\lt m, \ \ 0\lt a\lt m,\ \ 0\lt c\lt m, \ \ X_{0} \lt m }[/math]. Недостатком данного метода является зависимость [math]\displaystyle{ X_{n}, \ n \gt 0 }[/math] от [math]\displaystyle{ X_{0} }[/math], так как [math]\displaystyle{ X_{n} = \left(a^nX_{0} + \frac{c(a^n-1)}{(a-1)}\right)~\bmod~ m }[/math], а также то, что ПСЧ зацикливается.

Детерминированные ГПСЧ

Алгоритм

Большинство детерминированных ГПСЧ соответствуют структуре, предложенной П. Лекуером [1] в 1994 году: [math]\displaystyle{ (\mathcal{S}, \mu, f, \mathcal{U}, g) }[/math], где [math]\displaystyle{ \mathcal{S} }[/math] — это конечный набор состояний, [math]\displaystyle{ \mu }[/math] — вероятностное распределение в пространстве состояний [math]\displaystyle{ \mathcal{S} }[/math], используемое для выбора начального состояния [math]\displaystyle{ \mathcal{s_{0}} }[/math](англ. seed), [math]\displaystyle{ f:\mathcal{S}\rightarrow \mathcal{S} }[/math] — функция перехода, [math]\displaystyle{ \mathcal{U} }[/math] — пространство выходных значений, [math]\displaystyle{ g:\mathcal{S}\rightarrow \mathcal{U} }[/math]. Обычно [math]\displaystyle{ \mathcal{U} = (0,1) }[/math], а состояние генератора задается рекуррентной формулой [math]\displaystyle{ s_{i} = f \ (s_{i-1}) }[/math] для [math]\displaystyle{ i \geq 1 }[/math]. Выходное значение генератора [math]\displaystyle{ u_{i} = g \ (s_{i}) \in \mathcal{U} }[/math]; [math]\displaystyle{ u_{0}, \ u_{1}, \ u_{2} \ ... }[/math] — последовательность псевдослучайных чисел. Так как [math]\displaystyle{ \mathcal{U} }[/math] конечно, то должны существовать некоторые конечные [math]\displaystyle{ l \geq 0 }[/math] и [math]\displaystyle{ j\gt 0 }[/math] такие, что [math]\displaystyle{ s_{l+j} = s_{l} }[/math]. Значит, для всех [math]\displaystyle{ i \geq l }[/math] будут выполняться условия [math]\displaystyle{ s_{i+j} = s_{i} }[/math] и [math]\displaystyle{ u_{i+j} = u_{i} }[/math], потому что функции [math]\displaystyle{ f }[/math] и [math]\displaystyle{ g }[/math] детерминированные. Таким образом, получается, что последовательность периодическая. Периодом ГПСЧ называется минимальное положительное [math]\displaystyle{ j }[/math].[3]

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

Из современных ГПСЧ широкое распространение также получил «вихрь Мерсенна», предложенный в 1997 году Мацумото и Нисимурой. Его достоинствами являются колоссальный период (219937−1), равномерное распределение в 623 измерениях (линейный конгруэнтный метод даёт более или менее равномерное распределение максимум в 5 измерениях), быстрая генерация случайных чисел (в 2-3 раза быстрее, чем стандартные ГПСЧ, использующие линейный конгруэнтный метод). Однако существуют алгоритмы, распознающие последовательность, порождаемую вихрем Мерсенна, как неслучайную.

Генератор псевдослучайных чисел включён в состав многих современных процессоров, например, RdRand входит в набор инструкций IA-32.[6]

Разновидностью ГПСЧ являются ГПСБ (PRBG) — генераторы псевдо-случайных бит, а также различных поточных шифров.

Список генераторов псевдослучайных чисел

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

Алгоритм Авторы Ссылки Описание
Mid-Square Jhon von Neumman 1946 [7] ГПСЧ, который считается низкокачественным но имеет большое историческое значение, поскольку является одним из первых алгоритмов.
Lehmer генератор / Линейный конгруэнтный метод D. H. Lehmer 1951 [8] Также известен как метод мультипликативных линейных конгруэнций и имеет большое влияние в этой области исследований. Он также известен как линейный конгруэнтный метод, основа которого со временем усовершенствовалась.
Генератор Фибоначчи с запаздыванием G. J. Mitchell; D. P. Moore 1958 [9] Очень влиятельный алгоритм в области изучения процессов генерации случайных чисел, вдохновивший других последующих великих авторов, таких как G. Marsaglia создатель теста на качество случайных чисел под названием "Diehard", например.
Регистр сдвига с линейной обратной связью (LFSR) / Генератор Tausworthe R. C. Tausworthe 1965 [10] Генератор, конструкция которого повлияла на многие другие последующие ГПСЧ. Поэтому очень исторически важен. Также известен как генератор Таusworthe.
Wichmann & Hill генератор B. A. Wichmann; D. I. Hill 1982 [11] Комбинация из трех небольших LCG, подходящих для 16-битных процессоров. Широко используется во многих программах, например, он использовался в Excel 2003 и некоторых более поздних версиях для функции RAND в Excel и был генератором по умолчанию в языке Python до версии 2.2.
Rule 30 Вольфрам, Стивен 1983 [12] Генератор на основе клеточных автоматов.
Генератор Blum-Blum-Shub Блюм, Мануэль; L. Blum; M. Shub 1986 [13] Считается одним из самых безопасных генераторов с криптографической точки зрения, в основном благодаря внедрению в его формулу исследований и концепций, взятых из теории чисел.  За этот алгоритм Блюм, Мануэль был удостоен премии Алана Тьюринга 1995 года.
Park-Miller генератор S. K. Park; K. W. Miller 1988 [14] Конкретная реализация генератора Лемера, широко используемая, поскольку она включена в C++ в виде функции minstd_rand0, начиная с C++11.
ACORN R. S. Wikramaratna 1989 [15] Его название происходит от английского акронима ACORN, который расшифровывается как ″Аддитивное конгруэнтное случайное число″.
MIXMAX G. K. Savvidy; N. G. Ter-Arutyunyan-Savvidy 1991 [16] Это генератор, принадлежащий к классу матричных конгруэнтных линейных генераторов, обобщение метода линейных конгруэнций. Логика семейства генераторов MIXMAX основана на результатах эргодической теории и классической механики.
Add-with-carry G. Marsaglia 1991 [17] Модификация генераторов Фибоначчи с запаздыванием.
Subtract-with-borrow G. Marsaglia; A. Zaman 1991 [17] Алгоритм, полученный на основе генераторов Фибоначчи с запаздыванием.
ISAAC R. J. Jenkins Jr. 1993 [18] Генератор криптографически защищенных криптографических данных (CSPRNG), разработанный Робертом Дж. Дженкинсом.
Вихрь Мерсенна (Mersenne Twister, MT M. Matsumoto; T. Nishimura 1996 [19] Это, вероятно, самый известный генератор в этом списке, в основном потому, что это алгоритм, реализованный в функции RAND языков программирования Python и R, в дополнение к его сильному присутствию в электронных играх, таких как Pro Evolution Soccer (PES).
Xorshift G. Marsaglia 2003 [20] Это очень быстрый подтип генераторов LFSR. Марсалья также предложил в качестве улучшения генератор xorwow, в котором выход генератора xorshift суммируется с последовательностью Вейля. Генератор xorwow является генератором по умолчанию в библиотеке CURAND интерфейса прикладного программирования nVidia CUDA для графических процессоров.
Алгоритм Fortuna Шнайер, Брюс; Нильс Фергюсон 2003 [21] Алгоритм считается криптографически безопасным. CSPRNG, хорошо известный тем, что был внедрен в системы и продукты Apple.
Well equidistributed long-period linear (WELL) F. Panneton; P. L'Ecuyer; M. Matsumoto 2006 [22] Алгоритм, известный как дополнение к Mersenne Twister (MT), намеренно стремящийся скрыть его слабые стороны.
Усовершенствованная система рандомизации (ARS) J. Salmon; M. Moraes; R. Dror; D. Shaw 2011 [23] Упрощенная версия блочного шифра AES, обеспечивающая очень высокую производительность на системе, поддерживающей AES-NI.
Threefry J. Salmon, M. Moraes, R. Dror and D. Shaw 2011 [23] Упрощенная версия блочного шифра Threefish, подходящая для реализации на GPU.
Philox (Филокс) J. Salmon, M. Moraes, R. Dror and D. Shaw 2011 [23] Упрощение и модификация блочного шифра Threefish с добавлением S-box.
Пермутированный конгруэнциальный генератор (PCG) M. E. O'Neill 2014 [24] Модель, полученная с помощью линейного конгруэнтного метода.
Генератор битов случайного цикла (RCB) R. Cookman 2016 [25] RCB описывается как генератор битовых шаблонов, созданный для преодоления некоторых недостатков Вихрь Мерсенна (MT) и ограничения короткого периода/длины бита генераторов сдвигов/модулей.
Middle Square Weyl Sequence RNG B. Widynski 2017 [26] Разновидность оригинального метода средних квадратов Джона фон Неймана.
Xoroshiro128+ D. Blackman; S. Vigna 2018 [27] Модификация генератора Xorshift Г. Марсальи, одного из самых быстрых генераторов на современных 64-битных процессорах. Родственными генераторами являются xoroshiro128**, xoshiro256+ и xoshiro256***.
64-bit MELG (MELG-64) S. Harase; T. Kimoto 2018 [28] Реализация 64-битных линейных генераторов F2 с первичным периодом Мерсенна.
Squares RNG B. Widynski 2020 [29] Основанная на счетчике версия Middle Square Weyl Sequence RNG. По конструкции похож на Philox, но работает значительно быстрее.
Itamaracá (Ita) D. H. Pereira 2021 [30] Известен как первый алгоритм PRNG, основанный на функции абсолютного значения. Itamaracá также является простой и быстрой моделью, которая генерирует апериодические последовательности случайных чисел.

Одноразовый блокнот

Альтернативным решением является создание набора из большого количества случайных чисел и опубликование его в некотором словаре, называемом «одноразовым блокнотом». Тем не менее, и такие наборы обеспечивают очень ограниченный источник чисел по сравнению с тем количеством, которое требуется приложениям сетевой безопасности. Хотя данные наборы действительно обеспечивают статистическую случайность, они недостаточно безопасны, так как злоумышленник может получить копию словаря.

Недостатки ГПСЧ

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

Любой ГПСЧ с ограниченными ресурсами рано или поздно зацикливается — начинает повторять одну и ту же последовательность чисел. Длина циклов ГПСЧ зависит от самого генератора и составляет около [math]\displaystyle{ 2^{\frac{n}{2}} }[/math], где [math]\displaystyle{ n }[/math] — размер внутреннего состояния в битах, хотя линейные конгруэнтные и РСЛОС-генераторы обладают максимальными циклами порядка [math]\displaystyle{ 2^n }[/math][31]. Если порождаемая последовательность ГПСЧ сходится к слишком коротким циклам, то такой ГПСЧ становится предсказуемым и непригодным для практических приложений.

Большинство простых арифметических генераторов хотя и обладают большой скоростью, но страдают от многих серьёзных недостатков:

  • Слишком короткий период/периоды.
  • Последовательные значения не являются независимыми.
  • Некоторые биты «менее случайны», чем другие.
  • Неравномерное одномерное распределение.
  • Обратимость.

В частности, алгоритм RANDU, десятилетиями использовавшийся на мейнфреймах, оказался очень плохим[32][33], что вызвало сомнения в достоверности результатов многих исследований, использовавших этот алгоритм.

ГПСЧ с источником энтропии или ГСЧ

Наравне с существующей необходимостью генерировать легко воспроизводимые последовательности случайных чисел, также существует необходимость генерировать совершенно непредсказуемые или попросту абсолютно случайные числа. Такие генераторы называются генераторами случайных чисел (ГСЧ — англ. random number generator, RNG). Так как такие генераторы чаще всего применяются для генерации уникальных симметричных и асимметричных ключей для шифрования, они чаще всего строятся из комбинации криптостойкого ГПСЧ и внешнего источника энтропии (и именно такую комбинацию теперь и принято понимать под ГСЧ).

Почти все крупные производители микрочипов поставляют аппаратные ГСЧ с различными источниками энтропии, используя различные методы для их очистки от неизбежной предсказуемости. Однако на данный момент скорость сбора случайных чисел всеми существующими микрочипами (несколько тысяч бит в секунду) не соответствует быстродействию современных процессоров.

В современных исследованиях осуществляются попытки использования измерения физических свойств объектов (например, температуры) или даже квантовых флуктуаций вакуума в качестве источника энтропии для ГСЧ.[34]

В персональных компьютерах авторы программных ГСЧ используют гораздо более быстрые источники энтропии, такие, как шум звуковой карты или счётчик тактов процессора. Сбор энтропии являлся наиболее уязвимым местом ГСЧ. Эта проблема до сих пор полностью не разрешена во многих устройствах (например, смарт-картах), которые таким образом остаются уязвимыми.[35] Многие ГСЧ используют традиционные испытанные, хотя и медленные, методы сбора энтропии вроде измерения реакции пользователя (движение мыши и т. п.), как, например, в PGP и Yarrow[36], или взаимодействия между потоками, как, например, в Java SecureRandom.

Пример простейшего ГСЧ с источником энтропии

Если в качестве источника энтропии использовать текущее время, то для получения целого числа от 0 до N достаточно вычислить остаток от деления текущего времени в миллисекундах на число N+1. Недостатком этого ГСЧ является то, что в течение одной миллисекунды он выдаёт одно и то же число.

Примеры ГСЧ и источников энтропии

Источник энтропии ГПСЧ Достоинства Недостатки
/dev/random в UNIX/Linux Счётчик тактов процессора, однако собирается только во время аппаратных прерываний РСЛОС, с хешированием выхода через SHA-1 Есть во всех Unix, надёжный источник энтропии Очень долго «нагревается», может надолго «застревать», либо работает как ГПСЧ (/dev/urandom)
Yarrow от Брюса Шнайера[36] Традиционные методы AES-256 и SHA-1 маленького внутреннего состояния Гибкий криптостойкий дизайн Медленный
Microsoft CryptoAPI Текущее время, размер жёсткого диска, размер свободной памяти, номер процесса и NETBIOS-имя компьютера MD5-хеш внутреннего состояния размером в 128 бит Встроен в Windows, не «застревает» Сильно зависит от используемого криптопровайдера (CSP).
Java SecureRandom Взаимодействие между потоками SHA-1-хеш внутреннего состояния (1024 бит) Большое внутреннее состояние Медленный сбор энтропии
RdRand от intel[37] Шумы токов Построение ПСЧ на основе «случайного» битового считывания значений от токов[37] Очень быстр, не «застревает» Оригинальная разработка, свойства приведены только по утверждению разработчиков.

ГПСЧ в криптографии

Одним из критериев того, что ГПСЧ криптографически стойкий, является невозможность отличить выходные значения ГПСЧ от независимой равномерно распределенной на промежутке [math]\displaystyle{ \mathcal{U}=(0,1) }[/math] случайной последовательности. Пусть существует семейство ГПСЧ [math]\displaystyle{ {\xi_{k} = (\mathcal{S_{k}}, \mu_{k}, f_{k}, \mathcal{U_{k}}, g_{k}), k = 1, 2, ...} }[/math], где мощность множества [math]\displaystyle{ \mathcal{S_{k}} }[/math] равно [math]\displaystyle{ 2^k }[/math]. Как было указано выше, [math]\displaystyle{ \mathcal{S} }[/math] — это конечный набор состояний, [math]\displaystyle{ \mu }[/math] — вероятностное распределение в пространстве состояний [math]\displaystyle{ \mathcal{S} }[/math], используемое для выбора начального состояния [math]\displaystyle{ \mathcal{s_{0}} }[/math](англ. seed), [math]\displaystyle{ f:\mathcal{S}\rightarrow \mathcal{S} }[/math] — функция перехода, [math]\displaystyle{ \mathcal{U} }[/math] — пространство выходных значений, [math]\displaystyle{ g:\mathcal{S}\rightarrow \mathcal{U} }[/math]. Обычно [math]\displaystyle{ \mathcal{U} = (0,1) }[/math], а состояние генератора задается рекуррентной формулой [math]\displaystyle{ s_{i} = f \ (s_{i-1}) }[/math] для [math]\displaystyle{ i \geq 1 }[/math]. Выходное значение генератора [math]\displaystyle{ u_{i} = g \ (s_{i}) \in \mathcal{U} }[/math]; [math]\displaystyle{ u_{0}, \ u_{1}, \ u_{2} \ ... }[/math] — последовательность псевдослучайных чисел. Предположим, что функции перехода [math]\displaystyle{ f }[/math] и выхода [math]\displaystyle{ g }[/math] могут быть вычислены за полиномиальное, степени [math]\displaystyle{ k }[/math], время. Пусть [math]\displaystyle{ \mathcal{T} }[/math] — класс статистических тестов, которые пытаются за полиномиальное, степени [math]\displaystyle{ k }[/math], время отличить выходные значения ГПСЧ от независимой равномерно распределенной на промежутке [math]\displaystyle{ \mathcal{U}=(0,1) }[/math] случайной последовательности. Семейство ГПСЧ [math]\displaystyle{ \xi_{k} }[/math] называется хорошим с точки зрения полиномиального времени, если найдется [math]\displaystyle{ \epsilon \gt 0 }[/math] такая, что для всех [math]\displaystyle{ k }[/math] никакой из тестов [math]\displaystyle{ \mathcal{T} }[/math] не может отличить выходные значения ГПСЧ от независимой равномерно распределенной на промежутке [math]\displaystyle{ \mathcal{U}=(0,1) }[/math] случайной последовательности с вероятностью [math]\displaystyle{ 1/2 + e^{-k\epsilon} }[/math].[3]

Криптографические приложения используют для генерации случайных чисел детерминированные алгоритмы, следовательно, генерируют последовательность чисел, которая теоретически не может быть статистически случайной. В то же время, если выбрать хороший алгоритм, полученная численная последовательность — псевдослучайных чисел — будет проходить большинство тестов на случайность. Одной из характеристик такой последовательности является большой период повторения.[3]

Примерами известных криптостойких ГПСЧ являются RC4[31], ISAAC[38], SEAL[39], SNOW[40], совсем медленный теоретический алгоритм Блюм — Блюма — Шуба[31], а также счётчики с криптографическими хеш-функциями или криптостойкими блочными шифрами вместо функции вывода[31].

Также к криптографически стойким шифрам относятся генераторы с несколькими регистрами сдвига, генераторы с нелинейными преобразованиями, мажоритарные генераторы шифрования A5/x.[31]

Примеры криптостойких ГПСЧ

Циклическое шифрование

Происходит шифрование случайных чисел генератора с помощью различных секретных ключей [math]\displaystyle{ X_{i} }[/math], полученных на каждой стадии. Счётчик с большим периодом [math]\displaystyle{ N }[/math] используется в качестве входа в шифрующее устройство. При использовании 56-битного ключа DES может использоваться счётчик с периодом [math]\displaystyle{ 2^{56} }[/math].

  1. В момент инициализации генерируется секретный ключ [math]\displaystyle{ K }[/math] и константа [math]\displaystyle{ C }[/math]. [math]\displaystyle{ K }[/math] должен быть случайным и используется только для данного генератора.
  2. На каждой стадии происходит следующее:
[math]\displaystyle{ X_{i} = E_{K}(C) }[/math]
[math]\displaystyle{ C=C+1 }[/math]

Псевдослучайная последовательность, полученная по данной схеме, имеет полный период: каждое выходное значение [math]\displaystyle{ X_{0} }[/math], [math]\displaystyle{ X_{1} }[/math], … [math]\displaystyle{ X_{N-1} }[/math] основано на разных значениях счётчика, поэтому [math]\displaystyle{ X_{0} \neq X_{1} \neq ... \neq X_{N-1} }[/math]. Так как ключ [math]\displaystyle{ K }[/math] является секретным, то любой секретный ключ [math]\displaystyle{ X_{i} }[/math] не зависит от знания одного или более предыдущих секретных ключей. Для увеличения криптостойкости алгоритма необходимо на каждом шаге шифровать случайное число [math]\displaystyle{ R_{i} }[/math] с ГСЧ — [math]\displaystyle{ X_{i} = E_{K}(R_{i}) }[/math].[41]

  • [math]\displaystyle{ K }[/math] — ключ, используемый на каждой стадии.
  • [math]\displaystyle{ E_{K} }[/math] — функция шифрования ключом [math]\displaystyle{ K }[/math].
  • [math]\displaystyle{ R_{i} }[/math] — случайное число с ГСЧ.

ANSI X9.17

ГПСЧ из стандарта ANSI X9.17 используется во многих приложениях финансовой безопасности и PGP. В основе этого ГПСЧ лежит тройной DES. Генератор ANSI X9.17 состоит из следующих частей:

  1. В момент инициализации генерируется секретный ключ [math]\displaystyle{ K }[/math]. Он должен быть случайным и используется только для данного генератора.
  2. На каждой стадии происходит следующее:
[math]\displaystyle{ T_{i} = E_{K}(D_{i}) }[/math]
[math]\displaystyle{ R_{i} = E_{K}(T_{i}\oplus V_{i}) }[/math]
[math]\displaystyle{ V_{i+1} = E_{K}(T_{i}\oplus R_{i}) }[/math]
  • [math]\displaystyle{ D_{i} }[/math] — значение даты и времени на начало [math]\displaystyle{ i }[/math]-ой стадии генерации.
  • [math]\displaystyle{ V_{i} }[/math] — начальное значение для [math]\displaystyle{ i }[/math]-ой стадии генерации.
  • [math]\displaystyle{ R_{i} }[/math] — псевдослучайное число, созданное на [math]\displaystyle{ i }[/math]-ой стадии генерации.
  • [math]\displaystyle{ K }[/math] — ключ, используемый на каждой стадии.
  • [math]\displaystyle{ E_{K} }[/math] — функция шифрования ключом [math]\displaystyle{ K }[/math].

Входными случайными значениями являются [math]\displaystyle{ D_{i} }[/math] и [math]\displaystyle{ V_{i} }[/math]. [math]\displaystyle{ R_{i} }[/math] — выходное значение. Вычисление [math]\displaystyle{ V_{i+1} }[/math] из [math]\displaystyle{ R_{i} }[/math] без знания [math]\displaystyle{ K }[/math] не является возможным за разумное время, и, следовательно, следующее псевдослучайное значение [math]\displaystyle{ R_{i+1} }[/math], так как для получения [math]\displaystyle{ V_{i+1} }[/math] дополнительно выполняются три операции шифрования.[42]

Аппаратные ГПСЧ

Кроме устаревших, хорошо известных РСЛОС-генераторов, широко применявшихся в качестве аппаратных ГПСЧ в XX веке, очень мало известно о современных аппаратных ГПСЧ, так как большинство из них разработано для военных целей или запатентованы и держатся в секрете. Аппаратно реализуемые РСЛОС-генераторы Toyocrypt и LILI-128, были взломаны с помощью алгебраических атак[43][44].

В настоящее время известно о применении аппаратных ГПСЧ, реализуемых на основе маломощных шумов в электросхемах.[45]

Применение ГПСЧ в лотереях

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

Попытки создать генератор случайных чисел относятся к 3500 году до н. э. и связаны с древнеегипетской настольной игрой Сенет. В Сенете два игрока играют за две стороны. Ходы определяются с помощью 4 плоских палочек, что и может считаться генератором случайных чисел того времени. Бросают все четыре палочки сразу. Подсчёт очков происходит следующим образом: 1 палочка упала белой стороной вверх — 1 очко и дополнительный бросок; 2 — 2 очка; 3 — 3 очка, 4 — 4 и дополнительный бросок. Одна из сторон палочки чёрная и, если все четыре палочки падали чёрной стороной вверх — это максимальный результат — 5 очков и дополнительный бросок.

Известный генератор случайных чисел ERNIE применялся на протяжении многих лет для определения выигрышных номеров британской лотереи.

Основные требования к программному обеспечению и оборудованию, используемому для проведения розыгрышей в Российской Федерации, устанавливаются Федеральным законом от 11.11.2003 № 138-ФЗ «О лотереях»:

  • Технические характеристики лотерейного оборудования должны обеспечивать случайность распределения выигрышей при розыгрыше призового фонда тиражных лотерей.
  • Не должны использоваться процедуры, реализующие алгоритмы, которые позволяли бы предопределять результат розыгрыша призового фонда до начала такого розыгрыша.
  • Лотерейное оборудование, используемое при проведении тиражной лотереи, должно обеспечивать защиту информации от утраты, хищения, искажения, несанкционированных действий по её уничтожению, модификации, копированию и иных подобных действий и несанкционированного доступа по сети передачи данных.[46]

В российских государственных лотереях («Гослото „5 из 36“», «Гослото „6 из 36“», «Гослото „6 из 45“», «Гослото „7 из 49“», «Гослото „4 из 20“», «Спортлото „6 из 49“»)[47] для определения победителей используются самозаряжающиеся лототроны. Трансляция розыгрышей ведется в прямом эфире.[48]

В российских государственных лотереях («Рапидо», «Кено-Спортлото», «Топ-3», «12/24», «Всё по сто») для определения победителей используется генератор случайных чисел — аппаратно-программный комплекс, сертифицированный АНО «МИЦ» и отвечающий рекомендациям ФГУП ВНИИМС. Аппарат формирует непрерывный поток случайных шумов, которые преобразуются в числа. В заданный момент времени из потока выхватываются текущие значения, которые и являются выигрышной лотерейной комбинацией.[49]

В 2015 году бывшему директору по безопасности US Multi-State Lottery Association после выигрыша в 16.5 млн долларов, имевшему доступ к программному обеспечению, используемому при розыгрышах лотерей, было предъявлено обвинение в использовании специальных алгоритмов, позволяющих определять выигрышную комбинацию лотереи в течение нескольких дней в году.[50]

См. также

Примечания

  1. N.G. Bardis, A.P. Markovskyi, N. Doukas, N. V. Karadimas. True Random Number Generation Based on Environmental Noise Measurements for Military Applications // Proceedings of the 8th WSEAS International Conference on SIGNAL PROCESSING, ROBOTICS and AUTOMATION. — 2009. — С. 68—73. — ISBN 978-960-474-054-3. — ISSN 1790-5117. Архивировано 30 августа 2017 года.
  2. Random.org. Дата обращения: 19 ноября 2017. Архивировано 24 февраля 2011 года.
  3. 3,0 3,1 3,2 3,3 3,4 3,5 L’Ecuyer, Pierre. Random Number Generation // Springer Handbooks of Computational Statistics : Глава. — 2007. — С. 93—137. — doi:10.1002/9780470172445.ch4. Архивировано 1 декабря 2017 года.
  4. Von Neumann, John. Various techniques used in connection with random digits // National Bureau of Standards Applied Mathematics Series. — 1951. — № 12. — С. 36—38. Архивировано 6 ноября 2020 года.
  5. Lehmer, D.H. Mathematical Methods in Large-Scale Computing Units // Ann, Comput Lab. Harvard Univ.. — 1951. — Vol. 26. — С. 141—146. (недоступная ссылка)
  6. Intel Digital Random Number Generator (DRNG): Software Implementation Guide, Revision 1.1 (PDF). Intel Corporation (7 августа 2012). Дата обращения: 25 ноября 2012. Архивировано 18 мая 2013 года.
  7. National Bureau of Standards. Annual report 1951 National Bureau of Standards.
  8. J. H. Curtiss. A Symposium of Large Scale Digital Calculating Machinery // Mathematical Tables and Other Aids to Computation. — 1947-04. — Т. 2, вып. 18. — С. 229. — doi:10.2307/2002294. Архивировано 11 мая 2022 года.
  9. J. W. Wrench. Table errata: The art of computer programming, Vol. 2: Seminumerical algorithms (Addison-Wesley, Reading, Mass., 1969) by Donald E. Knuth (англ.) // Mathematics of Computation. — 1970. — Vol. 24, iss. 110. — P. 504. — ISSN 1088-6842 0025-5718, 1088-6842. — doi:10.1090/S0025-5718-1970-0400642-2.
  10. Robert C. Tausworthe. Random numbers generated by linear recurrence modulo two (англ.) // Mathematics of Computation. — 1965. — Vol. 19, iss. 90. — P. 201–209. — ISSN 1088-6842 0025-5718, 1088-6842. — doi:10.1090/S0025-5718-1965-0184406-1.
  11. B. A. Wichmann, I. D. Hill. Algorithm AS 183: An Efficient and Portable Pseudo-Random Number Generator // Journal of the Royal Statistical Society. Series C (Applied Statistics). — 1982. — Т. 31, вып. 2. — С. 188–190. — ISSN 0035-9254. — doi:10.2307/2347988. Архивировано 11 мая 2022 года.
  12. Stephen Wolfram. Statistical mechanics of cellular automata // Reviews of Modern Physics. — 1983-07-01. — Т. 55, вып. 3. — С. 601–644. — doi:10.1103/RevModPhys.55.601.
  13. L. Blum, M. Blum, M. Shub. A Simple Unpredictable Pseudo-Random Number Generator // SIAM Journal on Computing. — 1986-05-01. — Т. 15, вып. 2. — С. 364–383. — ISSN 0097-5397. — doi:10.1137/0215025. Архивировано 27 апреля 2022 года.
  14. S. K. Park, K. W. Miller. Random number generators: good ones are hard to find // Communications of the ACM. — 1988-10-01. — Т. 31, вып. 10. — С. 1192–1201. — ISSN 0001-0782. — doi:10.1145/63039.63042.
  15. R.S. Wikramaratna. ACORN—A new method for generating sequences of uniformly distributed Pseudo-random Numbers // Journal of Computational Physics. — 1989-07. — Т. 83, вып. 1. — С. 16–31. — ISSN 0021-9991. — doi:10.1016/0021-9991(89)90221-0.
  16. G. K Savvidy, N. G Ter-Arutyunyan-Savvidy. On the Monte Carlo simulation of physical systems (англ.) // Journal of Computational Physics. — 1991-12-01. — Vol. 97, iss. 2. — P. 566–572. — ISSN 0021-9991. — doi:10.1016/0021-9991(91)90015-D. Архивировано 11 мая 2022 года.
  17. 17,0 17,1 George Marsaglia, Arif Zaman. A New Class of Random Number Generators // The Annals of Applied Probability. — 1991-08. — Т. 1, вып. 3. — С. 462–480. — ISSN 2168-8737 1050-5164, 2168-8737. — doi:10.1214/aoap/1177005878. Архивировано 19 апреля 2022 года.
  18. ISAAC, a fast cryptographic random number generator. www.burtleburtle.net. Дата обращения: 17 мая 2022.
  19. Makoto Matsumoto, Takuji Nishimura. Mersenne twister: a 623-dimensionally equidistributed uniform pseudo-random number generator // ACM Transactions on Modeling and Computer Simulation. — 1998-01-01. — Т. 8, вып. 1. — С. 3–30. — ISSN 1049-3301. — doi:10.1145/272991.272995.
  20. George Marsaglia. Xorshift RNGs (англ.) // Journal of Statistical Software. — 2003-07-04. — Vol. 8. — P. 1–6. — ISSN 1548-7660. — doi:10.18637/jss.v008.i14.
  21. Источники книг — Википедия. ru.wikipedia.org. Дата обращения: 17 мая 2022. Архивировано 24 апреля 2022 года.
  22. François Panneton, Pierre L'Ecuyer, Makoto Matsumoto. Improved long-period generators based on linear recurrences modulo 2 // ACM Transactions on Mathematical Software. — 2006-03-01. — Т. 32, вып. 1. — С. 1–16. — ISSN 0098-3500. — doi:10.1145/1132973.1132974.
  23. 23,0 23,1 23,2 John K. Salmon, Mark A. Moraes, Ron O. Dror, David E. Shaw. Parallel random numbers: as easy as 1, 2, 3 // Proceedings of 2011 International Conference for High Performance Computing, Networking, Storage and Analysis. — New York, NY, USA: Association for Computing Machinery, 2011-11-12. — С. 1–12. — ISBN 978-1-4503-0771-0. — doi:10.1145/2063384.2063405.
  24. B.G. Sileshi, C. Ferrer, J. Oliver. Accelerating hardware Gaussian random number generation using Ziggurat and CORDIC algorithms // 2014 IEEE SENSORS. — 2014-11. — С. 2122–2125. — doi:10.1109/ICSENS.2014.6985457. Архивировано 17 мая 2022 года.
  25. Random Bit Generator // SpringerReference. — Berlin/Heidelberg: Springer-Verlag.
  26. Bernard Widynski. Middle-Square Weyl Sequence RNG // arXiv:1704.00358 [cs]. — 2022-03-20. Архивировано 17 мая 2022 года.
  27. David Blackman, Sebastiano Vigna. Scrambled Linear Pseudorandom Number Generators // arXiv:1805.01407 [cs]. — 2022-03-28. Архивировано 11 мая 2022 года.
  28. Shin Harase, Takamitsu Kimoto. Implementing 64-bit Maximally Equidistributed F2-Linear Generators with Mersenne Prime Period // ACM Transactions on Mathematical Software. — 2018-01-03. — Т. 44, вып. 3. — С. 30:1–30:11. — ISSN 0098-3500. — doi:10.1145/3159444.
  29. Bernard Widynski. Squares: A Fast Counter-Based RNG // arXiv:2004.06278 [cs]. — 2022-03-13. Архивировано 11 мая 2022 года.
  30. Daniel Henrique Pereira. Itamaracá: A Novel Simple Way to Generate Pseudo-random Numbers (англ.). — 2022-01-25. — doi:10.33774/coe-2022-zsw6t. Архивировано 27 апреля 2022 года.
  31. 31,0 31,1 31,2 31,3 31,4 Габидулин Э. М., Кшевецкий А. С., Колыбельников А. И., Владимиров С. М. Защита информации. Учебное пособие. — С. 100—113. Архивная копия от 24 ноября 2020 на Wayback Machine
  32. Дональд Кнут. Глава 3.3. Спектральный критерий // Искусство программирования. Указ. соч. — С. 129—130.
  33. William H. Press, Saul A. Teukolsky, William T. Vetterling, Brian P. Flannery. Numerical Recipes in C: The Art of Scientific Computing. — 2nd ed. — Cambridge University Press, 1992. — P. 277. — ISBN 0-521-43108-5.
  34. Из квантового вакуума получили случайные числа. Дата обращения: 18 апреля 2012. Архивировано 19 апреля 2012 года.
  35. Jovan Dj. Goli ́c. Cryptanalytic Attacks on MIFARE Classic Protocol // Topics in Cryptology – CT-RSA 2013. — Springer, Berlin, Heidelberg, 2013. — № 7779. — С. 239—259. — doi:10.1007/978-3-642-36095-4_16.
  36. 36,0 36,1 Yarrow. Дата обращения: 10 сентября 2004. Архивировано 8 ноября 2012 года.
  37. 37,0 37,1 Intel DRNG Software Implementation Guide. Intel. Дата обращения: 8 декабря 2017. Архивировано 21 апреля 2016 года.
  38. J.-P. Aumasson. On the pseudo-random generator ISAAC // Cryptology ePrint Archive. — 2006. Архивировано 8 сентября 2016 года.
  39. H. Chen, K. Laine, R. Player. [https://eprint.iacr.org/2017/224.pdf Simple Encrypted Arithmetic Library - SEAL v2.1] // Cryptology ePrint Archive. — 2017. Архивировано 10 июля 2017 года.
  40. A. Kircanski and A. M. Youssef. [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.301.2615&rep=rep1&type=pdf On the Sliding Property of SNOW 3G and SNOW 2.0] // Information Security, IET. — 2010. — № 5(4). — С. 199—206. Архивировано 16 декабря 2017 года.
  41. Лапонина О. Р. Алгоритмы симметричного шифрования. НОУ ИНТУИТ. Дата обращения: 8 декабря 2017. Архивировано 9 декабря 2017 года.
  42. Kelsey J., Schneier B., Wagner D., Hall C. Cryptanalytic Attacks on Pseudorandom Number Generators // Fast Software Encryption. FSE 1998. Lecture Notes in Computer Science. — Springer, Berlin, Heidelberg, 1998. — Vol. 1372. — doi:10.1007/3-540-69710-1_12. Архивировано 7 декабря 2017 года.
  43. N. T. Courtois. Higher Order Correlation Attacks, XL Algorithm and Cryptanalysis of Toyocrypt // Cryptology ePrint Archive. — 2002. Архивировано 29 марта 2017 года.
  44. Ed Dawson, Andrew Clark, J Golic, W Millan, L Penna. The LILI-128 Keystream Generator. — 2000-12-13. Архивировано 16 декабря 2017 года.
  45. C. S. Petrie, J. A. Connelly. A noise-based IC random number generator for applications in cryptography // IEEE Transactions on Circuits and Systems I: Fundamental Theory and Applications. — May 2000. — Vol. 47, № 5. — С. 615–621. — ISSN 1057-7122. — doi:10.1109/81.847868.
  46. Статья 12.1. Требования к лотерейному оборудованию и лотерейным терминалам. Дата обращения: 6 декабря 2017. Архивировано 6 декабря 2017 года.
  47. Ответы на вопросы о «Столото». Сто Лото. Дата обращения: 6 декабря 2017. Архивировано 6 декабря 2017 года.
  48. Трансляции розыгрышей государственных лотерей. Сто Лото. Дата обращения: 6 декабря 2017. Архивировано 6 декабря 2017 года.
  49. Генератор случайных чисел. Сто Лото. Дата обращения: 6 декабря 2017. Архивировано 6 декабря 2017 года.
  50. Man hacked random-number generator to rig lotteries, investigators say, The Guardian. Архивировано 23 декабря 2017 года. Дата обращения 6 декабря 2017.

Литература

  • Дональд Э. Кнут. Глава 3. Случайные числа // Искусство программирования = The Art of Computer Programming. — 3-е изд. — М.: Вильямс, 2000. — Т. 2. Получисленные алгоритмы. — 832 с. — 7000 экз. — ISBN 5-8459-0081-6 (рус.) ISBN 0-201-89684-2 (англ.).
  • Кельтон В., Лоу А. Имитационное моделирование. Классика CS. — 3-е изд.. — СПб.: Питер, 2004. — С. 465, 466. — 487 с. — ISBN 0070592926. — ISBN 5-94723-981-7.
  • L’Ecuyer, Pierre. Random Number Generation // Springer Handbooks of Computational Statistics : Глава. — 2007. — С. 93—137. — doi:10.1002/9780470172445.ch4.

Ссылки