sexta-feira, 9 de novembro de 2012

Sorteio eletrônico e publicamente auditável: será possível?

A pergunta formulada no título é algo em que tenho pensado já há um bom tempo. Como realizar sorteios por computador de forma pública, ou ao menos de forma que a conferência da lisura do sorteio possa ser publicamente demonstrável?

A principal característica de um sorteio deve ser a sua aleatoriedade. Bolinhas numeradas colocadas dentro de um globo a ser velozmente girado produzem um sorteio aleatório, desde que idênticas em peso, tamanho e material. Se pessoas assistem ao sorteio, e podem conferir uma a uma as bolinhas, pode-se dizer que o sorteio foi publicamente auditado, ao menos pelo universo de sujeitos presentes ao ato. O que, convenhamos, não é grande coisa em termos de segurança contra eventuais vícios do sorteio...

Sorteios feitos por computadores são ainda mais problemáticos. O computador, a princípio, é incapaz de realizar algo verdadeiramente aleatório. Costuma-se, por isso, chamar algumas funções matemáticas de "pseudo-aleatórias". Tratam-se de funções matemáticas que, partindo de um primeiro número (chamado de "seed", ou semente), realiza operações sequenciais que não são lineares e, por isso, se assemelham a números aleatoriamente gerados. O problema, aqui, é encontrar sementes que sejam suficientemente aleatórias para iniciar o cálculo. Afinal , uma vez temos funções matemáticas - exatas, portanto - a partir da mesma semente gera-se sempre a mesma sequência. A aleatoriedade da geração randômica, então, depende da aleatoriedade da semente.

Programas de criptografia, que dependem visceralmente de números aleatórios para a geração de chaves, normalmente pedem ao usuário que aleatoriamente mexa o mouse ou digite teclas quaisquer no teclado, e a partir desses movimentos, eventualmente mesclados com dados do sistema (uso do disco, data e hora, temperatura interna ou outros eventos físicos mensuráveis), produz uma semente aleatória. Como o objetivo, nestes casos, é produzir um número aleatório que nunca mais erá conhecido, nem deve ser sabido por mais ninguém, essa é uma boa forma de produzir resultados aleatórios.

Mas, e se o que queremos fazer é um sorteio, de tal modo que possamos demonstrar racionalmente aos participantes a lisura do resultado? Não é uma forma oculta de geração de números aleatórios que cumprirá essa função.

A solução para esta questão passa necessariamente por essas funções matemáticas que geram números randômicos. Paradoxalmente, a exatidão das funções matemáticas é o caminho para permitir um sorteio auditável, pois tais operações podem ser posteriormente conferidas por qualquer um, desde que conhecida a "semente". Mas aí entramos em outro problema: como gerar essa semente, não apenas de modo aleatório, mas que possa ser conferido? E, especialmente, de modo que não possa ser manipulado por alguém!

Tentando equacionar o problema, temos que, por um lado, em um sorteio, não parece tão necessário gerar uma semente com o mesmo grau de aleatoriedade necessário para a geração de chaves criptográficas ou para qualquer aplicativo de segurança. O que parece ser mais importante é que a geração dessa semente seja algo que não possa ser determinado exclusivamente por nenhum dos sujeitos envolvidos no sorteio, sejam os concorrentes, seja o seu organizador.

Algo que me vêm à mente, então, para gerar a semente, seria a utilização de dados enviados por cada um dos participantes, sem que algum deles, ou o organizador, possa ter controle sobre o montante total desses dados. E, especialmente, que não possam ser manipulados depois de enviados, em conluio entre um dos participantes e o organizador.

E, se o universo de participantes for algo previamente indeterminado, um cenário tal em que todos e qualquer um poderiam se inscrever, talvez o nome e dados pessoais desses sujeitos fosse suficiente para a geração de uma semente aleatória e, ao mesmo tempo, auditável. Tal modelo seria inviável se o universo de participantes fosse um grupo social fixo, de pessoas determinadas, como alunos de uma classe, funcionários de uma empresa, etc. Mas, se os concorrentes podem ser quaisquer pessoas, conforme essas se habilitem ou não ao concurso, parece-me que a utilização de seus dados pessoais é algo suficientemente aleatório, ao menos para o fim de: a) permitir conferir publicamente como foi calculada a semente; b) impedir que algum dos partícipes consiga manipular os dados que gerarão a semente, uma vez que ele não controle o universo total de inscritos.

Daí, calculamos o hash sobre esses dados e usamos esse número como semente do nosso sorteio aleatório.

Parece plausível?

Querem participar de um teste? Aguardem!