Mengapa dd hanya menyalin 128 byte dari / dev / random ketika saya meminta lebih banyak?

10

Saya mencoba memahami output dari ddperintah. Saya mencoba

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

dan mendapat (seperti yang diharapkan):

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

Namun ketika saya mencoba

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

saya mendapatkan

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

Mengapa hanya menyalin 128 byte?

fo_x86
sumber
Lihat superuser.com/questions/359599/... untuk diskusi yang lebih lengkap tentang / dev / random dan urandom
BobT

Jawaban:

8

Anda perlu menggunakan /dev/urandom, atau sumber acak "unblocking".

/dev/randommenggunakan semacam kumpulan entropi untuk meningkatkan keacakan sumber bit. Metode ini hanya akan mengembalikan sebanyak bit / byte acak yang dapat dikembalikan berdasarkan keadaan kumpulan entropi pada saat itu, jadi jika generator nomor acak perangkat keras digunakan, ini kadang-kadang bisa berupa konstanta. Dari manual Linux :

Generator juga menyimpan perkiraan jumlah bit kebisingan di kolam entropi. Dari kumpulan entropi ini, angka acak dibuat.

The /dev/urandomberkas terus menggunakan kembali kolam renang internal-adalah untuk menghasilkan angka selama Anda perlu. Efek samping dari ini adalah: jangan gunakan /dev/urandomuntuk keperluan kriptografi , karena kurang acak dari bit yang dihasilkan oleh /dev/random. Lihat tautan manual di atas untuk detailnya.

Penerobosan
sumber
3

Karena membaca /dev/randomhanya mengembalikan jumlah byte yang tersedia, Anda harus menentukan ukuran blok 1 . Dalam contoh Anda, Anda mengatur ukuran blok ke 512 yang gagal setelah pembacaan pertama.

Oleh karena itu, argumen yang benar yang persis membaca 512 byte adalah:

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

Perhatikan bahwa perintah akan memblokir sampai ada cukup entropi dalam sistem untuk menghasilkan semua data. Begitulah cara /dev/randomkerjanya. Jika Anda tidak ingin menunggu dan Anda baik-baik saja dengan sedikit entropi, gunakan /dev/urandomsaja. Dalam sebagian besar kasus, penggunaan /dev/urandomlebih disukai.

Viliam
sumber
+1 untuk penjelasan, meskipun harus dikatakan bahwa dengan jumlah byte setinggi menggunakan 512 /dev/randommenjadi hampir tidak dapat digunakan, karena perintah dapat memakan waktu beberapa menit untuk menyelesaikannya. Juga, meskipun bs=512 count=1tampaknya panggilan itu masih memblokir jika tidak ada byte sama sekali, benar? Alternatif untuk beralih bsdan countnilai adalah menggunakan iflag=fullblock; yaitu bs=512 count=1 iflag=fullblock,.
mklement0
IMHO, jawaban ini harus digabung menjadi @ Breakthrough. (Itu adalah jawaban untuk masalah saya sementara Breakthrough tidak).
superbob