Меню

Атомный генератор случайных чисел



Истинные случайные числа своими руками

Генераторы случайных чисел являются чрезвычайно важной составляющей многих алгоритмах, к примеру, алгоритмов шифрования или численных методов Монте-Карло. Как известно, компьютеры являются детерминированными, предсказуемыми машинами. Если написать программу и выполнить ее при тех же условиях миллион раз, то вы получите миллион одинаковых ответов. Такая природа компьютеров очень хорошо служила нам на протяжении большей части прошлого века, но, к сожалению, эта конструкция имеет фундаментальный недостаток: компьютеры не могут выполнять случайные операции. Несмотря на то, что те к числа, которые генерируют компьютеры, могут быть достаточно случайными на первый взгляд, все таки они являются “псевдо”-случайными. Это значит, что часто можно предсказать, какое число выдаст устройство.

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

Давайте попробуем разобраться как классический компьютер генерирует случайные числа, что такое квантовая случайность и как можно получить истинные случайные числа сегодня?

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

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

Например, в генераторе случайных чисел Math.random(), предоставляемый Javascript, используются сдвиги и реверсирования битовых представлений входных данных. Для того, чтобы эта функция выдавала разные результаты каждый раз, когда она запускается, нужно задействовать все время изменяющееся данные. По этой причине часто используются числовое представление текущей даты и времени, например, количество миллисекунд, прошедших с 1 января 1970 года, начала эпохи UNIX.

Используя такой алгоритм можно достичь очень убедительного генератора случайных чисел. Однако, если кто-то знает, как работает алгоритм, и может предсказать входные данные, то он может и предсказать случайные числа , выдаваемые этим генератором. Один из способов улучшить случайность этой системы — сделать входные данные более трудным для прогнозирования. Например, многие системы используют космическое микроволновое фоновое излучение (электромагнитные волны, оставшиеся после Большого Взрыва), поскольку никто не может предсказать, как этот фоновый шум будет вести себя в определенный момент времени.

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

Вероятность в квантовом мире

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

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

Эта интерпретация квантового мира, по понятным причинам, потрясла сообщество физиков в то время и обсуждается по сей день. Эйнштейн отказывался верить, что реальность управляется вероятностью, и говорил: «Я, во всяком случае, убежден, что он (Бог) не играет в кости”, в ответ Нильс Бор ответил: «Эйнштейн, не говори Богу, что делать.»

Читайте также:  Ваз 2114 после замены подшипников генератора пропала зарядка

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

Квантовые компьютеры

Классические компьютеры используют биты для представления информации. Бит может принимать значения 0 или 1 и представлен одним из двух значений постоянного напряжения внутри процессора компьютера. Квантовые компьютеры обычно представляют информацию таким же образом, используя 0 или 1, но физически они реализуют эти состояния, используя бинарные свойства субатомных частиц . Эти свойства могут быть спином электрона (спин вверх и спин вниз) или поляризацией фотона (горизонтальная и вертикальная поляризация) — любое из этих представлений может быть описано квантовой механикой, и может находиться в суперпозиции, то есть квантовый бит информации (кубит) может существовать в состояниях 0 и 1 одновременно. Чтобы получить результат вычисления, мы должны измерить квантовое состояние внутри компьютера и заставить эти частицы выбрать значение 0 или 1. Фактически, мы разрушаем суперпозицию и принуждаем ее к одному из этих двух возможных состояний, каждое из которых имеет равную вероятность возникновения — у нас есть 50% шанс измерения либо 1, либо 0.

Для того чтобы создать случайное число, определяемое истинной квантовой случайностью , все что нам нужно сделать это:

1. Инициализировать кубит, пусть он будет в состоянии 0.

2. Поместить кубит в суперпозицию, для этого можно использовать специальное преобразование ( преобразование Адамара ).

3. Произвести измерение и получить значение 0 или 1 с равной вероятностью.

Звучит сложно? Субатомные частицы, квантовый компьютер, кубиты. Наверное, у обычных людей не скоро появится ко всему этому доступ.

А вот и нет! Уже сейчас вы можете запрограммировать квантовый компьютер удаленно и получить истинный генератор случайных чисел. Как это сделать?

Программирование квантового компьютера

Удивительно, но некоторые компании сделали квантовые компьютеры доступными для всех через облачный сервис еще несколько лет назад. К примеру, IBM представил систему IBM Q Experience, которая дает доступ к двум 5-кубитным процессорам и двум 16-кубитным процессорам (а сейчас на подходе и 53-кубитный). После того, как пользователь создал бесплатную учетную запись, время на использование квантового компьютера выделяется с помощью кредитной системы. Вы можете спроектировать свою схему с помощью онлайн-редактора или с помощью кода и библиотеки Qiskit от IBM (о ней мы писали ранее ), и, когда ваша программа готова, она помещается в очередь и затем выполняется на настоящей квантовой машине .

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

1. Классический компьютер вычисляет, сколько случайных битов требуется для представления числа от 0 до 16. В этом случае требуется 4 бита, то есть мы можем использовать 5-кубитный квантовый процессор.

2. Пакет Qiskit создает ряд инструкций и отправляет их в IBM Q Experience для выполнения.

3. Ваши инструкции помещаются в очередь для запуска на квантовым процессоре IBM Q5 Tenerife . Далее квантовый компьютер выделяет 4 из 5 доступных кубитов для вашей задачи и применяет преобразование Адамара к этим 4 кубитам, вводя их в суперпозицию.

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

5. Измеренное состояние 0 или 1 затем отправляется обратно в IBM Q Experience и, затем, обратно к вам на компьютер.

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

Программа

Если вы хотите научиться управлять квантовым компьютером, то для построения генератора случайных чисел лучше использовать Qiskit: нужно будет написать код на Python (тут мы писали, почему стоит учить Python , если вы его еще не выучили), и протестировать его на квантовом процессоре. Для того, чтобы начать, необходимо создать бесплатную учетную запись в IBM Quantum Experience . Затем получить API и запустить программу:

Читайте также:  Генератор тракторный г306г ремонт

Источник

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

Введение

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

  • Генераторы сессий (PHPSESSID)
  • Генерация текста для капчи
  • Шифрование
  • Генерация соли для хранения паролей в необратимом виде
  • Генератор паролей
  • Порядок раздачи карт в интернет казино

Как отличить случайную последовательность чисел от неслучайной?

Пусть есть последовательность чисел: 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 . Является ли она случайной? Есть строгое определение для случайной величины. Случайная величина — это величина, которая принимает в результате опыта одно из множества значений, причём появление того или иного значения этой величины до её измерения нельзя точно предсказать. Но оно не помогает ответить на наш вопрос, так как нам не хватает информации для ответа. Теперь скажем, что данные числа получились набором одной из верхних строк клавиатуры. «Конечно не случайная» — воскликните Вы и тут же назовете следующие число и будете абсолютно правы. Последовательность будет случайной только если между символами, нету зависимости. Например, если бы данные символы появились в результате вытягивания бочонков в лото, то последовательность была бы случайной.

Чуть более сложный пример или число Пи


Последовательность цифры в числе Пи считается случайной. Пусть генератор основывается на выводе бит представления числа Пи, начиная с какой-то неизвестной точки. Такой генератор, возможно и пройдет «тест на следующий бит», так как ПИ, видимо, является случайной последовательностью. Однако этот подход не является критографически надежным — если криптоаналитик определит, какой бит числа Пи используется в данный момент, он сможет вычислить и все предшествующие и последующие биты.
Данный пример накладывает ещё одно ограничение на генераторы случайных чисел. Криптоаналитик не должен иметь возможности предсказать работу генератора случайных чисел.

Отличие генератора псевдослучайных чисел (ГПСЧ) от генератора случайных чисел (ГСЧ)

Источники энтропии используются для накопления энтропии с последующим получением из неё начального значения (initial value, seed), необходимого генераторам случайных чисел (ГСЧ) для формирования случайных чисел. ГПСЧ использует единственное начальное значение, откуда и следует его псевдослучайность, а ГСЧ всегда формирует случайное число, имея в начале высококачественную случайную величину, предоставленную различными источниками энтропии.
Энтропия – это мера беспорядка. Информационная энтропия — мера неопределённости или непредсказуемости информации.
Можно сказать, что ГСЧ = ГПСЧ + источник энтропии.

Уязвимости ГПСЧ

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

Линейный конгруэнтный ГПСЧ (LCPRNG)

Распространённый метод для генерации псевдослучайных чисел, не обладающий криптографической стойкостью. Линейный конгруэнтный метод заключается в вычислении членов линейной рекуррентной последовательности по модулю некоторого натурального числа m, задаваемой следующей формулой:

где a (multiplier), c (addend), m (mask) — некоторые целочисленные коэффициенты. Получаемая последовательность зависит от выбора стартового числа (seed) X0 и при разных его значениях получаются различные последовательности случайных чисел.

Для выбора коэффициентов имеются свойства позволяющие максимизировать длину периода(максимальная длина равна m), то есть момент, с которого генератор зациклится [1].

Пусть генератор выдал несколько случайных чисел X0, X1, X2, X3. Получается система уравнений

Решив эту систему, можно определить коэффициенты a, c, m. Как утверждает википедия [8], эта система имеет решение, но решить самостоятельно или найти решение не получилось. Буду очень признателен за любую помощь в этом направлении.

Предсказание результатов линейно-конгруэнтного метода

Основным алгоритмом предсказания чисел для линейно-конгруэнтного метода является Plumstead’s — алгоритм, реализацию, которого можно найти здесь [4](есть онлайн запуск) и здесь [5]. Описание алгоритма можно найти в [9].
Простая реализация конгруэнтного метода на Java.

Отправив 20 чисел на сайт [4], можно с большой вероятностью получить следующие. Чем больше чисел, тем больше вероятность.

Взлом встроенного генератора случайных чисел в Java

Многие языки программирования, например C(rand), C++(rand) и Java используют LСPRNG. Рассмотрим, как можно провести взлом на примере java.utils.Random. Зайдя в исходный код (jdk1.7) данного класса можно увидеть используемые константы

Метод java.utils.Randon.nextInt() выглядит следующим образом (здесь bits == 32)

Результатом является nextseed сдвинутый вправо на 48-32=16 бит. Данный метод называется truncated-bits, особенно неприятен при black-box, приходится добавлять ещё один цикл в brute-force. Взлом будет происходить методом грубой силы(brute-force).

Читайте также:  Ремонт генератора lancer 9 своими руками

Пусть мы знаем два подряд сгенерированных числа x1 и x2. Тогда необходимо перебрать 2^16 = 65536 вариантов oldseed и применять к x1 формулу:

до тех пор, пока она не станет равной x2. Код для brute-force может выглядеть так

Вывод данной программы будет примерно таким:

Несложно понять, что мы нашли не самый первый seed, а seed, используемый при генерации второго числа. Для нахождения первоначального seed необходимо провести несколько операций, которые Java использовала для преобразования seed, в обратном порядке.

И теперь в исходном коде заменим
crackingSeed.set(seed);
на
crackingSeed.set(getPreviousSeed(seed));

И всё, мы успешно взломали ГПСЧ в Java.

Взлом ГПСЧ Mersenne twister в PHP

Рассмотрим ещё один не криптостойкий алгоритм генерации псевдослучайных чисел Mersenne Twister. Основные преимущества алгоритма — это скорость генерации и огромный период 2^19937 − 1, На этот раз будем анализировать реализацию алгоритма mt_srand() и mt_rand() в исходном коде php версии 5.4.6.

Можно заметить, что php_mt_reload вызывается при инициализации и после вызова php_mt_rand 624 раза. Начнем взлом с конца, обратим трансформации в конце функции php_mt_rand(). Рассмотрим (s1 ^ (s1 >> 18)). В бинарном представление операция выглядит так:

10110111010111100111111001110010 s1
00000000000000000010110111010111100111111001110010 s1 >> 18
10110111010111100101001110100101 s1 ^ (s1 >> 18)
Видно, что первые 18 бит (выделены жирным) остались без изменений.
Напишем две функции для инвертирования битового сдвига и xor

Тогда код для инвертирования последних строк функции php_mt_rand() будет выглядеть так

Если у нас есть 624 последовательных числа сгенерированных Mersenne Twister, то применив этот алгоритм для этих последовательных чисел, мы получим полное состояние Mersenne Twister, и сможем легко определить каждое последующее значение, запустив php_mt_reload для известного набора значений.

Область для взлома

Если вы думаете, что уже нечего ломать, то Вы глубоко заблуждаетесь. Одним из интересных направлений является генератор случайных чисел Adobe Flash(Action Script 3.0). Его особенностью является закрытость исходного кода и отсутствие задания seed’а. Основной интерес к нему, это использование во многих онлайн-казино и онлайн-покере.
Есть много последовательностей чисел, начиная от курса доллара и заканчивая количеством времени проведенным в пробке каждый день. И найти закономерность в таких данных очень не простая задача.

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

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

Треугольное распределение

Приведем пример генерации случайной величины с треугольным распределением [7] на языке C99.

В данном случае мы берем случайную величину rand() и задаем ей распределение, исходя из функции треугольного распределения. Для параметров a = -40, b = 100, c = 50 график 10000000 измерений будет выглядеть так

Экспоненциальное распределение

Пусть требуется получить датчик экспоненциально распределенных случайных величин. В этом случае F(x) = 1 – exp(-lambda * x). Тогда из решения уравнения y = 1 – exp(-lambda * x) получаем x = -log(1-y)/lambda.
Можно заметить, что выражение под знаком логарифма в последней формуле имеет равномерное распределение на отрезке [0,1), что позволяет получать другую, но так же распределённую последовательность по формуле: x = -log(y)/lambda, где y есть случайная величина(rand()).

Тесты ГПСЧ

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

Одним из известных тестов является тест на следующий бит — тест, служащий для проверки генераторов псевдослучайных чисел на криптостойкость. Тест гласит, что не должно существовать полиномиального алгоритма, который, зная первые k битов случайной последовательности, сможет предсказать k+1 бит с вероятностью большей ½.

В теории криптографии отдельной проблемой является определение того, насколько последовательность чисел или бит, сгенерированных генератором, является случайной. Как правило, для этой цели используются различные статистические тесты, такие как DIEHARD или NIST. Эндрю Яо в 1982 году доказал, что генератор, прошедший «тест на следующий бит», пройдет и любые другие статистические тесты на случайность, выполнимые за полиномиальное время.
В интернете [10] можно пройти тесты DIEHARD и множество других, чтобы определить критостойкость алгоритма.

Источник