/dev/random
usa i tempi delle interupts del kernel per aggiungere al pool di entropia. La quantità di entropia nel pool viene tracciata in una variabile denominata entropy_count
.
Ecco il frammento di codice pertinente da random.c
. Rappresenta il tempo (in jiffies credo) tra le ultime due interruzioni in variabile delta
e le differenze in delta come 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;
Sembra che la stima dell'entropia aggiunta sia essenzialmente il floor (non il ceil a causa del bitshift iniziale prima del loop) del logaritmo di base 2 del delta. Questo ha un senso intuitivo, anche se non sono sicuro di quali ipotesi sarebbero necessarie per renderlo formalmente corretto.
Quindi, la mia prima domanda è "qual è il ragionamento alla base di questa stima?"
La mia seconda domanda riguarda delta = MIN(delta, delta2) ...
. Cosa fa questo? Perché prendere il minimo di questo delta e l'ultimo? Non so che cosa dovrebbe raggiungere - forse rende la stima migliore, forse solo più conservativa.
Modifica: ho trovato un documento che specifica la stima , ma in realtà non fornisce un argomento motivato (sebbene delinei alcune condizioni informali che lo stimatore dovrebbe soddisfare).
Altre risorse che sono emerse nei commenti:
- Wikipedia su
/dev/random
e/dev/urandom
- Un documento che cerca di spiegarlo (sono scettico al riguardo, vedi commenti)
- Un post sul blog
/dev/random
con commenti del ragazzo che ha scritto il codice sopra. - Una risposta secutity.SE sul
/dev/random
pool di entropia.
/dev/random
è su una base instabile - vedi Feeding / dev / random entropy pool? . Ho telefonato a Thomas nella speranza che rispondesse alla tua domanda.