Bem, a maioria das pessoas usa apenas badblocks
...
Caso contrário, basta criptografar zeros. Criptografia faz exatamente o que você quer. Zeros criptografados se parecem com dados aleatórios. Decifrar dados aleatórios os transforma em zeros. É determinista, reversível, desde que você conheça a chave.
cryptsetup open --type plain --cipher aes-xts-plain64 /dev/yourdisk cryptodisk
shred -n 0 -z -v /dev/mapper/cryptodisk # overwrites everything
cmp /dev/zero /dev/mapper/cryptodisk # byte-by-byte comparison
Isso deve utilizar a velocidade total do disco em um sistema moderno com o AES-NI.
Também funciona apenas para canalizar (sem o armazenamento real)
cd /dev/shm # tmpfs
truncate -s 1E exabyte_of_zero
losetup --find --show --read-only exabyte_of_zero
cryptsetup open --type plain --cipher aes-xts-plain64 --readonly /dev/loop4
cat /dev/mapper/loopcrypt | something_that_wanted_random_data
ou se ainda estivermos gravando em um disco e comparando
cat /dev/mapper/loopcrypt > /dev/sdx
# overwrites until no space left on device
cmp /dev/mapper/loopcrypt /dev/sdx
# compares until EOF on /dev/sdx OR loopcrypt and sdx differ byte X.
Ao contrário do PRNG, isso também pode ser usado para começar a comparar dados em algum lugar no meio do arquivo. Com um PRNG tradicional, você tem que gerá-lo novamente para voltar a qualquer posição em que estivesse interessado. Claro, você poderia fazer uma semente aleatória baseada em offset ou algo assim ...