Por que o dd copia apenas 128 bytes de / dev / random quando solicito mais?

10

Estou tentando entender a saída do ddcomando. eu tentei

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

e obteve (como esperado):

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

No entanto, quando eu tentei

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

Eu tenho

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

Por que ele está apenas copiando 128 bytes?

fo_x86
fonte
Veja superuser.com/questions/359599/… para uma discussão mais completa de / dev / random e urandom
BobT

Respostas:

8

Você precisa usar /dev/urandomou a fonte aleatória "desbloqueando".

/dev/randomusa um tipo de pool de entropia para aumentar a aleatoriedade da fonte de bits. Esse método retornará apenas quantos bits / bytes aleatórios puderem ser retornados com base no estado do pool de entropia no momento; portanto, se um gerador de números aleatórios de hardware for usado, isso às vezes pode ser uma constante. Na página de manual do Linux :

O gerador também mantém uma estimativa do número de bits de ruído no pool de entropia. A partir desse conjunto de entropia, são criados números aleatórios.

O /dev/urandomarquivo continua reutilizando o pool interno para gerar um número pelo tempo que você precisar. O efeito colateral disso é: não use /dev/urandompara fins criptográficos , pois é menos aleatório do que os bits produzidos por /dev/random. Consulte o link da página de manual acima para obter detalhes.

Avanço
fonte
3

Como a leitura /dev/randomretorna apenas a quantidade de bytes disponível, você deve especificar o tamanho do bloco 1 . No seu exemplo, você define o tamanho do bloco como 512, que falha após a primeira leitura.

Portanto, os argumentos corretos que lê exatamente 512 bytes são:

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

Observe que o comando será bloqueado até que haja entropia suficiente no sistema para gerar todos os dados. É assim que /dev/randomfunciona. Se você não quiser esperar e estiver bem com menos entropia, use /dev/urandom. Na grande maioria dos casos, o uso /dev/urandomé preferido.

Viliam
fonte
+1 para a explicação, embora seja necessário dizer que, com contagens de bytes de até 512, o uso /dev/randomse torna praticamente inutilizável, porque o comando pode levar muitos minutos para ser concluído. Além disso, mesmo bs=512 count=1que pareça que a chamada ainda bloqueia se não houver bytes disponíveis, correto? Uma alternativa para comutação bse countvalores é usar iflag=fullblock; ou seja, bs=512 count=1 iflag=fullblock.
precisa saber é o seguinte
IMHO, esta resposta deve ser mesclada na do @ Breakthrough. (Foi a resposta para o meu problema, enquanto o avanço não foi).
superbob 22/01