/dev/random
использует временные интервалы ядра для добавления в пул энтропии. Количество энтропии в пуле отслеживается в переменной с именем entropy_count
.
Вот соответствующий фрагмент кода от random.c
. Это представляет время (в jiffies я думаю) между двумя последними прерываниями в переменной delta
и разницы в дельтах как delta2
.
delta = time - state->last_time;
state->last_time = time;
delta2 = delta - state->last_delta;
state->last_delta = delta;
if (delta < 0) delta = -delta;
if (delta2 < 0) delta2 = -delta2;
delta = MIN(delta, delta2) >> 1;
for (nbits = 0; delta; nbits++)
delta >>= 1;
r->entropy_count += nbits;
/* Prevent overflow */
if (r->entropy_count > POOLBITS)
r->entropy_count = POOLBITS;
Похоже, что оценка добавленной энтропии - это, по сути, минимальный уровень (не максимальный из-за начального сдвига битов перед циклом) логарифма дельты по основанию 2. Это имеет некоторый интуитивный смысл, хотя я не уверен, какие предположения понадобятся, чтобы сделать это формально правильным.
Итак, мой первый вопрос: «Какова причина этой оценки?»
Мой второй вопрос о delta = MIN(delta, delta2) ...
. Что это делает? Зачем брать минимум этой дельты и последний? Я не знаю, чего это должно достичь - возможно, это делает оценку лучше, может быть, просто более консервативной.
Редактировать: я нашел документ, в котором указана оценка , но в действительности он не дает аргументированного аргумента для нее (хотя в нем изложены некоторые неформальные условия, которым должен соответствовать оценщик).
Другие ресурсы, которые появились в комментариях:
- Википедия на
/dev/random
и/dev/urandom
- Бумага, которая пытается объяснить это (я скептически отношусь к этому, см. Комментарии)
- Сообщение в блоге
/dev/random
с комментариями от парня, который написал код выше. - Ответ secutity.SE о
/dev/random
пуле энтропии.
/dev/random
находится на шаткой основе - см. Подача / dev / случайный пул энтропии? , Я пингнул Томаса в надежде, что он ответит на твой вопрос.