/dev/random
używa taktowania przerwań jądra, aby dodać do puli entropii. Ilość entropii w puli jest śledzona w zmiennej o nazwie entropy_count
.
Oto odpowiedni fragment kodu z random.c
. Reprezentuje czas (jak sądzę w jiffies) między dwoma ostatnimi interuptami w zmiennej delta
i różnicami w deltach jako 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;
Wygląda na to, że oszacowanie dodanej entropii to w zasadzie podłoga (nie sufit z powodu początkowej przesunięcia bitów przed pętlą) logarytmu podstawy 2 delty. Ma to pewien intuicyjny sens, choć nie jestem pewien, jakie założenia byłyby potrzebne, aby formalnie było to poprawne.
Moje pierwsze pytanie brzmi: „jakie jest uzasadnienie tego oszacowania?”
Moje drugie pytanie dotyczy delta = MIN(delta, delta2) ...
. Co to robi? Po co brać minimum tej delty i ostatniej? Nie wiem, co to ma osiągnąć - być może dzięki temu oszacowanie jest lepsze, a może bardziej konserwatywne.
Edycja: Znalazłem artykuł, który określa oszacowanie , ale tak naprawdę nie podaje uzasadnionego argumentu (chociaż zawiera pewne nieformalne warunki, które estymator powinien spełnić).
Inne zasoby, które pojawiły się w komentarzach:
- Wikipedia na
/dev/random
i/dev/urandom
- Artykuł, który próbuje to wyjaśnić (jestem sceptyczny, zobacz komentarze)
- Wpis na blogu
/dev/random
zawierający komentarze faceta, który napisał powyższy kod. - Odpowiedź secutity.SE na temat
/dev/random
puli entropii.
/dev/random
jest niepewna - patrz Feeding / dev / random entropy pool? . Pingowałem Thomasa w nadziei, że odpowie na twoje pytanie.