PRNG’s — Meus números aleatórios são realmente aleatórios?

Funções randômicas
Provavelmente você já ouviu falar do rand() ou do random() em alguma linguagem de programação, certo? Essas funções servem para gerar números aleatórios, porém será que eles são realmente aleatórios?
Hoje vamos falar sobre o que é um PRNG e como ele funciona.
Exemplo de número aleatório
A linguagem que vamos usar para exemplificar os números aleatórios é o JavaScript, porém o conceito é o mesmo para qualquer linguagem. Escolhi o JavaScript, pois você pode executar o código diretamente no seu navegador.
O código abaixo gera um número aleatório entre 0 e 1.
Math.random()
Se você executar o código acima no seu navegador, você vai perceber que ele sempre vai gerar um número aleatório diferente, mas será que ele é realmente aleatório?
O que é um PRNG?
PRNG é a sigla para Pseudo Random Number Generator, ou seja, Gerador de Números Pseudo Aleatórios.
O que isso significa? Significa que o número gerado não é realmente aleatório, ele é gerado a partir de um algoritmo que usa uma semente (seed) para gerar o número.
O que é uma semente?
A semente é um valor usado como base para gerar o número aleatório. Se você usar a mesma semente, o número gerado será sempre o mesmo.
Como funciona um PRNG?
Um PRNG funciona a partir de uma função que recebe uma variável(semente/seed) e retorna um número aleatório. A função deve ser capaz de gerar um número aleatório a partir de uma semente.
Exemplo de PRNG
Vamos criar um PRNG simples que recebe uma semente e retorna um número aleatório entre 0 e 1.
function prng(seed) {
return (seed * 9301 + 49297) % 233280 / 233280;
}
A função acima é um PRNG simples que recebe uma semente e retorna um número aleatório entre 0 e 1.
Exemplo de uso do PRNG
Vamos usar o PRNG que criamos para gerar um número aleatório entre 0 e 1.
prng(1)
Se você executar o código acima no seu navegador, você vai perceber que ele sempre vai gerar o mesmo número aleatório, pois estamos usando a mesma semente.
Mas como é gerado a semente?
A semente é gerada a partir de um valor gerado pelo sistema operacional. Esse valor é chamado de entropia.
O que é entropia?
Em termos gerais, refere-se à quantidade de incerteza em um sistema. Quanto maior a entropia, maior a incerteza. Isso não é exclusivo da computação, mas também se aplica a outras áreas, como física e química.
Como é gerado a entropia no sistema operacional?
A entropia é gerada a partir de eventos aleatórios que ocorrem no sistema operacional, como movimento do mouse, pressionamento de teclas, etc.
Como é gerado a semente a partir da entropia?
No nosso exemplo, a entropia é gerada a partir dos movimentos do mouse e pressionamento de teclas. Esses eventos são capturados pelo sistema operacional e convertidos em um valor numérico usado como semente.
É possível controlar a entropia?
Sim, é possível controlar a entropia. Por exemplo, se você mover o mouse de forma aleatória, você vai gerar mais entropia do que se você mover o mouse de forma previsível.
De forma geral, quanto mais aleatório for o evento, maior será a entropia gerada.
Então o PRNG é realmente aleatório?
Em resumo, os números gerados por PRNGs em linguagens de programação não são verdadeiramente aleatórios, mas são suficientes para muitas aplicações do dia a dia. Se você precisar de aleatoriedade verdadeira, pode ser necessário recorrer a fontes de entropia real ou serviços externos de geração de números aleatórios.
O que é um CSPRNG?
CSPRNG é a sigla para Cryptographically Secure Pseudo Random Number Generator, ou seja, Gerador de Números Pseudo Aleatórios Criptograficamente Seguros.
Embora os PRNGs sejam adequados para muitas aplicações, eles não são adequados para aplicações que exigem uma entropia mais elevada, como criptografia. Para essas aplicações, é necessário usar um CSPRNG.
Características de um CSPRNG
Um CSPRNG deve ter as seguintes características:
- Deve ser imprevisível
Mesmo que você conheça o algoritmo e a semente, você não deve ser capaz de prever o próximo número gerado. Isso é fundamental para a segurança.
- Ampla Entropia
Um CSPRNG deve ter uma ampla entropia, ou seja, deve ser capaz de gerar números aleatórios a partir de uma ampla gama de fontes de entropia.
- Repetibilidade Controlada
Um CSPRNG deve ser capaz de gerar os mesmos números aleatórios a partir da mesma semente. Isso é importante para testes e depuração.
Exemplo de CSPRNG
Algumas linguagens de programação já possuem um CSPRNG embutido, como no PHP.
ramdom_bytes();
Ou então Python com o módulo secrets.
import secrets
secrets.randbits(16)
Caraca, não entendi nada!
Calma, não se preocupe. O objetivo desse artigo é apenas explicar o que é um PRNG e como ele funciona. Se você não entendeu alguma coisa, não se preocupe, o importante é que você entenda o conceito.
Agora que você já sabe o que é um PRNG, você pode pesquisar mais sobre o assunto e aprender mais sobre o funcionamento de um PRNG.
O importante é que você saia daqui sabendo os seguintes conceitos:
- Meus números aleatórios são realmente aleatórios?
- O que é um PRNG?
- Como funciona um PRNG?
- O que é uma semente?
- O que é entropia?
- O que é um CSPRNG?
O mundo da programação é muito vasto e sempre temos algo novo para aprender.
Conclusão
Talvez você esteja se perguntando: “Mas eu preciso saber disso?”. A resposta é: “Depende”. (já ouviu essa resposta antes né?)
Possa ser que você nunca precise usar um PRNG na sua vida, mas é sempre bom saber como as coisas funcionam por baixo dos panos, além de ser uma curiosidade interessante.
É possível que esse artigo tenha ficado um pouco confuso, pois ainda estou começando a estudar sobre o assunto, mas espero que você tenha entendido o conceito básico de um PRNG.
Se você gostaria de complementar esse artigo, sinta-se a vontade para fazer um comentário ou até mesmo entrar em contato comigo.
Até a próxima!





