Tirando par ou ímpar pelo Whatsapp
11
Junho
2019
Você está conversando com aquele seu camarada pelo Whatsapp, combinando a jogatina da noite, tentando decidir (sem sucesso) se vão jogar CS ou Minecraft. Você quer jogar CS, e o cara quer jogar Minecraft.
Perdidos 20 minutos de discussão, vocês se dão conta de que seus antepassados já desenvolveram uma solução infalível para resolver esse tipo de impasse:
Par ou ímpar!
Por que não?! E o desenrolar da disputa acontece em seguida:
Você se sente roubado! A mensagem do seu camarada contendo o número 3
demorou muito para chegar,
vários segundos depois que você já tinha mandado a sua. Quem garante que ele não esperou para olhar o seu número 2
antes de responder com o número 3
?
Com certeza ele ganhou na malandragem.
Calma! Esse tipo de problema é bem comum em comunicação assíncrona. Sendo assim, os estudiosos de criptografia já desenvolveram uma solução há algumas decádas.
Apresento, a vocês, o protocolo de commitment (compromisso).
Commitment
Usando conceitos de criptografia, mais especificamente funções de hash, podemos tirar par ou ímpar pelo Whatsapp de forma totalmente justa. O protocolo funciona assim:
- A primeira pessoa envia uma mensagem contendo um commitment, um compromisso, como por exemplo, o hash do número que escolheu. Ela ainda não manda o número escolhido, para evitar que a outra parte consiga roubar, e sim, apenas o hash do número. Para o protocolo ser ainda mais seguro, a mensagem deve ser concatenada junto a um salt aleatório.
- A segunda pessoa manda, em texto cru, o número jogado.
- A primeira pessoa revela o seu número, que pode ser validado pela outra parte por meio do commitment, a partir da mensagem original (incluindo o salt) utilizada para gerar o commitment do primeiro passo.
Par ou ímpar justo pelo Whatsapp
Se você não entendeu 100% o que aconteceu nesse chat, siga comigo.
Quem conhece funções de hash, sabe que é computacionalmente impraticável obter uma colisão. Quem não conhece, vale a pena dar uma estudada, pois essas funções são muito úteis para resolver diversas classes de problemas de sistemas de informação (https://pt.wikipedia.org/wiki/Fun%C3%A7%C3%A3o_hash).
60fa0ee9fb90bb1d
c3cd9f101b53831a
bb2e9c97a714ef1d
27008da5c02fa1dc
df02965b47a7f16d
f96501d749d51180
606f170bc0deec78
8d5f170f326e16b7
Quando eu enviei para o meu camarada um commitment contendo o hash sha512 acima, ele teve a certeza de que eu não conseguiria roubar, pois eu demoraria mais do que a idade do Universo para conseguir adulterar a minha mensagem e obter um hash idêntico.
Nesse hash está a garantia de que eu não roubei no par ou ímpar.
Depois que o meu camarada escolheu o número 5
, eu pude revelar para ele meu número 3
. E ele conseguiu validar
que eu não roubei.
Validação do meu commitment:
echo -n "Número: 3, Salt: Dq2VibypZm7" | sha512sum
Rodando o comando acima no Linux, você vai ter certeza de que eu não roubei!
E se você não está utilizando o Linux, ainda assim pode validar a minha mensagem, utilizando qualquer site que calcula o hash SHA-512 (por exemplo, https://emn178.github.io/online-tools/sha512.html). É só gerar o SHA-512 do seguinte conteúdo:
Número: 3, Salt: Dq2VibypZm7
Problema resolvido. Go go go!