Dlaczego dd kopiuje tylko 128 bajtów z / dev / random, gdy żądam więcej?


10

Próbuję zrozumieć wyjście ddpolecenia. próbowałem

dd if=/dev/zero of=/dev/null bs=512 count=1

i otrzymałem (zgodnie z oczekiwaniami):

 1+0 records in
 1+0 records out
 512 bytes (512 B) copied, 2e-05 seconds, 26 MB/s

Jednak kiedy próbowałem

dd if=/dev/random of=/dev/null bs=512 count=1

mam

 0+1 records in
 0+1 records out
 128 bytes (128 B) copied, 0.00012 seconds, 1.1 MB/s

Dlaczego kopiuje tylko 128 bajtów?


Zobacz superuser.com/questions/359599/..., aby uzyskać pełniejszą dyskusję o / dev / random i urandom
BobT

Odpowiedzi:


8

Musisz użyć /dev/urandomlosowego źródła „odblokowującego”.

/dev/randomwykorzystuje rodzaj puli entropii w celu zwiększenia losowości źródła bitów. Ta metoda zwróci tylko tyle losowych bitów / bajtów, ile może zostać zwróconych na podstawie stanu puli entropii w danym momencie, więc jeśli używany jest sprzętowy generator liczb losowych, może to czasem być stałe. Ze strony Linux-a :

Generator przechowuje również szacunkową liczbę bitów szumu w puli entropii. Z tej puli entropii tworzone są losowe liczby.

/dev/urandomPlik utrzymuje ponowne wewnętrzny basen jak jest do generowania numeru tak długo, jak trzeba. Efektem ubocznym tego jest: nie używaj /dev/urandomdo celów kryptograficznych , ponieważ jest mniej losowy niż bity produkowane przez /dev/random. Zobacz link do strony powyżej, aby uzyskać szczegółowe informacje.



3

Ponieważ odczyt /dev/randomzwraca tylko ilość dostępnych bajtów , musisz określić rozmiar bloku 1 . W twoim przykładzie ustawiłeś rozmiar bloku na 512, co kończy się niepowodzeniem po pierwszym odczycie.

Dlatego poprawnymi argumentami, które odczytują dokładnie 512 bajtów, są:

dd if=/dev/random of=filename bs=1 count=512

Uwaga: polecenie będzie blokować, dopóki w systemie nie będzie wystarczającej ilości entropii do wygenerowania wszystkich danych. Tak to /dev/randomdziała. Jeśli nie chcesz czekać i masz mniejszą entropię, użyj /dev/urandomzamiast tego. W zdecydowanej większości przypadków /dev/urandompreferowane jest używanie .


+1 za wyjaśnienie, chociaż należy powiedzieć, że przy liczbie bajtów aż 512, użycie /dev/randomstaje się praktycznie bezużyteczne, ponieważ wykonanie polecenia może zająć wiele minut. Ponadto, nawet bs=512 count=1jeśli wydaje się, że wywołanie nadal blokuje się, jeśli w ogóle nie ma dostępnych bajtów, prawda? Alternatywą dla przełączania bsi countwartości jest użycie iflag=fullblock; tj bs=512 count=1 iflag=fullblock.
mklement0

IMHO, odpowiedź ta powinna zostać połączona z odpowiedzią @ Breakthrough. (To była odpowiedź na mój problem, podczas gdy nie było Przełomu).
superbob
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.