A partir da versão 2026.1.0 o E2EE (End-To-End Encryption) é suportado (apenas para assinantes eSeGeCe All-Access).
A Criptografia de Ponta a Ponta (E2EE) garante que apenas os pares em comunicação possam ler o conteúdo das mensagens trocadas. Nem mesmo o servidor que roteia as mensagens consegue descriptografá-las. Este artigo explica como o E2EE funciona entre dois pares usando criptografia de chave pública para trocar mensagens com segurança.
E2EE explicado
Princípios fundamentais do E2EE
Em um sistema E2EE com dois pares:
- Cada par possui uma chave privada que nunca sai do seu dispositivo.
- Cada par publica uma chave pública que outros podem ver.
- As mensagens são criptografadas no dispositivo do remetente e descriptografadas apenas no dispositivo do destinatário.
- O servidor atua apenas como um retransmissor de mensagens, não como uma parte confiável.
Visão geral do material de chaves
Cada par (por exemplo, Alice e Bob) tem:
- Chave privada
Um valor secreto armazenado localmente. Nunca deve ser compartilhada. - Chave pública
Um valor derivado da chave privada. Pode ser compartilhada livremente.
As chaves pública e privada são matematicamente vinculadas, mas conhecer a chave pública não revela a chave privada.
Passo 1: troca de chaves públicas
Antes que a comunicação criptografada possa ocorrer, Alice e Bob precisam conhecer as chaves públicas um do outro.
Abordagens típicas:
- O servidor armazena chaves públicas e as entrega sob solicitação.
- As chaves públicas são trocadas durante a criação da conta ou no primeiro contato.
Essa troca não compromete a segurança, porque as chaves públicas não são secretas.
Passo 2: estabelecendo um segredo compartilhado (ECDH)
Para criptografar mensagens de forma eficiente, Alice e Bob primeiro derivam um segredo compartilhado usando Elliptic Curve Diffie–Hellman (ECDH).
Como o ECDH funciona conceitualmente- Alice calcula um segredo compartilhado usando:
- A chave privada dela
- A chave pública de Bob
- Bob calcula um segredo compartilhado usando:
- A chave privada dele
- A chave pública de Alice
Por causa das propriedades matemáticas das curvas elípticas, ambos os cálculos produzem o mesmo valor secreto, mesmo que nenhum dos lados transmita esse segredo.
Em nenhum momento o segredo compartilhado é enviado pela rede.
Passo 3: derivando uma chave de criptografia simétrica
O segredo compartilhado ECDH bruto não é usado diretamente para criptografia. Em vez disso, ele é processado por uma Key Derivation Function (KDF), normalmente um hash criptográfico como o SHA-256.
Finalidade da derivação de chave:
- Produzir uma chave do tamanho correto (por exemplo, 32 bytes para AES-256)
- Remover viés estrutural da saída ECDH bruta
- Melhorar a robustez criptográfica
O resultado é uma chave de criptografia simétrica conhecida apenas por Alice e Bob.
Passo 4: criptografando a mensagem
Quando Alice quer enviar uma mensagem para Bob:
- Alice converte a mensagem em bytes.
- Alice criptografa a mensagem usando uma cifra simétrica (geralmente AES-GCM) com:
- A chave simétrica derivada
- Um vetor de inicialização (IV) aleatório
- Alice envia a mensagem criptografada e o IV para Bob por meio do servidor.
O AES-GCM é comumente usado porque fornece:
- Confidencialidade (criptografia)
- Integridade (detecção de adulteração)
- Autenticação (detecta mensagens forjadas)
Passo 5: descriptografando a mensagem
Quando Bob recebe a mensagem criptografada:
- Bob deriva independentemente a mesma chave simétrica usando ECDH e a mesma KDF.
- Bob descriptografa a mensagem usando a chave simétrica e o IV.
- Se a autenticação for bem-sucedida, Bob obtém o plaintext original.
Se a mensagem tiver sido alterada ou a chave errada for usada, a descriptografia falha.
Papel do servidor
Nessa arquitetura, o servidor:
- Entrega chaves públicas
- Roteia mensagens criptografadas
- Gerencia presença ou metadados de usuários
O servidor não pode:
- Derivar segredos compartilhados
- Descriptografar mensagens
- Forjar mensagens criptografadas válidas
Essa é a propriedade definidora da Criptografia de Ponta a Ponta.
Resumo
A Criptografia de Ponta a Ponta entre dois pares funciona combinando:
- Criptografia de chave pública (para acordo de chave)
- Criptografia simétrica (para criptografia eficiente de mensagens)
- Funções de derivação de chave (para segurança e correção)
O resultado é um sistema em que:
- Apenas os pares podem ler as mensagens
- O servidor é reduzido a um papel de transporte
- A privacidade é preservada por design, não por política
Esse modelo é a espinha dorsal criptográfica dos sistemas modernos de mensageria segura.
Exemplo de E2EE
// ... Cria o Servidor
WSServer := TsgcWebSocketHTTPServer.Create(nil);
WSServer.Port := 80;
WSPE2EE := TsgcWSPServer_E2EE.Create(nil);
WSPE2EE.Server := WSServer;
WSServer.Active := True;
// ... Cria 2 clientes
WSClient1 := TsgcWebSocketClient.Create(nil);
WSClient1.Host := '127.0.0.1';
WSClient1.Port := 80;
E2EE1 := TsgcWSPClient_E2EE.Create(nil);
E2EE1.Client := WSClient1;
E2EE1.E2EE_Otpions.UserId := 'client-1';
WSClient1.Active := True;
WSClient2 := TsgcWebSocketClient.Create(nil);
WSClient2.Host := '127.0.0.1';
WSClient2.Port := 80;
E2EE2 := TsgcWSPClient_E2EE.Create(nil);
E2EE2.OnE2EEMessageText := OnE2EEMessageTextEvent;
E2EE2.E2EE_Otpions.UserId := 'client-2';
E2EE2.Client := WSClient2;
WSClient2.Active := True;
// ... client-1 envia uma mensagem para client-2
E2EE1.SendDirectMessage('client-2', 'Hello Client-2');
// ... lê a mensagem no evento OnE2EEMessageText
procedure OnE2EEMessageText(Sender: TObject; const aFrom, aText: string);
begin
DoLog('#direct_message: ' + aText);
end;
