¿Por qué dd solo copia 128 bytes de / dev / random cuando solicito más?

10

Estoy tratando de entender la salida del ddcomando. Lo intenté

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

y obtuve (como se esperaba):

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

Sin embargo cuando lo intenté

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

tengo

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

¿Por qué solo está copiando 128 bytes?

fo_x86
fuente
Visite superuser.com/questions/359599/… para una discusión más completa de / dev / random y urandom
BobT

Respuestas:

8

Debe usar /dev/urandom, o la fuente aleatoria "desbloqueo".

/dev/randomusa un tipo de grupo de entropía para aumentar la aleatoriedad de la fuente de bits. Este método solo devolverá tantos bits / bytes aleatorios como se pueda devolver en función del estado del grupo de entropía en ese momento, por lo que si se usa un generador de números aleatorios de hardware, esto a veces puede ser una constante. Desde la página de manual de Linux :

El generador también mantiene una estimación del número de bits de ruido en el grupo de entropía. A partir de este grupo de entropía se crean números aleatorios.

El /dev/urandomarchivo sigue reutilizando el grupo interno tal como está para generar un número todo el tiempo que lo necesite. El efecto secundario de esto es: no utilizar /dev/urandomcon fines criptográficos , ya que es menos aleatorio que los bits producidos por /dev/random. Vea el enlace de la página de manual arriba para más detalles.

Penetración
fuente
3

Como la lectura /dev/randomsolo devuelve la cantidad de bytes disponibles, debe especificar el tamaño de bloque 1 . En su ejemplo, establece el tamaño de bloque en 512, que falla después de la primera lectura.

Por lo tanto, los argumentos correctos que leen exactamente 512 bytes son:

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

Tenga en cuenta que el comando se bloqueará hasta que haya suficiente entropía en el sistema para generar todos los datos. Así es como /dev/randomfunciona. Si no quiere esperar y está bien con menos entropía, use /dev/urandomen su lugar. En la gran mayoría de los casos /dev/urandomse prefiere el uso.

Viliam
fuente
+1 para la explicación, aunque debería decirse que con un conteo de bytes tan alto como 512, el uso se /dev/randomvuelve prácticamente inutilizable, porque el comando puede tardar muchos minutos en finalizar. Además, incluso bs=512 count=1si parece que la llamada sigue bloqueándose si no hay bytes disponibles, ¿correcto? Una alternativa al cambio bsy los countvalores es usar iflag=fullblock; es decir, bs=512 count=1 iflag=fullblock.
mklement0
En mi humilde opinión, esta respuesta debe fusionarse con la de @ Breakthrough. (Era la respuesta a mi problema mientras que Breakthrough no lo era).
superbob