Warum kopiert dd nur 128 Bytes aus / dev / random, wenn ich mehr anfordere?

10

Ich versuche die Ausgabe des ddBefehls zu verstehen . Ich habe es versucht

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

und bekam (wie erwartet):

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

Als ich es jedoch versuchte

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

ich habe

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

Warum werden nur 128 Bytes kopiert?

fo_x86
quelle
Siehe superuser.com/questions/359599/... für eine vollständigere Diskussion von / dev / random und urandom
BobT

Antworten:

8

Sie müssen /dev/urandomoder die "Entsperrung" zufällige Quelle verwenden.

/dev/randomverwendet eine Art Entropiepool, um die Zufälligkeit der Bitquelle zu erhöhen. Diese Methode gibt nur so viele zufällige Bits / Bytes zurück, wie je nach dem aktuellen Zustand des Entropiepools zurückgegeben werden können. Wenn also ein Hardware-Zufallszahlengenerator verwendet wird, kann dies manchmal eine Konstante sein. Aus der Linux-Manpage :

Der Generator speichert auch eine Schätzung der Anzahl der Rauschbits im Entropiepool. Aus diesem Entropiepool werden Zufallszahlen erzeugt.

Die /dev/urandomDatei verwendet den internen Pool so, wie er ist, um eine Zahl zu generieren, so lange Sie dies benötigen. Der Nebeneffekt davon ist: Nicht /dev/urandomfür kryptografische Zwecke verwenden , da es weniger zufällig ist als die Bits, die von erzeugt werden /dev/random. Weitere Informationen finden Sie oben auf der Manpage.

Durchbruch
quelle
3

Da beim Lesen /dev/randomnur die Anzahl der verfügbaren Bytes zurückgegeben wird, müssen Sie die Blockgröße 1 angeben . In Ihrem Beispiel setzen Sie die Blockgröße auf 512, was nach dem ersten Lesen fehlschlägt.

Daher lauten die richtigen Argumente, die genau 512 Byte lesen, wie folgt:

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

Beachten Sie, dass der Befehl blockiert wird, bis im System genügend Entropie vorhanden ist, um alle Daten zu generieren. So /dev/randomfunktioniert es. Wenn Sie nicht warten möchten und mit weniger Entropie zufrieden sind, verwenden Sie /dev/urandomstattdessen. In den allermeisten Fällen wird die Verwendung /dev/urandombevorzugt.

Viliam
quelle
+1 für die Erklärung, obwohl gesagt werden sollte, dass bei Byte-Zählungen von bis zu 512 die Verwendung /dev/randompraktisch unbrauchbar wird, da der Befehl viele Minuten dauern kann, bis er beendet ist. Auch wenn bs=512 count=1es den Anschein hat, dass der Aufruf immer noch blockiert, wenn überhaupt keine Bytes verfügbar sind, richtig? Eine Alternative zu Switching bsund countWerten ist die Verwendung von iflag=fullblock; dh bs=512 count=1 iflag=fullblock.
mklement0
IMHO, diese Antwort sollte in die von @ Breakthrough verschmolzen werden. (Es war die Antwort auf mein Problem, während Breakthrough's nicht war).
Superbob