/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знаходиться на хиткій основі - див. Пул Подача / Розробка / Випадкова ентропія? . Я поскакував Томаса в надії, що він відповість на ваше запитання.