Является ли генерация случайных чисел на основе производительности оборудования криптографически безопасной? - PullRequest
0 голосов
/ 29 мая 2020

Предположим, у меня есть программа, которой нужен 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.

Будут ли числа, сгенерированные в этой форме, криптографически безопасный?

Ответы [ 2 ]

2 голосов
/ 29 мая 2020

Использование часов потенциально может привести к утечке информации противнику. Также с помощью микрофона - злоумышленник, возможно, подбросил ошибку и слышит тот же сигнал. Лучше не полагаться на какой-то один источник, а комбинировать энтропийные входы из нескольких источников, как внешних по отношению к вашему компьютеру, так и внутренних. Обязательно используйте внутренние источники энтропии ОС, такие как dev / urandom, но также используйте и другие источники.

Возможно, стоит прочитать описание Fortuna CSPRNG для идей.

0 голосов
/ 29 мая 2020

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

Большинство ядер ОС будут собирать энтропию из таймингов в их собственных обработчиках прерываний, как часть источника для /dev/urandom, но если вы действительно хотите свернуть свою собственную, вместо того, чтобы запрашивать случайность у ОС, это возможно, если вы будете очень осторожны со своей функцией микширования. например, посмотрите, что ядро ​​Linux использует для добавления новых данных в свой пул энтропии. Он должен избегать "вреда" от источников, которые на самом деле не случайны в данной системе.

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

на основе многих переменных устройства, таких как ...

  • уровень заряда батареи : может быть эффект с двумя состояниями, например, ограничение макс. турбо, когда не используется питание A C и / или когда батарея разряжена.

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

  • комнатная температура : опять же, возможно только снижение максимальной тактовой частоты раньше. Если вы не потратите на это несколько секунд процессорного времени, это не повлияет даже на легкие ноутбуки. Настольные компьютеры обычно имеют достаточно охлаждения, чтобы поддерживать максимальную турбо-скорость на одном ядре неограниченное время, особенно для простого скалярного кода. (SIMD FMA вызовет намного больше тепла.)

  • запущены другие процессы : да, это и асинхронные c прерывания, которые случаются внутри ваших временных интервалов будет основным источником случайности.

Большинство факторов, влияющих на тактовую частоту, будут постоянно увеличиваться равномерно, коррелируя между выборками, а не больше энтропии. Тактовая частота меняется не так часто; после выхода на полную скорость для ваших тестовых циклов, ожидайте, что она останется постоянной в течение нескольких секунд.

...