/dev/random
використовує таймінги переривань ядра для додавання до пулу ентропії. Кількість ентропії в пулі відстежується в змінній, названій entropy_count
.
Ось відповідний фрагмент коду від random.c
. Він відображає час (в міркуваннях, що я думаю) між останніми двома перехопленнями змінної 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
знаходиться на хиткій основі - див. Пул Подача / Розробка / Випадкова ентропія? . Я поскакував Томаса в надії, що він відповість на ваше запитання.