Como explicar o caso Snowden para sua tia.

Imagine que você está num domingo ensolarado na praia de Ipanema quando toca seu celular. Do outro lado da linha a Tia Betty que quer saber se ainda é seguro pagar a conta de luz pela internet. Ela leu o tal do caso Snowden, viu lá o Fantástico e ficou preocupada. Quer que você explique para ela o que está acontecendo.

Neste momento você conta até dez para não mandar a Tia Betty para aquele lugar, afinal sua mãe vai ficar chateada e pensa em como se livrar do problema de maneira rápida.

A questão não é saber se existe um meio completamente seguro de se comunicar pela Internet, mas de quem você quer se proteger?

Eu costumo dizer que uma pessoa (empresa, entidade ou governo) com tempo e recursos consegue invadir qualquer sistema. É uma questão de valor do alvo e capacidade do invasor. Um alvo de baixo valor em geral não paga os recursos necessários para quebrar um sistema básico de criptografia, provavelmente este é o caso da sua tia.

Mas em alguns casos o usuário pediu para ser burro, entrou duas vezes na fila e ainda mandou caprichar, é o caso do sujeito que veio chorar que tiraram dinheiro da conta dele. Segundo o mané, ele recebeu um e-mail do banco dizendo que eles precisavam confirmar os dados dele, aí num site mequetrefe com a cara do Santander, ele digitou o login, a senha, a senha do cartão e ainda se deu o trabalho de digitar os 50 dígitos do cartão de segurança, além, obviamente, do número do cartão de segurança. Convenhamos, que com um usuário assim, os hackers mais pé de chinelo, que compraram o “Haqueando” Contas de Banco em duas semanas, conseguem se dar bem.

Mas e o Snowden, pergunta sua tia. Neste momento, caso você queira aproveitar seu domingo é melhor dizer para ela que tudo não passa de teoria da conspiração.

Algum usuário mais crédulo poderá dizer agora, não é verdade que qualquer sistema seja vulnerável. Ele pode até argumentar que não quebraram o código do TrueCrypt do Daniel Dantas, mesmo o FBI não quebrou. É verdade, mas será que o Daniel Dantas é um “high value target” que os americanos vão usar aquele zero-day-exploit especial que estão guardando para pegar um terrorista?

O fato que sabemos é que o código do TrueCrypt, apesar de aberto, ainda não foi totalmente, e está longe de ser, completamente validado contra vulnerabilidades.

Se você quiser saber a razão do buraco ser muito mais embaixo eu tenho algumas sugestões de leitura:

In God we trust

P.S: Depois de ler isto que eu falei, você vai entender porque nem o Serpro nem os Correios, mesmo que não fossem o lodaçal que são, não teriam condições de fazer um e-mail seguro para a Dilma. Eu acredito que nenhuma empresa brasileira tem condições.

Bitcoin

No domingo passado, nos EUA, a série americana The Good Wife teve um episódio que se chamava Bitcoin for Dummies. Não que eu veja novela americana, mas estava passando na sala e minha irmã estava vendo (eita desculpa esfarrapada) e fiquei interessado por este assunto. O episódio é uma discussão jurídica se o Bitcoin é ou não uma moeda e quem inventou o Bitcoin.

The Good Wife - Bitcoin for Dummies - O que é bitcoin?

Se você não sabe ainda o que é um Bitcoin, não se assuste, eu vou tentar explicar e depois passo um vídeo que ilustra como funciona.

A idéia do criador do Bitcoin (BTC), que, aliás, ninguém sabe quem é ao certo, era criar uma moeda, ou mais que isso, uma forma de transação na internet que tivesse as mesmas características do papel moeda, mas sem as desvantagens do papel moeda. Para isso, o BTC teria que respeitar as seguintes propriedades: permitir operações irreversíveis – quando você dá dinheiro a alguém em troca de um bem ou serviço, não tem como pegar o dinheiro de volta, sem ser com roubo ou por vontade do recipiente; além disso, o custo de transferir dinheiro de uma pessoa para outra é praticamente desprezível; o dinheiro gasto com algo não pode voltar a ser gasto com outra coisa. E as transações com dinheiro podem ser anônimas (que o digam os mensaleiros).

Com cartão de crédito pela internet é possível evitar o que se chama de “double spending” que seria gastar duas vezes o mesmo dinheiro, já que a operadora do Cartão garante isto. No entanto, não é possível evitar que a operação seja revertida (sim, em alguns casos o cliente pode estornar uma operação, abusando da boa fé do sistema) e o custo por transação é alto, já que uma entidade precisa supervisionar toda a relação de confiança (VISA, Amex, MasterCard).

Com o BTC, você tem uma carteira virtual de moedas que, ao utilizar para efetuar uma compra, você usa uma criptografia forte passa passar a propriedade desta moeda para a pessoa recipiente e faz isto de forma que toda a rede Bitcoin saiba que você fez a operação. Além disso, a rede Bitcoin é composta de inúmeros computadores que executam tarefas computacionais complexas para validar as transações na rede.

Quanto mais computadores na rede, mais seguro é o processo. E, neste momento, você pode se perguntar: que faz alguma pessoa deixar seu computador calculando para garantir a segurança da rede Bitcoin? A resposta é simples: os computadores que ficam calculando estão mineirando BTC. A cada x quantidade de tarefas que eles executam eles tem uma probabilidade p de ganhar um Bitcoin. Desta forma há um interesse econômico de deixar computadores rodando para garantir a segurança do sistema.

E custa algo tranferir de uma pessoa para outra? Sim, custa 0.0005 BTC e isto mantém o sistema em funcionamento.

Além disso, é possível trocar diversas moedas em BTC e vice versa. Quem sabe o Bitcoin ou algum sistema similar não substitui os cartões de crédito algum dia?

Quem quiser ler o artigo original do autor anônimo sobre o assunto pode ver aqui.

 

Números primos e algoritmos – Parte I

Um dos fundamentos da criptografia e dos sistemas de assinatura digital são os números primos. O princípio que rege a criptografia assimétrica (RSA) é o fato de ser rápido descobrir se um número é primo e é lento fatorar um número.

O RSA fica para outro post, agora queria focar na pergunta: como faz para saber se um número é primo?

int isPrimo (int x) {
   if (x < 4) return 1;
   for (int i=0; i < x; i++) {
      if (x%i == 0) return 0;
   }
   return 1;
}

Obviamente esta função não é a melhor, ela roda em O(n) ou seja o tempo de execução cresce linearmente com o tamanho do número em questão.

Uma otimização que alguns alunos espertos no curso de Computação I fazem é a seguinte:

int isPrimo (int x) {
   if (x < 4) return 1;
   for (int i=0; i =< x/2; i++) {
      if (x%i == 0) return 0;
   }
   return 1;
}

Isto diminui o tempo de execução pela metade mas não muda a complexidade do algoritmo, ela continua sendo O(n). Portanto para números grandes isto não ajuda muito.

Uma coisa que podemos usar para melhorar a complexidade (ainda não ajuda muito, mas hoje paramos por aqui) é o fato de que se um número não tem nenhum divisor menor que a raiz quadrada dele ele não tem nenhum divisor (a prova disto é fácil e fica como exercício para o leitor 🙂 )

int isPrimo (int x) {
   if (x < 4) return 1;
   for (int i=0; i =< sqrt(x); i++) {
      if (x%i == 0) return 0;
   }
   return 1;
}

Neste caso a complexidade que era O(n) passa a ser O(√n)

Melhorou? Sim. Mas ainda não é o suficiente. No próximo capítulo desta série, veremos métodos que dizem se um número é provavelmente primo.

Se você achar algum erro nos códigos acima, comente.

Gerador de Números Aleatórios Humanos

A exploração de fenômenos aleatórios ou” aleatorizadores” ocorre desde a Antiguidade. Achados arqueológicos na região da antiga Mesopotâmia revelaram os dados (de 6 faces, como o que você usa para jogar WAR) mais antigos conhecidos, feitos de barro cozido cerca de 2750 a.C. Ilustrações de jogos como par ou ímpar de cerca de 2000 a.C. também foram encontrados no Egito, em túmulos atribuídos a Beni Hassan.

Além da utilidade para jogos, algumas civilizações como os gregos (vide a Ilíada) também utilizavam os aleatorizadores como uma forma de revelação da vontade divina. É interessante notar que mesmo em nossa cultura, ainda temos uma herança desta concepção, presente nos búzios ou tarô. Mesmo quando algum felizardo ganha o prêmio máximo na loteria, as pessoas pensam “era para ser assim” ou “é porque Deus quis”.

Podemos não perceber, mas cada um de nós convive diariamente com o fenômeno da aleatoriedade. Seja porque o universo possui uma aleatoriedade intrínseca (como afirma a mecânica quântica) ou porque nós humanos não temos acesso a toda informação disponível (e portanto não podemos fazer previsões perfeitas sobre tudo). É bem sabido que computadores não são capazes de gerar números aleatórios. Na realidade, eles geram números pseudo-aleatórios, baseados em regras, ou seja, fórmulas matemáticas. Sabendo a regra, a previsão de todos os números a serem gerados é realizada sem erros. Esta é uma das principais fontes de vulnerabilidade da criptografia (quem quiser ler algo legal que pode levá-lo ao Geek Level 8 compre o livro Silence on the Wire)

Para muitos, os melhores aleatorizadores são baseados em medições de decaimento radioativo ou outros fenômenos físicos.

No entanto, uma pergunta interessante é levantada: e os seres humanos? São aleatórios? De fato, sempre há um fator de imprevisibilidade em qualquer ser humano. Logo, a pergunta mais lógica seria: “Quão aleatórios/previsíveis são os seres humanos?”. Diversos estudos de psicologia cognitiva e até mesmo medicina, mostraram que a geração de sequências aleatórias por seres humanos envolvem funções executivas como memória e atenção. Estudos de neuroimagem funcional chegaram a mostrar o envolvimento dos lobos frontais na execução desta tarefa e outros estudos clínicos mostraram uma menor aleatoriedade (no sentido de maior previsibilidade) das sequência de números geradas por indivíduos com doença de Huntington, Parkinson, Alzheimer ou autismo. Mesmo indivíduos com comprometimento de funções executivas, como um alcoolizado, geram sequências de números mais previsíveis.

Atualmente, há um jogo online, que tem como objetivo quantificar quão aleatórios são os seres humanos, e quais são os principais fatores que influenciam nesta imprevisibilidade.

Contribua com este estudo, participe em:

http://randomicogame.appspot.com