Предположим, у меня есть программа, которой нужен RNG.
Если бы я запускал произвольные операции и проверял ∆t, необходимое для выполнения указанных операций, я мог бы сгенерировать случайные числа из этого
Например:
double start = device.time();
for(int i=0;i<100;i++);//assume compiler doesn't optimize this away
double end = device.time();
double dt = end-start;
dt будет более или менее случайным на основе многих переменных на устройстве, таких как уровень заряда батареи, возраст транзистора, комнатная температура, другие запущенные процессы и т. Д. c.
Теперь предположим, что я продолжаю генерировать dt
s и умножаю их вместе как I go, сотни раз, тысячи раз, миллионы раз, в конце концов у меня останется очень произвольное число, основанное на значениях, которые были больше или менее случайным образом рассчитывается при тестировании производительности оборудования.
Каждый раз, когда я умножаю эти dt
вместе, возможные выходы возрастают экспоненциально, поэтому определение возможных выходов становится, возможно, невыполнимой задачей после миллионов итераций этого, даже если каждое отдельное dt
значение будет в аналогичном диапазоне.
Тогда возникает мысль: если у вас очень последовательное устройство, вы можете всегда иметь dt
в диапазоне, скажем, 0.000000011, 0.000000012, 0.000000013, 0.000000014
, затем последний выходное число, независимо от того, сколько раз я повторяю и умножаю, будет числом в форме 0.000000011^a * 0.000000012^b * 0.000000013^c * 0.000000014^d
, которое, вероятно, легко взломать.
Но затем я перехожу к хешированию, предположим, вместо того, чтобы умножать каждое dt, Я объединяю его в строковой форме с предыдущими значениями и ha sh их, поэтому каждый раз, когда я генерирую новый dt на основе случайных значений окружения производительности оборудования, я получаю sh. Затем, в конце, я перевариваю ha sh в любую нужную мне форму, теперь окончательный выходной номер не может быть записан в форме общей алгебры c.
Будут ли числа, сгенерированные в этой форме, криптографически безопасный?