ทำไม dd คัดลอก 128 bytes จาก / dev / random เมื่อฉันร้องขอมากกว่านี้?


10

ฉันพยายามที่จะเข้าใจผลลัพธ์ของddคำสั่ง ฉันเหนื่อย

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

และได้รับ (ตามที่คาดไว้):

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

อย่างไรก็ตามเมื่อฉันพยายาม

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

ฉันได้

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

ทำไมการคัดลอก 128 ไบต์เท่านั้น


ดูsuperuser.com/questions/359599/…สำหรับการสนทนาที่สมบูรณ์ยิ่งขึ้นของ / dev / random และ urandom
BobT

คำตอบ:


8

คุณต้องใช้/dev/urandomหรือแหล่งสุ่ม "ปลดบล็อค"

/dev/randomใช้พูลเอนโทรปีชนิดหนึ่งเพื่อเพิ่มการสุ่มของบิตต้นฉบับ เมธอดนี้จะส่งคืนบิตสุ่ม / ไบต์จำนวนมากเท่าที่สามารถส่งคืนได้ตามสถานะของพูลเอนโทรปีในเวลานั้นดังนั้นหากใช้ตัวสร้างหมายเลขสุ่มฮาร์ดแวร์จะมีค่าคงที่ จากmanpage Linux :

เครื่องกำเนิดยังเก็บค่าประมาณจำนวนบิตของเสียงในพูลเอนโทรปี จากตัวเลขสุ่มเอนโทรปีของพูลจะถูกสร้างขึ้น

/dev/urandomไฟล์ช่วยให้การนำสระว่ายน้ำภายในคือการสร้างหมายเลขตราบเท่าที่คุณต้องการ ผลข้างเคียงของเรื่องนี้คือ ไม่ได้ใช้/dev/urandomเพื่อวัตถุประสงค์ในการเข้ารหัสลับ/dev/randomตามที่มันเป็นแบบสุ่มน้อยกว่าบิตที่ผลิตโดย ดูลิงค์ manpage ด้านบนเพื่อดูรายละเอียด



3

ตั้งแต่อ่าน/dev/randomผลตอบแทนเพียงจำนวนไบต์ที่มีอยู่คุณต้องระบุขนาดของบล็อก1 ในตัวอย่างของคุณคุณตั้งค่าขนาดบล็อกเป็น 512 ซึ่งล้มเหลวหลังจากอ่านครั้งแรก

ดังนั้นข้อโต้แย้งที่ถูกต้องที่อ่านว่า 512 ไบต์คือ:

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

หมายเหตุคำสั่งจะบล็อกจนกว่าจะมีเอนโทรปีเพียงพอในระบบเพื่อสร้างข้อมูลทั้งหมด นั่นเป็นวิธีการ/dev/randomทำงาน หากคุณไม่ต้องการที่จะรอและคุณใช้ได้กับเอนโทรปีน้อยให้ใช้/dev/urandomแทน ในกรณีส่วนใหญ่ใช้/dev/urandomเป็นที่ต้องการ


+1 สำหรับคำอธิบายถึงแม้ว่ามันควรจะกล่าวได้ว่าด้วยจำนวนไบต์ที่สูงถึง 512 ใช้/dev/randomกลายเป็นใช้ไม่ได้จริงเพราะคำสั่งอาจใช้เวลาหลายนาทีเพื่อให้เสร็จ นอกจากนี้แม้bs=512 count=1จะดูเหมือนว่าการโทรยังคงบล็อกหากไม่มีไบต์ที่ถูกต้อง? อีกทางเลือกหนึ่งสำหรับการสลับbsและcountค่าคือการใช้iflag=fullblock; เช่นbs=512 count=1 iflag=fullblock.
mklement0

IMHO คำตอบนี้ควรรวมเข้ากับ @ Breakthrough (มันเป็นคำตอบสำหรับปัญหาของฉันในขณะที่การพัฒนาไม่ได้)
superbob
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.