Eu vi um truque bem legal em /dev/urandom
como uma fonte de aleatoriedade (é uma boa fonte), e então use isso como uma senha para uma cifra de fluxo AES.
Eu não posso te dizer com 100% de certeza, mas eu acredito que se você alterar os parâmetros (ou seja, usar caminho mais do que apenas 128 bytes de /dev/urandom
), é pelo menos suficientemente perto de um PRNG criptograficamente seguro, para todos os efeitos práticos:
This command generates a pseudo-random data stream using aes-256-ctr with a seed set by /dev/urandom. Redirect to a block device for secure data scrambling.
openssl enc -aes-256-ctr -pass pass:"$(dd if=/dev/urandom bs=128 count=1 2>/dev/null | base64)" -nosalt < /dev/zero > randomfile.bin
Como isso funciona?
openssl enc -aes-256-ctr
usará openssl
para criptografar zeros com AES-256 no modo CTR.
-
O que será criptografado?
/dev/zero
-
Qual é a senha que será usada para criptografá-lo?
dd if=/dev/urandom bs=128 count=1 | base64
Esse é um bloco de 128 bytes de
/dev/urandom
codificado em base64 (o redirecionamento para/dev/null
é ignorar erros). -
Na verdade, não sei por que
-nosalt
está sendo usado, já que a página man do OpenSSL afirma o seguinte:-salt use a salt in the key derivation routines. This is the default. -nosalt don't use a salt in the key derivation routines. This option SHOULD NOT be used except for test purposes or compatibility with ancient versions of OpenSSL and SSLeay.
Talvez o objetivo seja fazer isso funcionar o mais rápido possível, e o uso de sais seria injustificado, mas não tenho certeza se isso deixaria qualquer tipo de padrão no texto cifrado. O pessoal do Cryptography Stack Exchange pode nos dar uma explicação mais detalhada sobre isso.
-
A entrada é
/dev/zero
. Isto é porque realmente não importa o que está sendo criptografado - a saída será algo parecido com dados aleatórios. Os zeros são rápidos de se obter e você pode obter (e criptografar) o quanto quiser sem ficar sem eles. -
A saída é
randomfile.bin
. Também poderia ser/dev/sdz
e você randomizaria um dispositivo de bloco completo.
Mas eu quero criar um arquivo com tamanho fixo! Como faço isso?
Simples!
dd if=<(openssl enc -aes-256-ctr -pass pass:"$(dd if=/dev/urandom bs=128 count=1 2>/dev/null | base64)" -nosalt < /dev/zero) of=filename bs=1M count=100 iflag=fullblock
Apenas dd
desse comando com um blocksize
fixo (que é 1 MB aqui) e count
. O tamanho do arquivo será blocksize * count
= 1M * 100 = 100M.