Ответ 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, передавая чаще.Суб >
² Технически, это так, но только в астрономическом масштабе.Суб >
³ Или, по крайней мере, с одним общим фактором, что так же плохо.