Como funciona

Como o Crocodile mantém as suas conversas suas

Uma visita à arquitetura e ao protocolo em palavras simples. Cada capítulo começa pela ideia; abra “Por dentro” para ver os pormenores técnicos.

Capítulo 1

Quatro tipos de intervenientes

O Crocodile divide o trabalho de forma a que só as pessoas com quem fala vejam as suas palavras, e as partes geridas por desconhecidos nunca as vejam.

A sua app

Guarda as suas chaves, criptografa tudo o que envia e decifra o que recebe. O seu histórico de mensagens vive aqui e em mais lado nenhum.

Sabe: Tudo o que envia e recebe: é seu.

O anfitrião

Em cada sala de voz ou espaço, a app de um membro é escolhida para passar o tráfego criptografado aos outros. É um membro como qualquer outro.

Sabe: Os endereços IP dos membros e quem fala, nunca o que é dito.

Servidores de coordenação

Centrais mantidas por voluntários: guardam perfis e espaços, dizem quem está online e escolhem anfitriões. Ligam-se numa única rede.

Sabe: Perfis, adesões e quem está online, nunca o que é dito.

O diretório

Uma lista telefónica de servidores de coordenação, para que as apps novas saibam por onde começar. Não sabe nada sobre pessoas.

Sabe: Só a lista de servidores.

Capítulo 2

A sua conta é uma chave, não uma senha

Quando instala o Crocodile, a sua app cria no seu computador um segredo aleatório com 32 bytes. Dele saem duas chaves: uma para assinar o que publica e outra para receber mensagens criptografadas. O seu ID é uma impressão digital da chave de assinatura.

Como o ID é calculado a partir da chave, um servidor não consegue trocar a chave e fazer-se passar por si. Não há senha para roubar nem redefinição com que enganar um serviço de apoio. O segredo é-lhe mostrado uma vez como chave de recuperação e fica nos seus dispositivos, criptografado com o porta-chaves do sistema.

Por dentro
  • A semente de 32 bytes gera uma chave de assinatura Ed25519 e uma chave de criptografia X25519. O ID são os primeiros 26 caracteres de base32(SHA-256(chave pública de assinatura)).
  • Cada dispositivo publica um registo de dispositivo assinado com um pacote de pré-chaves (X25519 + ML-KEM-768) que muda todas as semanas. Os segredos de pré-chaves antigos são apagados após um período de tolerância.
  • Os números de segurança permitem que duas pessoas comparem chaves por outro canal, como noutras apps de mensagens seguras.
  • Os dados locais (identidade, pré-chaves, histórico) são guardados criptografados com uma chave protegida pelo porta-chaves do sistema operativo.

Capítulo 3

Encontrar o servidor mais rápido

A sua app descarrega do diretório a lista de servidores de coordenação, mede quanto tempo cada um demora a responder e liga-se ao mais rápido. O segundo fica de reserva, por isso, se o seu servidor desaparecer, a app muda de imediato.

Antes de mais nada, o servidor prova quem é, e a app e o servidor combinam chaves para essa ligação. A partir daí, até os metadados que trocam vão criptografados, além do HTTPS, por isso também funciona com segurança num servidor caseiro.

Por dentro
  • O diretório lista cada servidor assinado por esse mesmo servidor, com o endereço ofuscado. As apps verificam a assinatura antes de usar uma entrada.
  • A saudação assinada do servidor traz uma nova oferta de troca de chaves híbrida (X25519 + ML-KEM-768). A app verifica-a com a chave do diretório, responde e assina a transcrição. Cada trama seguinte é criptografada com AES-256-GCM e leva preenchimento.
  • Os servidores também respondem a STUN em duas portas, por isso as apps descobrem o seu endereço público e o tipo de NAT sem perguntar à Google nem à Cloudflare.

Capítulo 4

Servidores que não podem mentir sobre si

O seu perfil, os espaços que cria, os respetivos convites e quem é membro são pequenos registos assinados por quem os escreveu. Os servidores guardam-nos e partilham-nos, e cada servidor e cada app verifica as assinaturas. Um servidor pode recusar-se a passar um registo, mas não o pode alterar nem inventar.

Os servidores de coordenação encontram-se uns aos outros e formam uma rede. Cada registo é guardado por alguns servidores escolhidos por um hash, que copiam as alterações entre si, por isso a rede continua a funcionar quando um servidor cai.

Por dentro
  • Registos: perfil, lista de amigos selada, espaço, convite, membro, dispositivo e nota. Cada um tem um autor que o pode escrever; a validação (assinatura, autoridade, versão “ganha o último a escrever”) é idêntica nos servidores e nos clientes.
  • As listas de amigos são criptografadas apenas para os dispositivos do dono, e os pedidos de amizade viajam como notas seladas que não dizem quem as enviou, por isso os servidores não sabem quem é amigo de quem.
  • Cada registo pertence aos primeiros servidores de um anel de hash consistente para o seu fragmento. Os donos replicam as escritas, põem-se a par com cursores de sequência e passam os registos quando entram ou saem servidores.

Capítulo 5

Um amigo é anfitrião, um substituto espera

Quando as pessoas entram numa sala de voz ou abrem um espaço, o servidor de coordenação analisa a ligação de todos (quão aberta é a rede, a velocidade de envio, o computador, se está a usar bateria) e escolhe como anfitrião o membro em melhor posição. O seguinte é o substituto.

Todos se ligam à app do anfitrião, que passa o áudio criptografado. Para não sobrecarregar a ligação, envia a cada ouvinte só as poucas pessoas que falam mais alto. Nunca tem o áudio às claras: limita-se a mover pacotes selados.

Se o anfitrião sair ou deixar de estar acessível, o substituto assume e todos se voltam a ligar a ele, normalmente antes de alguém dar por isso.

Por dentro
  • O anfitrião executa na sua app uma pequena SFU (selective forwarding unit). Cada membro abre uma ligação WebRTC para ela, com uma faixa de áudio de envio, cinco espaços de receção para quem fala e um canal de dados.
  • Os espaços são atribuídos pelo cabeçalho de nível de áudio RFC 6464 (“last-N”), com os números de sequência reescritos para que cada espaço continue a ser um fluxo contínuo.
  • Ofertas e respostas são assinadas com chaves de identidade sobre a sessão, a época, os dois IDs e a impressão digital DTLS, por isso um servidor de coordenação não se consegue meter no meio.
  • Cada mudança de anfitrião aumenta um número de época; as ofertas antigas são ignoradas. Os membros que não chegam ao anfitrião comunicam-no e, assim que metade concorda, o substituto assume.

Capítulo 6

Criptografia em camadas

Tudo é criptografado no seu dispositivo antes de sair, e só as pessoas da conversa têm as chaves. Eis o que acontece a uma mensagem pelo caminho.

Uma mensagem, quatro camadas

A sua app assina a mensagem para que os outros possam provar que veio de si, acrescenta-lhe preenchimento para que o tamanho não revele nada, criptografa-a com uma chave que só os membros da conversa têm e envia-a por uma ligação que também é criptografada. Quem estiver pelo meio só vê bytes baralhados de tamanho padrão.

Pronto para os computadores quânticos

As chaves são trocadas com um híbrido de X25519, um método clássico comprovado, e ML-KEM-768, o novo padrão pós-quântico. Um atacante teria de quebrar os dois. Isto importa porque alguém pode gravar hoje tráfego criptografado e esperar que um computador quântico o decifre.

Chaves que avançam

A chave de cada membro roda como uma catraca: depois de cada mensagem é substituída pela seguinte numa cadeia que só anda para a frente, e a antiga é apagada. Quem roubar uma chave hoje não consegue ler as mensagens de ontem. A cada 30 minutos, e sempre que alguém sai, todos começam uma cadeia nova com chaves aleatórias novas, por isso uma chave roubada também deixa de servir em pouco tempo.

A voz, trama a trama

A sua voz é criptografada em pequenas tramas, cerca de cinquenta por segundo, logo a seguir ao microfone e antes de chegar à rede. Uma trama que não possa ser criptografada é descartada, nunca enviada às claras. A voz usa uma taxa de bits constante, por isso o tamanho dos pacotes não revela o que diz.

Por dentro
  • Os segredos entre pares (distribuição de chaves de remetente, sincronização do histórico, ligação de dispositivos, canais com servidores) combinam X25519 e ML-KEM-768 (FIPS 203) através de HKDF-SHA256.
  • As chaves de remetente têm duas cadeias HKDF: a de texto avança depois de cada mensagem e a de áudio a cada 30 segundos. As chaves são substituídas a cada 30 minutos e quando alguém sai, e só são enviadas para dispositivos cuja adesão a própria app verificou a partir de registos assinados.
  • Voz: um worker de Encoded Transform criptografa cada trama Opus com AES-256-GCM e um sufixo autenticado ao estilo SFrame (ID da chave, geração, contador).
  • Texto: assinado pelo autor (Ed25519), com preenchimento Padmé e criptografado com a cadeia de texto.
  • As caixas seladas para um dispositivo usam a sua pré-chave atual e são assinadas pelo remetente, por isso até as mensagens para dispositivos offline têm sigilo futuro.

Capítulo 7

Quando não é possível uma ligação direta

Algumas redes, como as firewalls rigorosas de empresas ou universidades, bloqueiam as ligações diretas entre computadores. O Crocodile avisa quando isso acontece, e pode deixar que um servidor de coordenação reencaminhe o seu tráfego.

O relay passa pacotes que já estão criptografados de ponta a ponta: vê o tamanho e o ritmo, mas não o conteúdo. A autorização dura uma hora de cada vez e só é renovada enquanto ainda for precisa.

Por dentro
  • O relay é TURN padrão (RFC 5766) na porta UDP do servidor de coordenação, com credenciais de curta duração. Os servidores limitam quantas pessoas o podem usar.
  • Ao ligar-se, a app testa a sua rede contra duas portas STUN, classifica-a como aberta, limitada (NAT simétrico) ou bloqueada e sugere o relay quando é preciso.
  • Cada ligação regista quatro passos (oferta, resposta, caminho de rede, canal criptografado), por isso, quando algo falha, a app consegue dizer onde.

Capítulo 8

Mensagens que encontram o caminho

Nenhum servidor guarda o seu histórico, por isso as apps do Crocodile passam as mensagens umas às outras. Eis o que acontece quando escreve a alguém que está offline.

  1. Espera consigo

    A mensagem entra na caixa de saída da sua app e mostra um pequeno relógio.

  2. O seu amigo fica online

    Assim que os dois estão online, a sua app entrega-a, selada para o dispositivo dele.

  3. Confirmado

    A app dele confirma a receção e o relógio desaparece. Os membros que perderam mensagens num espaço recuperam-nas junto do anfitrião e do substituto.

  4. Ou use a caixa de correio

    Opcionalmente, um servidor guarda as mensagens diretas até 7 dias, seladas para cada dispositivo para que não as possa ler, e apaga-as depois de entregues.

Capítulo 9

Adicionar um computador

O seu computador novo mostra um código curto. Escreva-o num computador onde já tem sessão iniciada e confirme que os dois mostram o mesmo código de segurança de seis dígitos. Se coincidirem, a sua conta é enviada criptografada e o novo dispositivo fica pronto.

O código de segurança abrange as chaves dos dois dispositivos, por isso, se alguém tentasse trocar uma pelo caminho, os códigos seriam diferentes e saberia.

Glossário

Os termos que vai encontrar em textos sobre segurança, numa ou duas frases cada.

Criptografia de ponta a ponta
Só o remetente e os destinatários têm as chaves. O que transportar a mensagem pelo meio, incluindo servidores, só vê dados baralhados.
Peer-to-peer
As apps ligam-se diretamente umas às outras em vez de passarem por um servidor central.
Criptografia pós-quântica
Criptografia pensada para resistir aos futuros computadores quânticos, que poderiam quebrar os métodos que a maior parte da internet usa hoje. O ML-KEM é o padrão publicado pelo NIST em 2024.
Sigilo futuro (forward secrecy)
Roubar uma chave hoje não abre mensagens antigas, porque as chaves usadas nelas foram apagadas.
Segurança pós-comprometimento
Depois de uma chave ser roubada, chaves aleatórias novas voltam a deixar o ladrão de fora em pouco tempo. No Crocodile isso acontece em menos de 30 minutos, ou de imediato quando alguém sai.
Assinatura digital
Um selo matemático feito com uma chave privada. Qualquer pessoa o pode verificar com a chave pública, e ninguém sem a chave privada o consegue falsificar.
NAT, STUN e TURN
Os routers domésticos escondem os computadores atrás de um único endereço público (NAT). O STUN ajuda as apps a descobrir o seu endereço público para se ligarem diretamente; o TURN reencaminha o tráfego quando não conseguem.
SFU
Uma selective forwarding unit passa o áudio de cada pessoa que fala para cada ouvinte sem o misturar nem descodificar. No Crocodile, corre na app do anfitrião.
Metadados
Dados sobre uma conversa em vez do seu conteúdo: quem fala com quem, quando e quanto. O Crocodile criptografa o conteúdo por completo e reduz os metadados, mas os servidores ainda veem alguns.

Ler o documento de arquitetura completo (em inglês)