Каковы типичные средства, с помощью которых случайное число может быть сгенерировано во встроенной системе? Можете ли вы предложить преимущества и недостатки для каждого метода и/или некоторые факторы, которые могут заставить вас выбрать один метод над другим?
Каковы типичные средства, с помощью которых случайное число может быть сгенерировано во встроенной системе?
Ответ 1
Во-первых, вы должны задать фундаментальный вопрос: вам нужны непредсказуемые случайные числа?
Например, криптография требует непредсказуемых случайных чисел. То есть никто не должен угадать, что будет следующим случайным числом. Это исключает любой метод, который генерирует генератор случайных чисел из общих параметров, таких как время: вам нужен правильный источник энтропии.
Некоторые приложения могут работать с генератором случайных чисел без криптографического качества. Например, если вам необходимо обмениваться данными по Ethernet, вам нужен генератор случайных чисел для экспоненциального резервного копирования; статистической случайности достаточно для этого.
Непредсказуемый RNG
Вам нужен непредсказуемый RNG, когда противник может попытаться угадать ваши случайные числа и сделать что-то плохое на основе этого предположения. Например, если вы собираетесь генерировать криптографический ключ или использовать много других криптографических алгоритмов, вам нужен непредсказуемый RNG.
Непредсказуемый RNG состоит из двух частей: источника энтропии и генератора псевдослучайных чисел.
Источники энтропии
entropy источник непредсказуемости. Энтропия должна исходить из непредсказуемого источника или сочетания непредсказуемых источников. Источники не должны быть полностью непредсказуемыми, они не должны быть полностью предсказуемыми. Энтропия определяет количество непредсказуемости. Оценка энтропии затруднена; искать научные статьи или оценки специалистов по безопасности.
Существует три подхода к генерации энтропии.
-
Ваше устройство может содержать некоторое недетерминированное аппаратное обеспечение. Некоторые устройства включают специальный аппаратный RNG на основе физических явлений, таких как неустойчивые генераторы, тепловой шум и т.д. Некоторые устройства имеют датчики, которые захватывают несколько непредсказуемых значений, бит заказа световых или звуковых датчиков.
Остерегайтесь, что аппаратные RNG часто имеют точные условия использования. Большинство методов требуют некоторого времени после включения питания, прежде чем их выход будет действительно случайным. Часто факторы окружающей среды, такие как экстремальные температуры, могут влиять на случайность. Прочитайте примечания об использовании RNG очень осторожно. Для криптографических приложений обычно рекомендуется делать статистические тесты вывода HRNG и отказываться от работы, если эти тесты терпят неудачу.
Никогда не используйте аппаратный RNG напрямую. Выход редко бывает непредсказуемым - например, каждый бит может иметь вероятность 60% быть 1, или вероятность того, что два последовательных бита будут равными, может составлять всего 48%. Используйте аппаратный RNG для извлечения PRNG, как описано ниже.
-
Вы можете предварительно загрузить случайное семя во время изготовления и использовать его впоследствии. Энтропия не стирается, когда вы ее используете. 2. Если у вас достаточно энтропии для начала, у вас будет достаточно энтропии в течение всего срока службы вашего устройства. Опасность сдерживания энтропии заключается в том, что она должна оставаться конфиденциальной: если пул энтропии случайно просачивается, тост.
-
Если ваше устройство имеет подключение к доверенной третьей стороне (например, ваш сервер или мастер node в сети датчиков), он может загрузить энтропию из этого (через защищенный канал).
Генератор псевдослучайных чисел
A PRNG, также называемый детерминированным генератором случайных битов (DRBG), является детерминированным алгоритмом, который генерирует последовательность случайных чисел путем преобразования внутреннего состояния. Государство должно быть посеяно с достаточной энтропией, после чего PRNG может работать практически навсегда. Криптографические качества PRNG основаны на криптографических примитивах; всегда используйте проверенный алгоритм (желательно какой-то хорошо проверенный сторонний код, если он доступен).
PRNG необходимо засеять энтропией. Вы можете вводить энтропию один раз во время производства или при каждой загрузке или периодически или в любую комбинацию.
Энтропия после перезагрузки
Вам нужно позаботиться о том, чтобы устройство не загружалось дважды в одном и том же состоянии RNG: в противном случае наблюдатель может повторить ту же последовательность вызовов RNG после reset и будет знать выход RNG во второй раз. Это проблема для энтропии factory -инъекции (которая по определению всегда одна и та же), а также для энтропии, полученной из датчиков (которая требует времени для накопления).
Если возможно, сохраните состояние RNG в постоянном хранилище. Когда устройство загружается, прочитайте состояние RNG, примените к нему некоторое преобразование (например, генерируя одно случайное слово) и сохраните измененное состояние. После этого вы можете начать возвращать случайные числа в приложения и системные службы. Таким образом, устройство будет загружаться с другим состоянием RNG каждый раз.
Если это невозможно, вам нужно быть очень осторожным. Если ваше устройство имеет factory -инъекцию энтропии плюс надежные часы, вы можете смешать значение часов в состоянии RNG для достижения единства; однако, будьте осторожны, если ваше устройство теряет мощность, и часы перезапускаются с некоторого фиксированного источника (мигание двенадцать), вы будете в состоянии повторения.
Предсказуемое состояние RNG после reset или при первой загрузке является общей проблемой со встроенными устройствами (и с серверами). Например, исследование открытых ключей RSA показало, что многие из них были созданы с недостаточной энтропией, в результате чего многие устройства генерируют один и тот же ключ.
Статистический RNG
Если вы не можете получить криптографическое качество, вы можете вернуться к менее хорошему RNG. Вы должны знать, что некоторые приложения (включая много криптографии) будут невозможны.
Любой RNG опирается на структуру из двух частей: уникальное семя (т.е. источник энтропии) и детерминированный алгоритм, основанный на этом семени.
Если вы не можете собрать достаточно энтропии, по крайней мере, собрать как можно больше. В частности, убедитесь, что два устройства не запускаются из одного и того же состояния (этого обычно можно добиться путем смешивания серийного номера в семена RNG). Если это вообще возможно, уложите семя не повторять после reset.
Единственное оправдание использования криптографического DRBG заключается в том, что ваше устройство не имеет достаточной вычислительной мощности. В этом случае вы можете вернуться к более быстрому алгоритму, который позволяет наблюдателям угадывать некоторые цифры на основе предыдущего или будущего выхода RNG. Mersenne twister является популярным выбором , но с момента его изобретения были улучшения.
¹ <суб > Даже это спорно: с не крипто качества случайной потери мощности, другое устройство может привести к отказу в обслуживании, совместив свое время повторной передачи с вашим. Но есть другие способы вызвать DoS, передавая чаще.Суб >
² Технически, это так, но только в астрономическом масштабе.Суб >
³ Или, по крайней мере, с одним общим фактором, что так же плохо.
Ответ 2
Один из способов сделать это - создать псевдослучайную последовательность бит, просто последовательность нулей и единиц и прочитать нижние биты как число.
PRBS можно сгенерировать, выбирая биты из сдвигового регистра, выполняя некоторую логику на них и используя эту логику для создания следующего смещенного бита. Заселите регистр сдвига любым ненулевым числом. Там есть математика, которая сообщает вам, какие биты вам нужно использовать для генерации последовательности максимальной длины (т.е. 2 ^ N-1 номера для N-разрядного регистра сдвига). Существуют таблицы для 2-кратных, 3-кратных и 4-кратных реализаций. Вы можете найти их, если будете искать "последовательности регистров максимальной длины" или "регистр сдвига линейной обратной связи".
от: http://www.markharvey.info/fpga/lfsr/
HOROWITZ AND HILL дал большую часть главы об этом. Большая часть математики окружает природу PRBS, а не номер, который вы генерируете с помощью последовательности бит. Есть несколько статей о лучших способах получить номер из последовательности бит и улучшения корреляции, играя с маскировкой битов, которые вы используете для генерации случайного числа, например, Horan and Guinee, Correlation Analysis of Random Number Sequences о генерации псевдослучайных двоичных последовательностей, в Proc. IEEE ISOC ITW2005 по кодированию и сложности; редактор М. Дж. Диннин; сопредседатели У. Шпидель и Д. Тейлор; страницы 82-85
Преимущество заключалось бы в том, что это может быть достигнуто просто путем битбифтинга и простых операций с битовой логикой. Это сделает один лайнер. Другим преимуществом является то, что математика довольно хорошо понята. Недостатком является то, что это только псевдослучайное, а не случайное. Кроме того, я не знаю много о случайных числах, и могут быть лучшие способы сделать это, о которых я просто не знаю.
Сколько энергии вы потратите на это, будет зависеть от того, насколько случайным вам нужен номер. Если бы я запускал сайт для азартных игр и мне нужны случайные числа для создания сделок, я бы не стал зависеть от последовательностей псевдослучайных бит. В таких случаях я бы, вероятно, посмотрел на аналоговые шумовые технологии, может быть, на шум Джонсона вокруг большого гунского резистора или некоторый шум соединения на PN-соединении, усилить его и пробовать. Преимущества этого в том, что, если вы понимаете это правильно, у вас довольно хорошее случайное число. Недостатки заключаются в том, что иногда вам требуется псевдослучайное число, где вы можете точно воспроизвести последовательность, сохранив семя. Кроме того, это использует аппаратное обеспечение, за которое кто-то должен платить, а не линию или два кода, что дешево. Он также использует преобразование A/D, которое является еще одним периферийным для использования. Наконец, если вы сделаете это неправильно - скажите, сделайте ошибку, когда 60Hz заканчивается подавляющим вашим белым шумом - вы можете получить довольно паршивое случайное число.
Ответ 3
Каковы типичные средства, с помощью которых случайное число может быть сгенерировано во встроенной системе?
Джайлс косвенно заявил об этом: это зависит от использования.
Если вы используете генератор для моделирования симуляции, то все, что вам нужно, это равномерное распределение, а линейный конгруэнтный генератор (LCG) будет хорошо работайте.
Если вам нужен генератор secure, то это более сложная проблема. Я боюсь, что это означает быть безопасным, но от 10 000 футов подумайте "оберните его криптографическим преобразованием", например SHA-1/HMAC или SHA-512/HMAC. Существуют и другие способы, такие как выборка случайных событий, но они могут оказаться нежизнеспособными.
Когда вам нужны защищенные случайные числа, некоторые низкоуровневые устройства, как правило, трудно работать. См., Например, Mining Your Ps и Qs: обнаружение широко распространенных слабых клавиш в сетевых устройствах и Недостаток датчика трафика, который может привести к исправлению драйверов. И предостережение для пользователей Linux 3.0: ядро удалило пару энтропийных источников, поэтому истощение энтопы и голод, возможно, ухудшились. См. Соответствующие источники энтропии в LWN.
Если, у вас есть безопасный генератор, тогда ваша проблема станет получать хорошее семя (или семена со временем). Один из лучших методов, которые я видел в средах с ограниченными возможностями, - Хеджирование. Для виртуальных машин была предложена хеджирование, где программа могла создавать одну и ту же последовательность после VM reset.
Идея хеджирования состоит в том, чтобы извлечь случайность, предоставляемую вашим партнером, и использовать ее, чтобы обеспечить безопасную установку генератора. Например, в случае TLS есть client_random
и a server_random
. Если устройство является сервером, оно будет перемешиваться в client_random
. Если устройство является клиентом, оно перемещается в server_random
.
Вы можете найти две интересующие бумаги, которые относятся к хеджированию по адресу:
Использование client_random
и a server_random
согласуется с представлением Питера Гуттмана по теме: "смешивать каждый источник энтропии, в который вы можете попасть PRNG, включая менее совершенные" . Гутманн является автором Инженерной безопасности.
Хеджирование решает только часть проблемы. Вам все равно придется решать другие проблемы, например, как загружать пул энтропии, как восстанавливать пары системных ключей, когда пул находится в плохом состоянии, и как сохранить энтропию при перезагрузках, когда нет файловой системы.
Ответ 4
Хотя это может быть не самый сложный или звуковой метод, может быть интересно использовать внешние стимулы в качестве вашего семени для генерации случайных чисел. Рассмотрим использование аналогового входа с фотодиода или термистора. Даже случайный шум от плавающего штыря может дать некоторые интересные результаты.