/dev/random
usa os tempos das interrupções do kernel para adicionar ao pool de entropia. A quantidade de entropia no pool é rastreada em uma variável chamada entropy_count
.
Aqui está o trecho de código relevante de random.c
. Ele representa o tempo (em instantes, eu acho) entre as duas últimas interrupções na variável delta
e as diferenças nos deltas como 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;
Parece que a estimativa da entropia adicionada é essencialmente o piso (não o teto devido ao deslocamento de bits inicial antes do loop) do logaritmo base 2 do delta. Isso faz algum sentido intuitivo, embora não tenha certeza de quais suposições seriam necessárias para tornar isso formalmente correto.
Então, minha primeira pergunta é "qual é o raciocínio por trás dessa estimativa?"
Minha segunda pergunta é sobre delta = MIN(delta, delta2) ...
. O que isso faz? Por que tirar o mínimo desse delta e o último? Não sei o que isso deve alcançar - talvez melhore a estimativa, talvez apenas mais conservador.
Edit: Encontrei um artigo que especifica a estimativa , mas não fornece um argumento fundamentado para ela (embora ele delineie algumas condições informais que o estimador deve atender).
Outros recursos que surgiram nos comentários:
- Wikipedia em
/dev/random
e/dev/urandom
- Um artigo que tenta explicá-lo (sou cético quanto a isso, veja comentários)
- Uma postagem no blog
/dev/random
com comentários do cara que escreveu o código acima. - Uma resposta secutity.SE sobre o
/dev/random
pool de entropia.
/dev/random
está em uma base instável - consulte Feeding / dev / random entropy pool? . Liguei para Thomas na esperança de que ele respondesse sua pergunta.