As you seem to basically understand, the first version does one read of 1024 bytes,
and then writes however many bytes came back from the read,
while the second version does 1024 reads and writes of one byte each.
When copying ordinary files, the larger block size (resulting in the smaller number of I/Os)
may be marginally more efficient. This is probably true for
/dev/urandom as well.
But you need to be careful when using
dd on special files (i.e., devices).
dd if=(whatever input) of=(a magnetic tape device) bs=1024 count=1
will write one tape block of 1024 bytes;
dd … bs=1 count=1024 will write 1024 blocks of one byte each.
These are not the same;
the 1024 small blocks will take up more room on the tape than the one large block,
because of inter-record gaps, and may cause problems for reading the tape.
More relevant to your question, if you read (
it will return only as many high-entropy bytes as are available.
So, in the first version, you might get fewer than 1024 bytes.
But, if you try to read one byte, and the entropy pool is empty, the read will block (i.e., wait)
until data are available, so the second version would be guaranteed to get you 1024 bytes
(although it may take an arbitrarily long amount of time).
To enlarge on the point about the tape drive:
dd if=(appropriate input) of=(a magnetic tape device) bs=512 count=2
will write two tape blocks of 512 bytes. A subsequent
dd if=(magnetic tape device) of=(whatever) bs=1024 count=1
might read only the first block; i.e., the first 512 bytes.
And (named) pipes may exhibit the same problem as
/dev/random– a large read will return only as bytes as are available;
so, again, in the first version, you might get fewer than 1024 bytes.
But, if you try to read one byte at a time, the read will wait until data are available, so the second version would be guaranteed to get you 1024 bytes (or at least read until EOF).