dd if = / dev / random é 'aleatoriamente' gargalo com grandes lags de tempo, mas não tenho idéia do porquê

6

Eu obtenho descontroladamente diferente real times quando executo o seguinte comando.

dd if=/dev/random bs=1k count=1 

Isso não acontece para if=/dev/null , nem para if=/dev/urandom

Já corri 500 vezes. Aqui estão as estatísticas gerais (por chamada). Os tempos estão em segundos.

Minimum   Maximum  Average   Median
00.002    89.999   4.50402   2.275 

Alguém tem alguma sugestão sobre por que isso pode estar acontecendo?
O sistema é o desktop Ubuntu 10.04. A versão do Bash é 4.1.5 (1)
Ele também mostra as flutuações selvagens semelhantes em uma VM VirtualBox rodando a mesma versão do Ubuntu.

Aqui está o código de teste real

cp /dev/null "$HOME/dd-random.secs" 
for ((i=100;i<=500;i++)); do
    if   ((i<10))  ;then zi="00$i"
    elif ((i<100)) ;then zi="0$i"
    else                 zi="$i"
    fi 
    echo -ne "$zi\t" >>"$HOME/dd-random.secs"
    exec 3>/dev/null 4>/dev/null
        { time { dd if=/dev/random bs=1k count=1; } 1>&3 2>&4; } 2>&1 |tail -n 3|tr 'm\n' '\t' |sed -re "s/([0-9])s//g" >>"$HOME/dd-random.secs" 
    exec 3>&- 4>&-
    echo >>"$HOME/dd-random.secs"
done
    
por Peter.O 25.05.2011 / 18:32

2 respostas

20

Essa é exatamente a diferença entre /dev/random e /dev/urandom - random usa o pool de entropia, que reúne ruído de várias origens e rastreia "quanto" o ruído está atualmente no pool, portanto random sabe quanta aleatoriedade de alta qualidade pode gerar. Como o pool de entropia tem uma quantidade finita de ruído, a leitura de random pode precisar ser bloqueada se não houver entropia suficiente disponível. urandom nunca bloqueia, mas você pode obter dados "menos aleatórios" a partir dele.

Na página random(4) man:

When read, the /dev/random device will only return random bytes within the estimated number of bits of noise in the entropy pool. /dev/random should be suitable for uses that need very high quality randomness such as one-time pad or key generation. When the entropy pool is empty, reads from /dev/random will block until additional environmental noise is gathered.

A read from the /dev/urandom device will not block waiting for more entropy. As a result, if there is not sufficient entropy in the entropy pool, the returned values are theoretically vulnerable to a cryptographic attack on the algorithms used by the driver.

    
por 25.05.2011 / 18:38
3

De link :

"Quando o pool de entropia está vazio, as leituras de / dev / random serão bloqueadas até que ruído ambiental adicional seja coletado."

Edit: Parece que o Michael me bateu nisso!

    
por 25.05.2011 / 18:40