Por que computadores não conseguem gerar números realmente aleatórios
Programadores buscam a verdadeira aleatoriedade em interferências de rádio, detectores de radiação e até abajures. Conheça essa caçada, e entenda por que sua segurança digital depende dela.
Texto Leonardo Caparroz | Edição Bruno Vaiano | Design Juliana Krauss
3, 12, 16, 26, 33, 11. Esses foram os números sorteados em 29 de dezembro de 2010 pela Hot Lotto, um jogo de loteria dos EUA. Um sortudo da cidade de Des Moines (Iowa) levou sozinho a bolada de US$ 16,5 milhões. Mas nunca apareceu para pegar. Ele tentou reclamar o prêmio anonimamente, na verdade – três vezes, usando advogados como representantes. Não colou: as normas proibiam um saque não identificado. Ele desistiu. Nunca mais apareceu.
A polícia estranhou e foi investigar. A câmera de segurança de uma loja de conveniência revelou o momento em que os jogos foram feitos – e o jogador. Era Eddie Tipton, diretor de segurança de informação da Multi-State Lottery Association. Trata-se de uma empresa responsável por loterias em 33 estados dos EUA, inclusive a própria Hot Lotto.
Tipton foi preso em 2015. Não só porque funcionários não podiam participar de jogos da própria companhia, mas também porque os investigadores descobriram que ele havia manipulado os números – e que não era a primeira vez que isso acontecia. A polícia encontrou seis bilhetes vitoriosos cujos prêmios haviam sido retirados por amigos e parentes do executivo nos últimos anos, todos eles comprados perto de feriados. O mistério, porém, permanecia: como a manipulação rolava – e o que os feriados tinham a ver com isso?
O computador que rodava o software de sorteio da Hot Lotto permanecia numa sala trancada, sem conexão com a internet, e ninguém podia acessá-lo desacompanhado. Esse PC era acoplado a um detector de radiação (o chamado “contador Geiger”) que media a prevalência de um isótopo chamado amerício-241 no ar circundante. O amerício flutua em quantidades residuais ao nosso redor, e não dá para prever o que vai surgir no detector. Essa leitura do contador é a matéria-prima que o software usava para gerar os números da loteria. Ou seja: a própria natureza garantia a aleatoriedade. Como contorná-la?
O segredo do golpe é que Tipton não precisava manipular os sorteios individualmente: ele já havia embutido a fraude no software quando o escreveu. Algumas linhas de código discretas, que não mudavam perceptivelmente nenhuma característica do arquivo, ordenavam que algo diferente acontecesse quando o sorteio caísse nos dias 27 de maio, 23 de novembro ou 29 de dezembro – datas próximas de feriados americanos. E só quando esses dias caíssem numa quarta-feira ou num sábado.
Nessas datas, em vez de gerar uma combinação de números dentre as 29 milhões possíveis, o programa fazia os cálculos de modo a chegar a um leque muito menor de opções. Algumas centenas, só. Isso acontecia porque o programa gerava a sequência vencedora a partir de uma semente predeterminada, em vez de usar a leitura imprevisível do contador Geiger. Sendo assim, era só esperar a data certa e fazer um joguinho para cada uma dessas centenas de possibilidades. Saía caro, mas o prêmio era garantido.
O golpe de Tipton foi possível porque existem dois tipos de aleatoriedade: a dita verdadeira, que só a natureza é capaz de alcançar, e a pseudoaleatoriedade – um simulacro, que é tudo que os computadores podem nos oferecer. Vamos entender esse imbróglio computacional.
1071, 678, 1151, 879, 1007, 433
Na física clássica – ou seja, as equações da mecânica newtoniana que regem as nossas caminhadas até o mercado ou a órbita da Terra em torno do Sol –, não existe aleatoriedade real. Ela é o tipo de teoria que os filósofos chamam de determinista. Se existisse poder de computação suficiente para calcular as interações entre todas as partículas que formam o Universo, de sua origem até hoje, seríamos capazes de prever o estado futuro de tudo que existe.
Quando lançamos uma moeda, está em jogo seu peso, a resistência do ar, a força do seu dedão… Colete e compute esses dados e você saberá se o resultado é cara ou coroa antes de ela cair. Mas isso não é possível, claro. O grau de aleatoriedade percebido por nós em um sistema é proporcional à nossa ignorância às condições desse sistema. Ficou curioso com a sequência 1071, 678, 1151, 879, 1007, 433 ali do lado? Ela não é aleatória. É só a quantidade de versículos em cada um dos livros do Novo Testamento. O próximo número é 431.
A aleatoriedade, então, é sempre uma ilusão. Ou melhor: quase sempre. Sabe-se que o mundo infinitesimal, os das coisas muito pequenas, como elétrons e fótons, é regido pela mecânica quântica. E ela é uma ciência probabilística, não determinística: existe algum grau de ignorância sobre as previsões que não têm a ver com nenhuma limitação prática em coletar dados, e sim com o fato de que a própria natureza é incerta na escala infinitesimal – nem um poder de computação infinito seria capaz de prever a trajetória de um elétron solitário num campo magnético, por exemplo.
Na letra fria da filosofia, apenas a mecânica quântica é aleatória. (E vale notar: como o contador Geiger depende de um processo quântico – que é o decaimento de partículas radioativas –, ele tem um pouquinho dessa aleatoriedade quântica; o que o torna ideal para uma loteria.)
Os números pseudoaleatórios
Computadores são previsíveis por definição. Algoritmos são apenas sequências de comandos do tipo “se isso acontecer, faça aquilo”. Ao instruir um computador a gerar um número aleatório, você está dando a ele um método para fazer isso – e um número obtido por meio de um método, por definição, não é aleatório.
Para gerar uma sequência de números aparentemente aleatórios, um software parte de um número inicial chamado de semente (ou seed) – no exemplo da loteria, a semente vem do contador Geiger. Esse valor vai passar por uma série de operações matemáticas que resultarão em uma salada randômica.
Porém, é tudo ilusão: se você der o mesmo comando de novo – com a mesma semente – o programa vai cuspir a mesma salada em resposta. Por causa disso, esses números são chamados de pseudoaleatórios e, seus geradores, de pseudorandom number generators (PRNG). São só números que sabem fingir bem.
Toda vez que você pede um novo número, o PRNG modifica a equação responsável por gerá-lo de algum jeito. Cada instância atualizada da equação é chamada de estado. Vários PRNGs criam suas sequências usando o número anterior para compor o novo estado. Ou seja: a semente entra no primeiro estado. Sai um número do outro lado. Esse número serve de semente para o segundo estado. Que cospe um número. Que servirá de semente para o terceiro estado…
Os critérios básicos para identificar um bom PRNG é que ele demore para repetir um número de saída (esse tempo é chamado de período) e torne difícil prever o próximo número (os valores gerados não podem ter relação evidente entre si). Um dos melhores PRNGs que existem é o Mersenne Twister, criado em 1997 por Makoto Matsumoto e Takuji Nishimura. Trata-se do gerador oficial da linguagem de programação Python e do Microsoft Excel.
O Mersenne Twister só repete um output depois de 219937 – 1 números – o resultado dessa conta é um valor imenso, com 6.002 algarismos de comprimento. Trata-se de um número com metade do tamanho do texto que você está lendo. Esse é um dos chamados primos de Mersenne, uma classe de números primos (daí o nome do algoritmo).
É um resultado impressionante – o Twister é aprovado na esmagadora maioria dos testes de aleatoriedade –, mas mesmo esse PRNG robusto é suscetível a alguns truques, porque ainda se trata de um software determinístico. Quando se quer obter um número realmente aleatório, ainda que você vá inseri-lo em um PRNG depois, é preciso obrigatoriamente partir de uma semente coletada na natureza. E o contador Geiger da Hot Lotto é só a ponta de um iceberg de maneiras de fazer isso.
O acaso vai te proteger
Quando você faz uma compra online, seus dados bancários precisam ser compartilhados com o banco e com o vendedor. Nesse trajeto por roteadores, cabos e servidores de internet, eles podem ser interceptados por um hacker. Suas mensagens de WhatsApp e e-mails de trabalho seguem o mesmo caminho, e estão sujeitos aos mesmos riscos. É para isso que existe criptografia. Antes de embarcar em sua viagem pela rede, o dado é transformado em uma maçaroca de dígitos desconexos por meio de uma chave. Só um remetente que possui a chave pode reverter o conteúdo ao estado original.
A criptografia, como uma loteria, é uma aplicação delicada demais para um PRNG sozinho. É preciso alimentá-lo com algo externo e caótico. Para a Cloudflare, uma empresa de segurança digital americana, a solução foram as lava lamps – aquele abajur em que bolhas de cera flutuam num líquido colorido. No hall de entrada de sua sede em São Francisco, Califórnia, a empresa mantém uma parede cheia delas. É dessa parede que eles tiram as sementes para seus serviços de criptografia – atualmente, cerca de 20% do tráfego de internet passa pela Cloudflare, então haja semente.
Uma câmera apontada para elas tira fotos em intervalos regulares e as envia para os servidores. Essas imagens são transformadas em números, com cada pixel recebendo um valor. O formato das bolhas de uma única lâmpada é caótico – numa parede cheia delas, é essencialmente impossível prever qualquer coisa sobre a disposição futura das bolhas de cera de cada uma. Cada imagem se torna uma sequência de números totalmente aleatórios e imprevisíveis, que a Cloudflare usa como ponto de partida para criar suas chaves.
“Os conceitos de tecnologia não são fáceis. As lâmpadas de lava são uma maneira de tornar isso visível – todos podem entender que é algo aleatório”, diz à Super John Engates, Field CTO da Cloudflare. “Também é legal ter um escritório com uma instalação de arte na entrada. Todo mundo quer tirar uma foto.”
Em outros dois escritórios, a Cloudflare usa métodos diferentes. Em Londres, usam fotos de um sistema de duplo pêndulo – um pêndulo com outro preso na sua extremidade. Em Singapura, medem o decaimento radioativo de um pedacinho de urânio.
A Cloudflare ainda insere essas sementes imprevisíveis em algoritmos como os PRNG, para poder gerar vários números diferentes a partir de uma única foto das lâmpadas ou do pêndulo. Contudo, há situações de segurança redobrada que exigem um número de uso único, descartável. Para isso, existem os chamados geradores de números aleatórios verdadeiros (true random number generator, ou TRNG), que produzem números únicos com sinais extraídos diretamente do mundo exterior, sem nenhuma transformação matemática.
TRNGs são o segredo da random.org, uma empresa irlandesa que oferece serviços de aleatoriedade. No site deles, você pode selecionar uma data aleatória no calendário, uma hora aleatória do dia, uma senha realmente aleatória para o seu e-mail e até uma escala musical aleatória. Tudo isso é gratuito, mas eles têm serviços mais sérios que são pagos e usados, por exemplo, em pesquisas científicas.
O TRNG da random.org se baseia em algo chamado ruído atmosférico – aquela estática indesejada captada nas frequências de rádio. Ele é uma combinação da interferência de outros dispositivos eletrônicos com o ruído eletromagnético natural, criado pelas descargas elétricas dos raios e até pela radiação cósmica de fundo, um resquício da luz emitida no Big Bang que banha o Universo até hoje.
Os TRNGs demoram mais para produzir seus números do que os PRNGs, o que os torna pouco práticos para aplicação em larga escala, como na Cloudflare. Contudo, eles não são determinísticos e não têm um período – a sequência de números não vai se repetir. Cabe aos programadores avaliar o caso e decidir qual é a melhor opção. Afinal, nas palavras do matemático Robert R. Coveyou, “a geração de números aleatórios é importante demais para ser deixada ao acaso”. Quando o assunto é segurança digital, precisamos ter certeza absoluta de que não há certeza absolutamente nenhuma.